metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-07-19 09:25 am

Кодогенерация и метапрограммирование

Все-таки, несмотря на то, что функциональные языки (F#, в моем случае) очень удобны для кодогенерации - кодогенераторы получаются не очень адекватными.
Или огромные классы для описания AST целевых языков и сборка из них нужного кода, затем его pretty-printing или тупой вывод текста по шаблонам. В обоих случаях - код очень малочитабелен.
Для кодогенерации нужен какой-то специфический DSL, да еще с адаптацией под целевые языки.
В случае с метапрограммированием вроде его роль выполняет quasi-quotation, но там в итоге получается код только на том же языке на котором пишешь.

[identity profile] osdm.livejournal.com 2011-07-19 06:49 am (UTC)(link)
У нас на фирме есть разработка для создания специфичных DSL, посмотрите http://www.jetbrains.com/mps/

[identity profile] potan.livejournal.com 2011-07-19 07:08 am (UTC)(link)
А сгенерируемый код должен быть читабельным?

[identity profile] xeno-by.livejournal.com 2011-07-19 07:53 am (UTC)(link)
Прокатит ли квазицитирование с последующей декомпиляцией кода, полученного после раскрытия макросов? А потом из декомпилированного AST можно будет сгенерировать что угодно, в рамках семантики целевого языка, конечно.

[identity profile] vit-r.livejournal.com 2011-07-19 08:01 am (UTC)(link)
DSL должны быть специфичными для каждой задачи и понятны специалистам-пользователям. Куда потом генерируется DSL пользователям абсолютно пофиг. Главное, чтоб им было просто решать свои задачи.

В функциональных языках трабл в том, что они менее понятны чайникам. DSL, страдающий этим недугом, не жизнеспособен.

[identity profile] rssh.livejournal.com 2011-07-19 08:36 am (UTC)(link)
Еще формализм переписывающих правил може подойти

Вот, к примеру код кодогенератора: https://github.com/rssh/jungle.public/blob/master/platform/tools/ua.gradsoft.jungle.tools.phpjao/systems/phpjao/phpjao.def

[identity profile] swizard.livejournal.com 2011-07-19 09:50 am (UTC)(link)
> Или огромные классы для описания AST целевых языков
> В случае с метапрограммированием вроде его роль выполняет 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, склеивать их можно вообще без проблем, не нужно городить огромные адаптеры.

[identity profile] avnik.livejournal.com 2011-07-19 10:56 am (UTC)(link)
Ребе, признайтесь, что это пауки надоумили вас на пятничный пост.

[identity profile] blueher.livejournal.com 2011-07-19 01:25 pm (UTC)(link)
А из HAXE нельзя натырить куски/идеи?
он вроде как изначально заточен на кодогенерацию под кучу языков

[identity profile] max630.livejournal.com 2011-07-19 01:56 pm (UTC)(link)
настолько я понимаю, код для обработки ast реальных языков это первое место для кодогенерации, dsl. метапрограммирования и прочих страшных слов. я недавно игрался с этим для template haskell

Буду агитировать за что угодно, лишь бы не тратилось вр

[identity profile] thesz.livejournal.com 2011-07-19 08:02 pm (UTC)(link)
Спешу заметить, что F# лучше бы не использовать для кодогенерации. Слабоват-с. В комбинаторном стиле не попишешь, типизация так себе.

Кстати, атрибутные грамматики на нём будут бедны и с внешней кодогенерацией кода на F#.

Если уж писать кодогенератор, так подобие монад на обычном C# соорудить и строить код. Applicative на C# уж точно выйдет, а это больше половины дела. И отлаживаться можно нормально, и обращаться в/из C#. Куда лучше F#.