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