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

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

Date: 2011-07-19 08:02 am (UTC)
From: [identity profile] xeno-by.livejournal.com
Подскажите, пожалуйста, для MPS есть альтернативный туториал? Уже не в первый раз пытаюсь осилить официальный гайд, но моск взрывается раньше, чем дохожу даже до середины.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Date: 2011-07-19 09:51 am (UTC)
From: [identity profile] cp-poster.livejournal.com
И тем не менее знаю девушек-не-программисток/админок, которые осилили lisp-based DSL.

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

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

Date: 2011-07-19 08:49 am (UTC)
From: [identity profile] metaclass.livejournal.com
А, очень похоже. Нужно подумать над этим, возможно факторизовать кодогенератор в наборы правил будет более правильно.

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

Date: 2011-07-19 10:23 am (UTC)
From: [identity profile] theiced.livejournal.com
ребе не осилил лиспы ;)

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

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

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

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

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

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

Если уж писать кодогенератор, так подобие монад на обычном C# соорудить и строить код. Applicative на C# уж точно выйдет, а это больше половины дела. И отлаживаться можно нормально, и обращаться в/из C#. Куда лучше F#.
From: [identity profile] metaclass.livejournal.com
Не, не, я пытался на C# кодогенерировать, это кошмар.
From: [identity profile] metaclass.livejournal.com
Доделаю прикладную задачу, буду пытаться переселять под хаскель и линуксятину это чюдо.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 01:02 pm
Powered by Dreamwidth Studios