Это промежуточное представление? - PullRequest
0 голосов
/ 06 октября 2018

Я смотрю, как работает компилятор v8.Я прочитал статью, в которой говорится, что исходный код маркируется, анализируется, создается AST, затем генерируется байт-код (https://medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775)

Является ли этот байт-код промежуточным представлением?

1 Ответ

0 голосов
/ 06 октября 2018

Краткий ответ: Нет. Обычно люди используют термины "байт-код" и "промежуточное представление", чтобы обозначать две разные вещи.

Длинный ответ: Это зависит от вашего определения (но для большинства определений ")нет «все еще правильный ответ».

«Байт-код» в виртуальных машинах, таких как V8, относится к представлению, используемому в качестве входных данных для интерпретатора.Статья, на которую вы ссылаетесь, дает хорошее описание.

«Промежуточное представление» или IR обычно относится к данным, которые компилятор использует внутри, в качестве промежуточного шага (отсюда и название) между входными данными (обычно AST = abstractсинтаксическое дерево, т.е. проанализированная версия исходного текста) и его вывод (обычно это машинный код или байт-код, но это может быть что угодно, как в компиляторе исходного кода).

Так в традиционной установке, у вас есть:

source - (синтаксический анализатор) -> AST - (клиентская часть компилятора) -> IR - (серверная часть компилятора) -> машинный код

где IR обычно модифицируется несколько раз, так как компилятор выполняет различные оптимизации для него, прежде чем, наконец, генерировать из него машинный код.Также может быть несколько разных IR;Например, ранее оптимизирующий компилятор V8 («Коленчатый вал») имел два: высокоуровневый ИК «Водород» и низкоуровневый ИК «Литий», тогда как текущий оптимизирующий компилятор V8 («Турбофан») даже имеет три: «Узлы уровня JavaScript», "Упрощенные узлы" и "Узлы машинного уровня".

Теперь, если вы хотите нарисовать прямоугольники на диаграмме вашей системы на доске немного по-другому, тогда вместо того, чтобы иметь "парсер" и "компилятор "вы можете рассматривать все между исходным кодом и машинным кодом как один большой" компилятор "(который в качестве первого шага анализирует исходный код).В этом случае AST будет формой промежуточного представления.Но, как указано выше, обычно, когда люди используют термин IR, они означают «IR компилятора», а не AST.

В виртуальной машине, такой как V8, общий конвейер выполнения более сложен, чем описано выше.Он начинается с:

source - (синтаксический анализатор) -> AST - (генератор байт-кода) -> bytecode

Этот байт-код в основном используется в качестве входных данных для интерпретатора V8.В качестве оптимизации, когда V8 решает запустить функцию через оптимизирующий компилятор, он не запускается снова с исходным кодом и анализатором, а вместо этого оптимизирующий компилятор использует байт-код в качестве входных данных.В виде диаграммы:

байт-код - (интерпретатор) -> выполнение программы

байт-код - (интерфейс компилятора) -> IR - (серверная часть компилятора) -> машинный код - (ЦП) -> выполнение программы

Теперь вот часть, в которую входит ваша перспектива: поскольку байт-код в V8 используется не только как ввод для интерпретатора, но и также как вход для оптимизирующего компилятора и в этом смысле как шаг на пути от исходного текста к машинному коду, если вы хотите назвать его специальной формой промежуточного представления, технически вы не ошибетесь.Это было бы необычное определение термина все же.Когда в учебнике по теории компилятора говорится о «промежуточном представлении», это не означает «байт-код».

...