Как работают интерпретаторы компилирующего типа?

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

2) Компиляторы - сразу компилируют команды на языке высокого уровня в двоичный код.
При запуске программы эта программа (двоичный код) будет выполнен процессором.

3) Интерпретатор компилирующего типа - компилирует команды на языке высокого уровня в байт код.
Байт код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт код в двоичный код.

Всё верно?
Вопрос в том - работают интерпретаторы компилирующего типа?
Откомпилировал все команды на языке высокого уровня (программу целиком) в байт код. И потом откомпилировал байт код в двоичный код и запустил программу.

Или построчно? Откомпилировал строку из команд на языке высокого уровня, получил "строку" с байт кодом и запустил её?

Или откомпилировал все команды на языке высокого уровня (программу целиком) в байт код. А потом построчно компилируем/запускаем этот байт код?
  • Вопрос задан
  • 1352 просмотра
Пригласить эксперта
Ответы на вопрос 6
@Mercury13
Программист на «си с крестами» и не только
1) То есть считал строку, скомпилировал - получил двоичный код. Выполнил этот двоичный код.

НЕТ. Считал — выполнил. Выполняется машинный код интерпретатора, а не программы.

3) Байт-код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт-код в двоичный код

В ЧИСТОМ СЛУЧАЕ — НЕТ. Считал команду байт-кода — выполнил. Точно так же выполняется машинный код интерпретатора, а не программы. Что-то вроде:
switch (opcode) {
case OP_ADD: {
       auto res = stack.pop() + stack.pop();
       stack.push(res);
   }
.....
}


Байт-код используется по нескольким причинам.
1. 3 быстрее 1.
2. С расширением языка мы меняем только компиляцию в байт-код. Оптимизация байт-кода, интерпретатор — остаются.

А компиляция в машинный код в 1 и 3 — это так называемая JIT-компиляция. Она может выполняться не всегда. Одни команды могут быть в машинном коде, а другие — интерпретироваться.

Кроме того, байт-код часто используется и в классических компиляторах 2-го типа! Это позволяет делать многоплатформенные коллекции компиляторов — все frontend’ы компилируют в байт-код, затем с байт-кодом делаем какую-то магию вроде оптимизации, отдаём его backend’у, и тот готовит OBJ-файл для нужного процессора.
Ответ написан
Комментировать
Jump
@Jump
Системный администратор со стажем.
Вы как то неверно представляете себе что такое компиляция, отсюда все вопросы.

Компиляция это по факту перевод программы с языка высокого уровня на язык понятный машине.
  • Берем программу целиком, прочитали, проанализировали, и перевели ее целиком в машинный код. Это компиляция.
  • Берем одну инструкцию, переводим ее в машинный код, и выполняем это интерпретация


Компиляторы - сразу компилируют команды на языке высокого уровня в двоичный код.
При запуске программы эта программа (двоичный код) будет выполнен процессором.
Не сразу. Компиляторы читают программу, анализируют, и создают программу выполняющую эти же действия но уже в машинном коде.

Если по простому у вас есть инструкция по ремонту двигателя.
  • Вы можете прочитать инструкцию, проанализировать ее, понять какие материалы, запчасти понадобятся, возможно оптимизировать какие-то действия и составить план действий по ремонту. Это и есть компиляция.
  • Но вы можете прочитать первую строку инструкции где написано - снимите двигатель. Выполнить ее, после чего перейти к чтению второй строки инструкции. Это интерпретация.


1) Интерпретаторы - считывают команды на языке высокого уровня построчно и построчно их выполняют.
То есть считал строку, скомпилировал - получил двоичный код. Выполнил этот двоичный код.
Идет поочередное выполнение команд . Прочитал инструкцию на языке программирования, и перевел ее в машинный код и выполнил. Никакой компиляции. Для компиляции нужно прочитать всю программу.
Результат работы компилятора - программа на другом языке.
Результат работы интерпретатора - выполненная инструкция
Разницу замечаете?
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Всё верно?
Нет.
"3" Виртуальная машина выполняет байт-код, как подпрограмму, запоминая стек, переменные и пр. окружения. Никакой компиляции.
Разделитель строк — частый разделитель команд языка, но не единственный.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
в java вообще не запускается интерпретатор команд высокого уровня.
Сперва при помощи компилятора javac вы компилируете текст (file.java) в байт-код (file.class), и объединяет все байт-коды в исполняемый файл (file.jar), а потом уже джава рантайм (виртуальная машина) выполняет пакет с байт-кодом (файл.jar)
Ответ написан
samodum
@samodum
Какой вопрос - такой и ответ
В .NET исполнением байт-кода занимается CLR.
В JAVA эту задачу решает JVM
Ответ написан
Комментировать
3) Интерпретатор компилирующего типа - компилирует команды на языке высокого уровня в байт код.
Байт код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт код в двоичный код.

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

При этом интерпретатор байткода ничего не знает об исходном коде.

Тоесть схема такая:
1. Берём исходный код (.java) и компилируем его при помощи компилятора (javac) в байткод (.jar)
2. Запускаем интерпретатор (javav) и передаём ему байтеод (.jar). Интерпретатор обрабатывает команды поштучно

Между первым и вторым шагом может пройти сколько угодно времени, и вместо интерпретатора может быть компилятор байткода в машинный код, а в сам интерпретатор может быть встроен jit компилятор, а может и нет (а может быть выключен)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы