Действительно ли интерпретаторы предварительно компилируются в памяти?

StackOverflow https://stackoverflow.com/questions/620358

Вопрос

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

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

Единственное, что я не могу понять, так это то, что если бы я был прямым интерпретатором, а не компилятором, он бы все равно создавал эти промежуточные команды в памяти для выполнения в конце.Или интерпретатор на самом деле «исполняет» отдельные участки кода за раз?

Это было полезно?

Решение

Парсеры не компилируются. На самом деле при переводе программы нужно выполнить несколько шагов (от языка высокого уровня, такого как C ++, до машинного кода). Это зависит от дизайна, если он выполняется за один раз или после нескольких проходов по входу. Можете ли вы сделать свой вопрос более конкретным? Между тем, как бы вы его ни ненавидели, посмотрите здесь - особенно разделы о фронтэнде и бэкенде .

Другие советы

Это зависит от языка. Большинство современных интерпретируемых языков (Perl, Python и Ruby и многие другие) предварительно компилируют исходный код в некоторую промежуточную форму, которая будет выполнена в конце ( цитата ).

Я писал или работал с интерпретаторами, которые действуют непосредственно на анализ токенов на входе, которые воздействуют непосредственно на дерево абстрактного синтаксиса (AST), построенное синтаксическим анализатором, и которые переводят AST в форму, предназначенную для эффективного выполнения.Итак, ответ таков: это зависит.

  • Если ваша целевая машина имеет 8 КБ ОЗУ, разумным выбором будет интерпретатор прямого анализа (подумайте FORTH).
  • Если вы используете интерпретаторы для обучения или изучения структуры и семантики языков программирования, создание и интерпретация AST — хороший выбор.
  • Если вы используете интерпретатор для переносимости и хотите быстрого выполнения, хорошим выбором будет компиляция в виртуальную машину на основе регистров.(Дэвид Грегг и другие показали, что в виртуальных машинах на основе регистров, таких как Луа VM, чем в виртуальной машине на основе стека, такой как виртуальная машина Java.)

Большинство современных интерпретаторов анализируют программу для промежуточного кода, который позже интерпретируется. Некоторые хранят этот промежуточный код явно (например, Python's .pyc ). Есть исключения, например, сценарии оболочки интерпретируются напрямую, а не анализируются в промежуточном формате.

Более продвинутые " интерпретаторы " на самом деле не интерпретирует, а выполняет компиляцию JIT (точно в срок) (например, Java или .NET).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top