Действительно ли интерпретаторы предварительно компилируются в памяти? - PullRequest
3 голосов
/ 06 марта 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 06 марта 2009

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

3 голосов
/ 07 марта 2009

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

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

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

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

1 голос
/ 06 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...