Слишком много семантики и утверждений, основанных на мнении.
Прежде всего: C # не является интерпретируемым языком; CLR и JVM считаются средой выполнения или промежуточным программным обеспечением, но одно и то же имя относится к таким вещам, как Perl. Это создает путаницу среди людей, связанных с именами.
Термин «Интерпретатор», ссылающийся на среду выполнения, обычно означает, что существующий код интерпретирует некоторый не родной код. Существует две большие парадигмы: парсинг читает исходный код и выполняет логические действия; Выполнение байт-кода сначала компилирует код в ненативное двоичное представление, для интерпретации которого требуется гораздо меньше циклов ЦП.
Java изначально скомпилирована в байт-код, затем прошла через интерпретатор; теперь JVM читает байт-код и как раз вовремя компилирует его в нативный код. CIL делает то же самое: CLR использует своевременную компиляцию для собственного кода.
Рассмотрим все комбинации запуска исходного кода, запуска байт-кода, компиляции в нативную компиляцию, выполняемую точно в срок, запуска исходного кода через компилятор для нативного точного выполнения и так далее. Семантика того, является ли язык компилируемым или интерпретируемым, теряет смысл.
В качестве примера: во многих интерпретируемых языках используется своевременная компиляция байт-кода. C # компилируется в CIL, который JIT компилирует в native; напротив, Perl немедленно компилирует скрипт в байт-код, а затем запускает этот байт-код через интерпретатор. Вы можете запустить сборку C # только в формате байт-кода CIL; Вы можете запускать только Perl-скрипт в формате исходного кода.
Компиляторы точно вовремя также запускают множество внешних и внутренних контрольно-измерительных приборов. Среда выполнения отслеживает выполнение различных функций, а затем корректирует компоновку кода, чтобы оптимизировать ветви и организацию кода для его конкретного потока выполнения. Это означает, что JIT-код может выполняться быстрее, чем собственный скомпилированный код (как, например, C ++ или C #, запускаемый через IL2CPP), потому что JIT корректирует свою стратегию оптимизации в соответствии с фактическим случаем выполнения кода при его запуске.
Добро пожаловать в мир компьютерного программирования. Мы решили сделать его чрезвычайно сложным, а затем добавить неописательные имена ко всему. Цель состоит в том, чтобы создать пламенные войны по определению слов, которые не имеют практического значения.