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] xeno-by.livejournal.com 2011-07-19 08:02 am (UTC)(link)
Подскажите, пожалуйста, для MPS есть альтернативный туториал? Уже не в первый раз пытаюсь осилить официальный гайд, но моск взрывается раньше, чем дохожу даже до середины.

[identity profile] osdm.livejournal.com 2011-07-19 08:08 am (UTC)(link)
К сожалению, не знаю. Если узнаю, отпишусь.

[identity profile] theiced.livejournal.com 2011-07-19 08:59 am (UTC)(link)
всё нормально. ваш моск просто проникается ненужностью этого поделия и отказывается тратить время дальше.

[identity profile] theiced.livejournal.com 2011-07-19 08:23 am (UTC)(link)
так говно жеж. по всем пунктам говно, от уродского внешнего вида поделки до жутчайшего ситнаксиса и ричтекста в качестве кода.

[identity profile] osdm.livejournal.com 2011-07-19 08:48 am (UTC)(link)
Как всегда, пришел theiced и все обкакал и как всегда без аргументов. Видимо, товарищи типа Мартина Фоулера, которым все нравится, слепые.

[identity profile] theiced.livejournal.com 2011-07-19 08:52 am (UTC)(link)
без аргументов? там не ублюдочный внешний вид? ублюдочный, как и у всех жабских уйней. там не жутчайший синтаксис от которого хочется блевать? нет? там код не в ричтексте? ась?

[identity profile] thedeemon.livejournal.com 2011-07-19 03:48 pm (UTC)(link)
Вроде, синтаксис такой, какой сам придумаешь.
А код не в ричтексте, а в вообще не в текстовом редакторе.

[identity profile] justy-tylor.livejournal.com 2011-07-19 11:19 am (UTC)(link)
Фаулер не разбирается в языках программирования. Функциональных не знает вообще, о чём напрямую пишет в своих книгах. Это не мешает ему быть основным популяризатором идеи DSL в Java-среде, но этим всё и ограничивается.

Кто тамошний - тем MPS (Xtext, Whole platform, "yet another language workbench on Java/Eclipse"...) понравится. А остальным и не нужно, свои сильные технологии есть.

[identity profile] theiced.livejournal.com 2011-07-19 11:31 am (UTC)(link)
вы вынуждаете меня вас срочно зафрендить ;)

[identity profile] metaclass.livejournal.com 2011-07-19 11:40 am (UTC)(link)
Ну Фаулер зарабатывает писанием книжек про паттерны, которые в функциональщине не нужны никак )
Неудивительно что ему она поперек горла.

[identity profile] theiced.livejournal.com 2011-07-19 11:49 am (UTC)(link)
аааа! вспомнил откуда я эту фамилию знаю!

[identity profile] theiced.livejournal.com 2011-07-19 12:00 pm (UTC)(link)
мнение козлопитона пишущего говнокнижечки для программистишек-через-точечку ни разу не интересует.

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

[identity profile] metaclass.livejournal.com 2011-07-19 08:33 am (UTC)(link)
Не, а вот код кодогенератора - должен.

[identity profile] permea-kra.livejournal.com 2011-07-19 09:48 am (UTC)(link)
Ребе, а вы attribute grammars не пробовали к этой задаче присобачить?

[identity profile] metaclass.livejournal.com 2011-07-19 10:54 am (UTC)(link)
А меня не уволят, если я попытаюсь еще одну оккультную хрень прикрутить к рабочим проектам?:)

[identity profile] permea-kra.livejournal.com 2011-07-19 12:40 pm (UTC)(link)
Она столь же оккультная, как и bison.

[identity profile] metaclass.livejournal.com 2011-07-19 12:56 pm (UTC)(link)
Так это ж парсеры, а я наоборот вроде код генерирую)
Впрочем тут и бизон оккультен.

[identity profile] permea-kra.livejournal.com 2011-07-19 04:18 pm (UTC)(link)
Не, ну вот тут гугль брешет, что CoCo/R умеет attribute grammars. Т.е не вижу проблемы, это вполне мейнстрим.

[identity profile] permea-kra.livejournal.com 2011-07-19 04:19 pm (UTC)(link)
А, хотя нет. Он attributeD grammar.

[identity profile] permea-kra.livejournal.com 2011-07-19 04:24 pm (UTC)(link)
Хе, а вот anltr (который умеет сишарп) вроде бы умеет.

xttp://www.antlr.org/blog/attribute.grammar.notes.tml

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

[identity profile] metaclass.livejournal.com 2011-07-19 08:35 am (UTC)(link)
У меня генерируется sql, с#, delphi и еще парочка специфичных внутренних языков - там общего в семантике только то, что это "классы с полями", и все)

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

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

[identity profile] avnik.livejournal.com 2011-07-19 08:18 am (UTC)(link)
Кстати да.
Если это не задумывается как препроцессор какой нибудь, то лучше наверное сразу в LLVM IR -- там и база для AST готовая, и куча всякой фигни включая jit

[identity profile] metaclass.livejournal.com 2011-07-19 08:36 am (UTC)(link)
Не, тут DSL не для пользователей, а для себя - чтобы не сойти с ума, когда приходится чего-нибудь дорабатывать в кодогенераторе.

[identity profile] avnik.livejournal.com 2011-07-19 08:50 am (UTC)(link)
Может сам кодогенератор писать на DSL?
(или даже нескольких)

Погляди в ллвм, если не для использования - то на посмотреть как сделано.
(Там адъ из DSL'ей для всего)

[identity profile] cp-poster.livejournal.com 2011-07-19 09:51 am (UTC)(link)
И тем не менее знаю девушек-не-программисток/админок, которые осилили lisp-based 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] metaclass.livejournal.com 2011-07-19 08:49 am (UTC)(link)
А, очень похоже. Нужно подумать над этим, возможно факторизовать кодогенератор в наборы правил будет более правильно.

[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] theiced.livejournal.com 2011-07-19 10:23 am (UTC)(link)
ребе не осилил лиспы ;)

[identity profile] metaclass.livejournal.com 2011-07-19 10:52 am (UTC)(link)
Я не пытался. За исключением использования s-expr не по назначению)

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

[identity profile] metaclass.livejournal.com 2011-07-19 11:39 am (UTC)(link)
"Eternal Friday"

[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#.

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

[identity profile] metaclass.livejournal.com 2011-07-19 08:28 pm (UTC)(link)
Не, не, я пытался на C# кодогенерировать, это кошмар.

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

[identity profile] permea-kra.livejournal.com 2011-07-20 06:19 am (UTC)(link)
А цацкель?

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

[identity profile] metaclass.livejournal.com 2011-07-20 09:47 am (UTC)(link)
Доделаю прикладную задачу, буду пытаться переселять под хаскель и линуксятину это чюдо.