Я знаю, что нет двух идеально совместимых языков программирования, но я хочу спросить, есть ли у меня простая программа, такая как hello world, и я запускаю этапы трансляции компиляции, такие как lex, parse, затем получаю дерево AST, могу ли я отправить его в другую среду, скажем, Some c AST дерево и интерпретировать его с помощью Java
Может ли абстрактное синтаксическое дерево быть скомпилировано несколькими компиляторами или интерпретаторами?
Ответы (3)
Краткий ответ: Нет.
Более длинная версия:
Если у вас есть две разные реализации языка, которые задокументировали и экспортировали свои интерфейсы AST, и эти два интерфейса были достаточно похожи, чтобы вы могли переводить между ними, тогда вы могли бы скомпилировать в AST, а затем попытаться передать AST в одну из этих реализаций.
Здесь я могу говорить только гипотетически, потому что языковые реализации довольно редко включают доступный извне интерфейс AST. (Единственным исключением является Python, который позволяет компилировать в AST, создавать или изменять AST, а затем компилировать из AST. Здесь «компилировать» означает «компилировать в код виртуальной машины». См. документацию по Python для получения дополнительной информации.)
В частности, я не знаю такой реализации Java. И GCC, и clang могут выводить что-то похожее на AST, но ни один из них не принимает его, и вывод может быть недостаточно полным, чтобы определить все аспекты единиц перевода.
Мне неизвестны какие-либо стандартизированные форматы представления AST
, которые позволили бы такое совместное использование (при условии, что мы говорим о языках с похожей семантикой), но, например, в Clang+LLVM кажется, что вывод AST
можно передать в несколько генераторов кода (компиляторов).
Что же касается универсального Java
интерпретатора, читающего AST
любого языка, то я думаю, что такого не существует, и я сомневаюсь, что его вообще можно было бы построить, так как значение слов в разных языках программирования разное.
ИЗМЕНИТЬ 2015-03-30 после разъяснения комментариев
Допустим, я сериализую
AST
в поток байтов, отправляю его через сокет и десериализую обратно в дерево объектов в программе, написанной на другом языке. ИспользуяJSON
,YAML
,XML
простые, довольно стандартные языки для сериализации и десериализации произвольных данных, Затем найдите для них парсеры на нужном языке. думаю это технически возможно
Имея конкретное простое подмножество конкретного языка программирования, скажем, конкретный процедурный язык, например Tiny C, вы можете на одном компьютере построить деревья разбора и отправить их на другой компьютер для " устный перевод". Запрос Google ast intermediate representation
может дать вам некоторые подсказки, такие как http://icps.u-strasbg.fr/~pop/gcc-ast.html или http://lambda-the-ultimate.org/node/716, но это другая проблема, чем исходный любой язык с AST
и универсальным интерпретатором в Java
я работаю над экспериментом
asm.js — это современная версия "разбирать программу на одном языке на одном компьютере и отправлять ее на другой машина для интерпретации" проблемы. Где другая машина — это любой современный веб-браузер, а формат сериализации — подмножество JavaScript
. С несколькими миллиардами веб-браузеров по всей планете эксперименты с этим могут быть как коммерчески выгодными, так и полезными, поскольку этот проект приветствует дальнейшую поддержку или исследования от таких парней, как вы (?)
Смотрите также:
Вторя ответу Ричи: Краткий ответ, нет.
Эта идея была опробована не раз. Обычно это не удается хотя бы потому, что вы не можете определить один узел AST для «добавить», что означает одно и то же для всех языков. Семантика просто отличается, и вы должны быть в состоянии различать значение оператора в конкретном языковом контексте, в котором он находится. Есть много других проблем, таких как согласование деталей представление (дерево? DAG? график?) и сколько информации передается (AST? таблицы символов? поток управления?...)
Люди продолжают пытаться.
Группа управления объектами имеет спецификацию Абстрактной модели синтаксического дерева, которая пытается определить универсальные АСТ. Что OMG обнаружило, так это то, что для того, чтобы сделать это практичным, наряду с их «Общей моделью AST» в стиле нирваны (ick, «GASTM»), им также необходимо было иметь так называемые «Специальные модели AST» («SASTM»), например, . AST, специфичные для языка, более того, даже для конкретного синтаксического анализатора для этого языка, чтобы иметь возможность точно интерпретировать значение операторов и операндов, созданных этим синтаксическим анализатором.
[Я создаю инструмент, который работает с несколькими языками одновременно. Он решает проблему значения узла, по существу помечая каждый узел как оператором, например, «+», так и «доменом» (системой обозначений), в котором следует интерпретировать оператор. По сути, это то же самое, что и решение SASTM. Мы не верим в GASTM и поэтому не беспокоимся об этом].