Давайте сначала проясним, что языки программирования не интерпретируются и не компилируются, разница заключается в том, как они обрабатываются. Интерпретация и компиляция — это всего лишь способы сделать человекочитаемый язык машиночитаемым.

Компьютеры понимают бинарные 0 и 1. только это. Голос нулей и единиц, который (только) могут понять компьютеры, называется машинным языком.

Считая компьютерное понимание нижним этажом, поднимаясь на 1 ступеньку выше, мы приходим к языку мнемоники и инструкций, которые напрямую связаны с земным уровнем. Этот шаг представляет собой язык ассемблера.

Теперь сделайте еще один шаг вперед. Или два. Они называются языками высокого уровня. Потребность в том, что, проще говоря, люди ленивы. Они хотят, чтобы все было как можно проще. Для наших сверхленивых людей (без сарказма) написание на ассемблере слишком утомительно, к тому же подвержено ошибкам. Двигаясь дальше по нашей лестнице, мы попадаем в фреймворки и библиотеки, которые созданы на основе языков высокого уровня, чтобы сделать жизнь наших дорогих людей еще проще.

К языкам высокого уровня относятся c++, python, javascript. фреймворки/библиотеки включают django (python), nodejs, meteojs (javascript).

Код, написанный на языках высокого уровня — исходный код. Код языка Machile - машинный код.

Постараемся максимально упростить — война (только в уме) между компилятором и интерпретатором.

КОМПИЛЕР: преобразователь/переводчик

INTERPRETOR: исполнительный механизм.

- - - - - - - - - - - - - - - -период.

КОМПИЛЬРЫ

Компиляторы не делают ничего, кроме перевода кода с одного языка на другой. Исходный язык может быть или не быть языком высокого уровня, а место назначения может быть или не быть исполняемым. Не имеет значения. Просто переводится.

Если трансляция из HLL в LLL, это называется компилятором, иначе декомпилятором, для обратного случая. В любом случае, это просто перевод. Не запускается, не запускается, ничего.

Взяв пример того, как работает C++. При передаче через компилятор g++ генерируется исполняемый файл a.out. Итак, исходный язык — C++ (высокий уровень), а целевой — .out (машинный код). Но так было не всегда.

Раньше язык C компилировался как

Исходный код C → компилятор → код языка ассемблера → ассемблер → исполняемый файл.

И более ранний код C++ преобразовывался в код C для создания исполняемого файла.

Исходный код C++ → компилятор → код C → (выше повторения процесса) → исполняемый файл.

Только что увидел, что компиляторы - это всего лишь переводчики. Компиляторы не берут на себя ответственность за запуск исполняемого файла. Это зависит от пользователя, исполняемые файлы должны запускаться отдельно для взаимодействия i/p → o/p.

Хватит компилятора... теперь очередь прояснить ситуацию для интерпретаторов.

ПЕРЕВОДЧИКИ

Интерпретаторы берут на себя ответственность за выполнение программы. Они берут входной код и выполняют его, не создавая никакого промежуточного файла. Они не переводят код во что-то другое, они просто запускают его.

Интерпретаторы могут выполнять строку за строкой напрямую или могут сначала сканировать весь входной код для внутреннего преобразования в промежуточный код с использованием внутренних структур данных (называемых p-кодом), а затем выполнять этот p-код построчно.

Возьмем пример интерпретируемой компиляции исходного кода javascript, который выполняется напрямую, строка за строкой, и мы предоставляем входные данные на ходу. Никаких посреднических действий.

Современные браузеры теперь предоставляют JIT (компиляцию во время), а компилируют в байт-код javascript непосредственно перед выполнением.

ВОЗВРАЩЕНИЕ В JAVA...

Вот и вся история географии компиляторов и интерпретаторов, но мы так и не ответили на вопрос. Java интерпретируется или компилируется?

Ответ: ни то, ни другое. Java — классический пример каскадной обработки или того, как интерпретаторы и компиляторы могут работать вместе рука об руку.

Обработка исходного кода JAVA-

  1. компилятор переводит исходный код Java в байт-код.
  2. JVM позаботится об этом байт-коде. Байт-код, созданный на предыдущем шаге, передается через интерпретатор JVM, который выполняет этот байт-код и запускает программу. Или он может быть скомпилирован JIT. Выбор JVM!

Таким образом, JAVA обрабатывается в два этапа: сначала компиляция, затем интерпретация (или JIT-компиляция).

Воздух очищен!

Lil более ясно, теперь это должно быть. Сомнения могут сохраняться, я обновлю это, как только найду лучшее объяснение.

Но не забывайте, что компиляция и интерпретация — это просто способы обработки HLL. C++ можно интерпретировать, Python можно компилировать, почему бы и нет! Нет стандартного утверждения, что один язык компилируется/интерпретируется. Это всего лишь интерпретации.

тада!