Кодогенерация и метапрограммирование
Все-таки, несмотря на то, что функциональные языки (F#, в моем случае) очень удобны для кодогенерации - кодогенераторы получаются не очень адекватными.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
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)
(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
В функциональных языках трабл в том, что они менее понятны чайникам. DSL, страдающий этим недугом, не жизнеспособен.
(no subject)
(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
> В случае с метапрограммированием вроде его роль выполняет 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
Буду агитировать за что угодно, лишь бы не тратилось вр
Кстати, атрибутные грамматики на нём будут бедны и с внешней кодогенерацией кода на F#.
Если уж писать кодогенератор, так подобие монад на обычном C# соорудить и строить код. Applicative на C# уж точно выйдет, а это больше половины дела. И отлаживаться можно нормально, и обращаться в/из C#. Куда лучше F#.
Re: Буду агитировать за что угодно, лишь бы не тратилось
Re: Буду агитировать за что угодно, лишь бы не тратилось
Re: Буду агитировать за что угодно, лишь бы не тратилось