Может ли абстрактное синтаксическое дерево быть скомпилировано несколькими компиляторами или интерпретаторами?

Я знаю, что нет двух идеально совместимых языков программирования, но я хочу спросить, есть ли у меня простая программа, такая как hello world, и я запускаю этапы трансляции компиляции, такие как lex, parse, затем получаю дерево AST, могу ли я отправить его в другую среду, скажем, Some c AST дерево и интерпретировать его с помощью Java


person user22092    schedule 29.03.2015    source источник


Ответы (3)


Краткий ответ: Нет.

Более длинная версия:

Если у вас есть две разные реализации языка, которые задокументировали и экспортировали свои интерфейсы AST, и эти два интерфейса были достаточно похожи, чтобы вы могли переводить между ними, тогда вы могли бы скомпилировать в AST, а затем попытаться передать AST в одну из этих реализаций.

Здесь я могу говорить только гипотетически, потому что языковые реализации довольно редко включают доступный извне интерфейс AST. (Единственным исключением является Python, который позволяет компилировать в AST, создавать или изменять AST, а затем компилировать из AST. Здесь «компилировать» означает «компилировать в код виртуальной машины». См. документацию по Python для получения дополнительной информации.)

В частности, я не знаю такой реализации Java. И GCC, и clang могут выводить что-то похожее на AST, но ни один из них не принимает его, и вывод может быть недостаточно полным, чтобы определить все аспекты единиц перевода.

person rici    schedule 29.03.2015
comment
Спасибо, Ричи, но я собираюсь создать аргумент, скажем, я сериализую AST в поток байтов, отправлю его через сокет и десериализую обратно в дерево объектов в программе, написанной на другом языке. Используя JSON, YAML и XML, которые являются простыми, довольно стандартными языками для сериализации и десериализации произвольных данных, Затем найдите для них парсеры на нужном языке. Что, я думаю, технически возможно? Позвольте мне услышать ваше мнение - person user22092; 29.03.2015
comment
@user22092: user22092: Вы, безусловно, можете попробовать нарастить плоть на эти кости. Это теоретически возможно, да, хотя ваше описание затрагивает ряд вопросов. Как я сказал в ответе, большинство языков не определяют стандартный набор объектов AST, а тем более не делают их доступными в стандартной среде выполнения. Более того, AST не захватывает весь синтаксический анализ — есть еще, например, таблица символов — и нет никакой гарантии, что совокупность обработанных входных данных вообще является деревом. (Ни один из форматов обмена, которые вы упомянули, не может обрабатывать графики.) Но, как я уже сказал, дерзайте! - person rici; 30.03.2015
comment
Хорошо, я попробую, пока еще работаю над этим. - person user22092; 02.04.2015
comment
@user22092 user22092: рассмотрите возможность создания Java AST для x + y как, ну, (+ x y), где x и y — строковые типы. Ничто не помешает вам отправить это дерево компилятору C, который готов его принять. Но интерпретация C (+ ....) допускает только числовую арифметику. Таким образом, отправка деревьев без изменений — это рецепт семантической катастрофы. Языки достаточно различаются в своей интерпретации операторов, поэтому это практически не работает, когда операторы имеют одно и то же имя. Хуже того, что язык получателя делает с оператором, который он получает, но не на его языке? (setjmp в Java?) - person Ira Baxter; 04.04.2015

Мне неизвестны какие-либо стандартизированные форматы представления 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. С несколькими миллиардами веб-браузеров по всей планете эксперименты с этим могут быть как коммерчески выгодными, так и полезными, поскольку этот проект приветствует дальнейшую поддержку или исследования от таких парней, как вы (?)

Смотрите также:

person xmojmr    schedule 29.03.2015
comment
Спасибо, xmojmr, но я собираюсь создать аргумент, скажем, я сериализую AST в поток байтов, отправлю его через сокет и десериализую обратно в дерево объектов в программе, написанной на другом языке. Используя JSON, YAML и XML, которые являются простыми, довольно стандартными языками для сериализации и десериализации произвольных данных, Затем найдите для них парсеры на нужном языке. Что, я думаю, технически возможно? Позвольте мне услышать ваше мнение - person user22092; 29.03.2015
comment
@ user22092 Понятно. Я добавил еще одну главу к своему ответу. Если вы довольны этим, и никто не предлагает что-то лучше в разумные сроки, то установленный способ выражения благодарности Stack Overflow - это голосование или принимаю ответ - person xmojmr; 30.03.2015

Вторя ответу Ричи: Краткий ответ, нет.

Эта идея была опробована не раз. Обычно это не удается хотя бы потому, что вы не можете определить один узел AST для «добавить», что означает одно и то же для всех языков. Семантика просто отличается, и вы должны быть в состоянии различать значение оператора в конкретном языковом контексте, в котором он находится. Есть много других проблем, таких как согласование деталей представление (дерево? DAG? график?) и сколько информации передается (AST? таблицы символов? поток управления?...)

Люди продолжают пытаться.

Группа управления объектами имеет спецификацию Абстрактной модели синтаксического дерева, которая пытается определить универсальные АСТ. Что OMG обнаружило, так это то, что для того, чтобы сделать это практичным, наряду с их «Общей моделью AST» в стиле нирваны (ick, «GASTM»), им также необходимо было иметь так называемые «Специальные модели AST» («SASTM»), например, . AST, специфичные для языка, более того, даже для конкретного синтаксического анализатора для этого языка, чтобы иметь возможность точно интерпретировать значение операторов и операндов, созданных этим синтаксическим анализатором.

[Я создаю инструмент, который работает с несколькими языками одновременно. Он решает проблему значения узла, по существу помечая каждый узел как оператором, например, «+», так и «доменом» (системой обозначений), в котором следует интерпретировать оператор. По сути, это то же самое, что и решение SASTM. Мы не верим в GASTM и поэтому не беспокоимся об этом].

person Ira Baxter    schedule 14.04.2015
comment
Хорошо, я научился, но сейчас я создал исходный текст с моими собственными правилами и грамматиками. Затем, когда я создаю дерево для этого нового языка, который я написал, и интерпретатор как на Python, так и на Java для оценки дерева дает мне результат. Чувак, я бы хотел, чтобы это Универсальное дерево было стандартом. таким образом, мы можем тестировать код, даже не переписывая его заново или не переходя от языка к простому. - person user22092; 14.04.2015
comment
Одно дело определить конкретное абстрактное синтаксическое дерево (модель) [SASTM!] с четко определенным значением, чтобы два разных приложения могли читать и правильно интерпретировать эту конкретную модель. Другое дело верить, что вы можете построить универсальный синтаксис. Вы боретесь с ветряными мельницами. - person Ira Baxter; 14.04.2015
comment
Хорошо, спасибо, но как специалист по CS я никогда не говорю «никогда». - person user22092; 14.04.2015
comment
Я занимаюсь этим около 40 лет. Ответов пока нет. Удачи с этим здесь. - person Ira Baxter; 14.04.2015