Size: a a a

2020 September 15

KP

Kirill Pimenov in Distributed
Потом ты с этим AST дрочишь вприсядку, и генерируешь из него либо прямо машинные коды (но так никто не делает, ибо сложна и не портабельно), либо какой-то промежуточный язык (IR) для чего-то, что этот IR сможет либо скомпилировать в нужные ассемблеры (как правило там есть ещё линковка и оптимизация на всех этапах, задарма; самый типовый пример — LLVM, который как раз довольно вменяемый фреймфорк для кодогенерации, если ты не норкомант из проекта ТОН и не хочешь 257-битные байты); или твой IR это уже "мета-ассемблер", набор опкодов для виртуальной машины-интерпретатора
источник

KP

Kirill Pimenov in Distributed
Ну там JVM-байткоды например.
источник

KP

Kirill Pimenov in Distributed
Или BEAM
источник

KP

Kirill Pimenov in Distributed
Или тот самый веб ассембли
источник

KP

Kirill Pimenov in Distributed
И да, байткоды EVM тоже в эту категорию относятся
источник

KP

Kirill Pimenov in Distributed
А, ну и есть ещё совсем эзотерический вариант, если тебе гибкость и простота важнее перформанса — просто определить свой язык как DSL на каком-нибудь Руби
источник

KP

Kirill Pimenov in Distributed
Ну то есть чуть-чуть по захардкоженным правилам помассировать синтаксис, чтобы Руби ничего не мешало (но в общем более-менее любой интерпретируемый язык с хорошим макропрограммированием подойдёт, например Кложа или Эликсир). И тупо определить все конструкции на Руби
источник

KP

Kirill Pimenov in Distributed
После чего прогонять свою программу, сначала ворохом регекспов превращая программу в валидный Руби-код, и потом этот код тупо отправляя в интерпретатор.
источник

KP

Kirill Pimenov in Distributed
Это немного костыльное решение, но в общем-то рабочее, особенно если надо быстро, а разбираться не особо хочется
источник

DB

Drunk Bootlegger in Distributed
На фосдеме в прошлом году была прикольная лекция по использования Per-, извиняюсь, Raku для обработки синтаксисов

https://www.youtube.com/watch?v=lwIXF25KJCo
источник

DB

Drunk Bootlegger in Distributed
(Ну и вообще в нем очень мощная система для обработки текстов)
источник

KP

Kirill Pimenov in Distributed
@mr_tron а вообще посмотри, может проще будет тупо перенести весь код (и переобучить персонал) на использование какого-нибудь эмбеддед языка для той среды, в которой ты планируешь это всё гонять?
источник

KP

Kirill Pimenov in Distributed
Все эти парсеры-лексеры — это дохуя сложна
источник

KP

Kirill Pimenov in Distributed
Стримерша Карина джпг
источник

YB

Yanis Benson in Distributed
@mr_tron я так то мимокрокодил(хотя и писал пару парсеров для средней сложности языков на вечерок и простенький движок парсеров) и вообще забыл с универа всю теорию, но чисто с практической точки зрения рекомендовал бы глянуть "packrat parser" и "parser combinators", потому что зачастую есть готовые либы под любые языки, можно не учить специальные дсл, не использовать генераторов и использовать регекспы без вреда для здоровья(скорости исполнения).
источник

YB

Yanis Benson in Distributed
Вот на своем примере, ямлоподобный язык(с некоторыми усложнениями и некоторыми упрощениями) зиро ту хиро вышел у меня что-то типа за пару часов, с удовлетворительной скоростью(хотя и не топовой, но тут скорее вина конкретной библиотеки и исполнения всего этого на джс).
источник

YB

Yanis Benson in Distributed
Yanis Benson
@mr_tron я так то мимокрокодил(хотя и писал пару парсеров для средней сложности языков на вечерок и простенький движок парсеров) и вообще забыл с универа всю теорию, но чисто с практической точки зрения рекомендовал бы глянуть "packrat parser" и "parser combinators", потому что зачастую есть готовые либы под любые языки, можно не учить специальные дсл, не использовать генераторов и использовать регекспы без вреда для здоровья(скорости исполнения).
А, ну и стоит добавить, что это объединяемые штуки, отлично используются вместе. Алсо, лексеры в такой саязке обычно не выделяются в отдельный шаг(насколько я знаю), потому как сама структура позволяет 1) мемоизировать результаты, что снимает нагрузку с области кода, которая обычно выделяется в лексер 2) таким образом снимает с лексера требования к сверхвысокой производительности 3) вроде как минимум в топе в области теоретической производительности парсера.
источник

RR

Rigidus Rigidus in Distributed
@mr_tron
А можно немного оффтопа?
У меня довольно примитвный, но Тьюринг полный DSL.
К нему существует интерпретатор на си, который мне не нравится и вообще тесно связан с вин32 гуйней.
Хочу сделать кастомный интерпретатор на чем-нибудь более человеческом.
Как вообще правильно к такому заходить?
Я так понимаю сперва надо парсер, который мне распарсит этот DSL в ast. А потом рисовать типа виртуальной машины.
Есть какие-нибудь фреймворки, упрощающие жизнь? Ну например для парсера чтоб можно было описать спецсимволы и правила их экранирования, ключевые слова и он бы сам распарсил?
Вопрос умный. Рекомендую прочитать SICP
источник

RR

Rigidus Rigidus in Distributed
А, тут меня опрередили уже с этим советом..
источник
2020 September 16

RB

Rinat Bakiev in Distributed
1909 год
источник