Кодогенерация и метапрограммирование
Все-таки, несмотря на то, что функциональные языки (F#, в моем случае) очень удобны для кодогенерации - кодогенераторы получаются не очень адекватными.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
no subject
no subject
no subject
no subject
В функциональных языках трабл в том, что они менее понятны чайникам. DSL, страдающий этим недугом, не жизнеспособен.
no subject
no subject
no subject
Если это не задумывается как препроцессор какой нибудь, то лучше наверное сразу в LLVM IR -- там и база для AST готовая, и куча всякой фигни включая jit
no subject
no subject
no subject
no subject
Вот, к примеру код кодогенератора: https://github.com/rssh/jungle.public/blob/master/platform/tools/ua.gradsoft.jungle.tools.phpjao/systems/phpjao/phpjao.def
no subject
no subject
no subject
no subject
(или даже нескольких)
Погляди в ллвм, если не для использования - то на посмотреть как сделано.
(Там адъ из DSL'ей для всего)
no subject
http://martinfowler.com/articles/mpsAgree.html
http://nesteruk.wordpress.com/2010/09/02/jetbrains-mps-first-experience/
no subject
no subject
no subject
no subject
> В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
Скажу за коммонлисп: это нормально ast-ом всех целевых языков считать s-exp :) Только целевой код генерируется в два этапа: все преобразования и собственно генерация происходит в s-exp, а потом простенький транслятор генерирует собственно текст того, что нужно.
Например, для генерации sql промежуточный результат будет выглядеть как-то вроде: (sql-select (fields (dot table-1 price) (dot table-2 amount)) (from table-1 table-2) (where (= (dot table-1 id) (dot table-2 id))))
Этот ast можно вертеть как угодно (менять условия, таблицы, етк), и на последнем этапе происходит трансляция собственно в текст "SELECT table-1.price, table-2.amount FROM table-1, table-2 WHERE table-1.id = table-2.id".
Благодаря тому, что у всех целевых языков оказывается универсальный AST, склеивать их можно вообще без проблем, не нужно городить огромные адаптеры.
no subject
no subject
no subject
no subject
no subject
no subject
Кто тамошний - тем MPS (Xtext, Whole platform, "yet another language workbench on Java/Eclipse"...) понравится. А остальным и не нужно, свои сильные технологии есть.
no subject
no subject
no subject
Неудивительно что ему она поперек горла.
no subject
no subject
no subject
no subject
Впрочем тут и бизон оккультен.
no subject
он вроде как изначально заточен на кодогенерацию под кучу языков
no subject
no subject
А код не в ричтексте, а в вообще не в текстовом редакторе.
no subject
no subject
no subject
xttp://www.antlr.org/blog/attribute.grammar.notes.tml
Буду агитировать за что угодно, лишь бы не тратилось вр
Кстати, атрибутные грамматики на нём будут бедны и с внешней кодогенерацией кода на F#.
Если уж писать кодогенератор, так подобие монад на обычном C# соорудить и строить код. Applicative на C# уж точно выйдет, а это больше половины дела. И отлаживаться можно нормально, и обращаться в/из C#. Куда лучше F#.
Re: Буду агитировать за что угодно, лишь бы не тратилось
Re: Буду агитировать за что угодно, лишь бы не тратилось
Re: Буду агитировать за что угодно, лишь бы не тратилось