Среда выполнения .NET всегда компилирует код JIT перед выполнением. Таким образом, это никогда не интерпретируется.
Я читал, что Microsoft решила, что IL всегда будет компилироваться, а не интерпретироваться. Как информация о типах кодирования в инструкциях помогает переводчикам работать более эффективно?
Андерс Хейлсберг: Если переводчик может просто слепо делать то, что говорится в инструкциях, без необходимости отслеживать, что находится наверху стека, он может идти быстрее. Например, когда он видит iadd, интерпретатору не нужно сначала выяснять, какой тип добавления он добавляет, он знает, что это целочисленное добавление. Предполагая, что кто-то уже проверил, что стек выглядит правильно, можно безопасно сократить время, и вы заботитесь об этом для переводчика. В нашем случае, однако, мы никогда не намеревались нацеливать интерпретируемый сценарий на CLR. Мы намеревались всегда JIT [Компиляция точно в срок], и для целей JIT нам все равно нужно было отслеживать информацию о типе. Поскольку у нас уже есть информация о типе, на самом деле нам ничего не нужно вкладывать в инструкции.
Билл Веннерс: Многие современные JVM [виртуальные машины Java] проводят адаптивную оптимизацию, где они начинают с интерпретации байт-кодов. Они профилируют приложение во время его выполнения, чтобы найти от 10% до 20% кода, который выполняется от 80% до 90% времени, а затем компилируют его в native. Тем не менее, они не обязательно вовремя компилируют эти байт-коды. Байт-коды метода могут все еще выполняться интерпретатором, поскольку они компилируются в нативный и оптимизируются в фоновом режиме. Когда нативный код готов, он может заменить байт-коды. Не нацеливаясь на интерпретируемый сценарий, полностью ли вы исключили такой подход к выполнению в CLR?
Андерс Хейлсберг: Нет, мы не полностью исключили это. Мы все еще можем интерпретировать. Мы просто не оптимизированы для интерпретации. Мы не оптимизированы для написания того самого высокопроизводительного интерпретатора, который будет интерпретировать только когда-либо. Я не думаю, что кто-то делает это больше. Для приставки 10 лет назад это могло бы быть интересно. Но это уже не интересно. Технологии JIT дошли до того, что вы можете иметь несколько возможных стратегий JIT. Вы даже можете представить себе использование быстрого JIT, который просто быстро разрывается, а затем, когда мы обнаруживаем, что мы выполняем определенный метод все время, используя другой JIT, который тратит немного больше времени и лучше оптимизирует работу. Вы можете сделать гораздо больше в JIT.