Задать вопрос
googlaev
@googlaev
prog

Как реализовать язык который будет компилироваться в другой язык программирования?

Добрый день друзья. Посоветуйте, расскажите, поделитесь, опишите как реализовать язык который будет компилироваться в другой язык программирования? (пример как coffee script в js). Или с чего начать, или как начать. Заранее спасибо огромное.
  • Вопрос задан
  • 399 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 8
@sergealmazov
Для этого надо узнать как вообще языки работают. Почитать Дональда Кнута, почитать про такое понятие как DSL.

Лучше всего вам взять динамический язык, гибкий. Я бы вам посоветовал Clojure.

Clojure хорош тем, что любую конструкцию вы можете сами придумать, сильный механизм макросов позволит осуществить вашу задумку.
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
"Компиляторы" Ахо, Лам, Сети, Ульман.
Приятного чтения.)
Ответ написан
Комментировать
Ответ написан
Комментировать
@asd111
гуглить flex, bison, обратная польская нотация.
По сути нужен только парсер, который видя одну языковую конструкцию выдает другую.
Ответ написан
Комментировать
@alexxandr
you'll see in memory only 0xDEADFACE
lua
Ответ написан
Комментировать
vpuhoff
@vpuhoff
Программист в свободное от работы время
не ясно зачем это надо, но если чтото примитивное, вроде накидал примерно структуру, а из нее построился исходник то можно пойти простым путем, создается для каждой команды отдельный текстовый шаблон, в котором будет заменяться определенная часть (параметры), язык же должен понимать что есть команда, а что параметр и просто подменять их шаблонами.
Ответ написан
Комментировать
@smartchecker
Как уже было отмечено - нужно читать теорию компиляторов.
Нужно понять из каких блоков строится компилятор и какие из них достаточны для решения Вашей задачи.
Минимум нужно описать грамматику языка, как входного так и выходного. И правила преобразования.
Данный процесс называется трансляция.
Ответ написан
Комментировать
riky
@riky
Laravel
не давно как раз подобным занимался. нужно было сделать компилятор из чего то похожего на excel в php.

основные шаги для этого
1) токенизация, модуль лексер проходит посимвольно код и разбивает исходный код, на вашем новом языке на токены, числа, ключевые слова, скобки и тд, то есть каждый токен - некая последовательность символов пример ("var", "name", "=", "vasya", ";", "print", "(", "name", ")", ";").
2) далее парсер проходит по токенам и определяет их тип, при этом как правило строится AST (abstract syntax tree). это набор объектов в которых исходный код представлен в виде объектов и операций над ними.
в этом виде код уже можно выполнять, не генерируя код на целевом языке.
3) компиляция. на основе AST генерируется код на другом языке.

основные ключевые слова можно посмотреть здесь https://en.wikipedia.org/wiki/Lexical_analysis

если знакомы с php, то вот примеры таких компиляторов на php
на нем они получаются довольно просто, тк язык высокоуровневый

https://github.com/symfony/expression-language (парсит выражения и может вычислять их на основе AST то есть без генерации php кода, хотя может и его генерить)
https://github.com/twigphp/Twig (парсит шаблоны и генерит php код)
код очень похож, тк создатель у них один.

я свой парсер тоже делал на их основе, но пришлось серьезно дописывать, чтобы expression-language превратить в полноценный язык программирования, с поддержкой циклов, переменных и других конструкций.

примеры кода модулей из symfony expression language
1) токенизация
https://github.com/symfony/expression-language/blo...

2) парсер
https://github.com/symfony/expression-language/blo...
создаются вот такие сущности https://github.com/symfony/expression-language/tre...
то есть нода - функция, константа, массив, название переменной и тд.

3) компилятор
https://github.com/symfony/expression-language/blo...
но большая часть генерации кода происходит в самих нодах. пример - https://github.com/symfony/expression-language/blo...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы