Создание источника для исходного переводчика - PullRequest
8 голосов
/ 22 августа 2011

Я хочу знать, каковы стратегии создания переводчика источник-источник, т. Е. Перевод с одного языка высокого уровня на другой. Два способа, которые приходят мне в голову:

1- Изменение синтаксического дерева одного языка на другое синтаксическое дерево 2- Изменение его на промежуточный язык и затем преобразование его в другой язык высокого уровня

Мой вопрос заключается в том, можно ли выполнить преобразование, используя обе стратегии, и что более целесообразно сделать, может ли кто-нибудь дать ссылку на любую теорию или реализацию, выполненную каким-либо преобразователем, как любой из вышеуказанных методов. И существует ли какой-либо стандартный промежуточный язык на основе xml, я знаю, что xmlvm использует xml в качестве промежуточного языка, но он не обеспечивает надлежащей спецификации промежуточного языка.

Ответы [ 4 ]

8 голосов
/ 22 августа 2011

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

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

Еще один совет (здесь ожидаются отрицательные голоса) - держитесь подальше от XML, особенно как представление для AST s.

2 голосов
/ 15 ноября 2011

Я бы посмотрел на LLVM, который может делать источник к источнику. Хотя результат не очень хорош, он может дать некоторые хорошие идеи.

0 голосов
/ 07 сентября 2013

Попробуйте Clang! Это мощный для перевода с источника на источник. На данный момент он полностью поддерживает C, C ++, Objective C и Objective C ++. Вы также можете посмотреть на инфраструктуру компилятора ROSE.

0 голосов
/ 22 августа 2011

Преобразователи обычно основаны на построении семантического дерева одной программы и последующем преобразовании его в целевой PL. В качестве примера рассмотрим конвертер C # в Java .

Второй подход также возможен, но организация вашего кода может полностью измениться после преобразования. Таким образом, лучше поддерживать промежуточную общую структуру (IL, ST и т. Д.) На максимально высоком уровне.

...