Кодогенерация и метапрограммирование
Jul. 19th, 2011 09:25 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Все-таки, несмотря на то, что функциональные языки (F#, в моем случае) очень удобны для кодогенерации - кодогенераторы получаются не очень адекватными.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.
no subject
Date: 2011-07-19 06:49 am (UTC)no subject
Date: 2011-07-19 08:02 am (UTC)no subject
Date: 2011-07-19 08:08 am (UTC)no subject
Date: 2011-07-19 08:50 am (UTC)http://martinfowler.com/articles/mpsAgree.html
http://nesteruk.wordpress.com/2010/09/02/jetbrains-mps-first-experience/
no subject
Date: 2011-07-19 08:59 am (UTC)no subject
Date: 2011-07-19 08:23 am (UTC)no subject
Date: 2011-07-19 08:48 am (UTC)no subject
Date: 2011-07-19 08:52 am (UTC)no subject
Date: 2011-07-19 03:48 pm (UTC)А код не в ричтексте, а в вообще не в текстовом редакторе.
no subject
Date: 2011-07-19 11:19 am (UTC)Кто тамошний - тем MPS (Xtext, Whole platform, "yet another language workbench on Java/Eclipse"...) понравится. А остальным и не нужно, свои сильные технологии есть.
no subject
Date: 2011-07-19 11:31 am (UTC)no subject
Date: 2011-07-19 11:40 am (UTC)Неудивительно что ему она поперек горла.
no subject
Date: 2011-07-19 11:49 am (UTC)no subject
Date: 2011-07-19 12:00 pm (UTC)no subject
Date: 2011-07-19 07:08 am (UTC)no subject
Date: 2011-07-19 08:33 am (UTC)no subject
Date: 2011-07-19 09:48 am (UTC)no subject
Date: 2011-07-19 10:54 am (UTC)no subject
Date: 2011-07-19 12:40 pm (UTC)no subject
Date: 2011-07-19 12:56 pm (UTC)Впрочем тут и бизон оккультен.
no subject
Date: 2011-07-19 04:18 pm (UTC)no subject
Date: 2011-07-19 04:19 pm (UTC)no subject
Date: 2011-07-19 04:24 pm (UTC)xttp://www.antlr.org/blog/attribute.grammar.notes.tml
no subject
Date: 2011-07-19 07:53 am (UTC)no subject
Date: 2011-07-19 08:35 am (UTC)no subject
Date: 2011-07-19 08:01 am (UTC)В функциональных языках трабл в том, что они менее понятны чайникам. DSL, страдающий этим недугом, не жизнеспособен.
no subject
Date: 2011-07-19 08:18 am (UTC)Если это не задумывается как препроцессор какой нибудь, то лучше наверное сразу в LLVM IR -- там и база для AST готовая, и куча всякой фигни включая jit
no subject
Date: 2011-07-19 08:36 am (UTC)no subject
Date: 2011-07-19 08:50 am (UTC)(или даже нескольких)
Погляди в ллвм, если не для использования - то на посмотреть как сделано.
(Там адъ из DSL'ей для всего)
no subject
Date: 2011-07-19 09:51 am (UTC)no subject
Date: 2011-07-19 08:36 am (UTC)Вот, к примеру код кодогенератора: https://github.com/rssh/jungle.public/blob/master/platform/tools/ua.gradsoft.jungle.tools.phpjao/systems/phpjao/phpjao.def
no subject
Date: 2011-07-19 08:49 am (UTC)no subject
Date: 2011-07-19 09:50 am (UTC)> В случае с метапрограммированием вроде его роль выполняет 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
Date: 2011-07-19 10:23 am (UTC)no subject
Date: 2011-07-19 10:52 am (UTC)no subject
Date: 2011-07-19 10:56 am (UTC)no subject
Date: 2011-07-19 11:39 am (UTC)no subject
Date: 2011-07-19 01:25 pm (UTC)он вроде как изначально заточен на кодогенерацию под кучу языков
no subject
Date: 2011-07-19 01:56 pm (UTC)Буду агитировать за что угодно, лишь бы не тратилось вр
Date: 2011-07-19 08:02 pm (UTC)Кстати, атрибутные грамматики на нём будут бедны и с внешней кодогенерацией кода на F#.
Если уж писать кодогенератор, так подобие монад на обычном C# соорудить и строить код. Applicative на C# уж точно выйдет, а это больше половины дела. И отлаживаться можно нормально, и обращаться в/из C#. Куда лучше F#.
Re: Буду агитировать за что угодно, лишь бы не тратилось
Date: 2011-07-19 08:28 pm (UTC)Re: Буду агитировать за что угодно, лишь бы не тратилось
Date: 2011-07-20 06:19 am (UTC)Re: Буду агитировать за что угодно, лишь бы не тратилось
Date: 2011-07-20 09:47 am (UTC)