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

Мой мечта отказаться от js и писать всё на `нормальном языке` (подставьте любимый на свой выбор), а в идеале, использовать общие классы-сущности во фронтэнде и на бэкэнде.

Но... Я довольно смутно представляю, как это сделать. В статьях для чайников используют регулярные выражения... Но это же не тру? Да и нельзя на них всё описать.
Так же часто пишут свои "компиляторы", на стеке, к примеру, а мне же это не нужно.

Мне нужно распарсить язык (кстати, вот почти все языки открытые, а где найти описание их синтаксического дерева? Для питона или go?) и составить соответствие конструкциям из другого языка.

Что надо для этого знать? В голове такая каша из непонятных терминов, вроде "контектсно-свободных грамматик, бизона, аст-деревьев", а с чего начать и чего изучить придумать не могу.
  • Вопрос задан
  • 4441 просмотр
Пригласить эксперта
Ответы на вопрос 5
mututunus
@mututunus
Backend developer (Python, Golang)
Не только у вас мечта отказаться от js. Свой транслятор явно не решение проблемы.
Можете глянуть в сторону Dart. У него есть транслятор в js и, в будущем, гугл хочет сделать его универсальным языком для frontend'a и backend'a.
Ответ написан
Tyranron
@Tyranron
Собственно, для Go парсер и прочие ништяки поставляются в его стандартное библиотеке:
golang.org/pkg/go

Но, не все так просто. Недостаточно просто взять и на основе одного синтаксиса сгенерировать другой. У языков может различаться достаточно серьезно модель работы с памятью. Например, учитывайте, что JS выполняется в одном потоке, а Go - не обязательно, это делает бессмысленными многие элементы в Go, которые направлены на синхронизацию. Также я, например, сходу не соображу как оптимально ретранслировать в JS такие низкоуровневые вещи как указатели, ведь сам по себе JS не дает "щупать" их ручками, как позволяет это Go. И таких моментов, если копнуть дальше, будет ещё много, потому что сладость Go - в его рантайме, который нельзя вот так просто взять и втащить на горбу JS в браузер.
Можно, конечно, взять и тупо наложить синтаксис Go на однопоточную модель JS, его должно хватить, но это уже будет не чистый Go, а немного другая его спецификация под другую модель памяти, со своими подводными камнями. И тут встает вопрос: а достаточно ли выразителен Go для тех задач, которые решает JS в браузере? В погоне за внешним видом и синтаксисом не нацеп ли мы корпус от трактора на легковую машину, в результате своего то добившись, но поимев проблемы как минимум с парковкой? Все-таки языки создавались для решения разных задач.

Что касается Python - тут дела должны быть лучше, так как модели языков ближе. Уверен, что какие-то ретрансляторы из Python в JS уже есть. Я много раз слышал о том, что как бы хорошо было в браузере на Python ваять, а мир энтузиастами полон =) .

Возвращаясь к проблеме ретрансляции, @mututunus задал Вам правильный вектор. Изучите вопрос глубже, посмотрите успехи других на этом поприще. У того же Dart и JS - очень похожи модели языков, и это неспроста. При первом взгляде Dart кажется таким себе JS на стероидах с нормальной асинхронщиной, пакетами, опциональной статической типизацией и прочими сладостями. Не удивительно, что он легко и достаточно хорошо транслируется в JS. Более того, его создавали как раз как замену JS, то есть для решения задач в браузере, он под это заточен в некотором смысле, что, конечно же, выливается в определенном дизайне языка и определенных его концепциях.
Ответ написан
Комментировать
q1t
@q1t
Ответ написан
Комментировать
@OneFive
React.js <3
Ответ написан
Комментировать
Vapaamies
@Vapaamies
Психанул и снес свои ответы козлам, не отмечающим…
А почему про Haxe никто не сказал?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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