/cast true_admin; анонимус, толкавший nanopass народу; другой умный анонимус
Мне одному кажется, что оригинальной реализации сабжа от Эндрю Кипа и компании для commercial compiler development недостаёт хоть чего-то для обработки ошибок и реализации макросов?
Для сообщений об ошибках надо писать свой парсер и подпиливать грамматику языка, чтобы прямо в программе сохранять информацию о положении конструкций в исходнике. Для макросов надо вообще городить свои pattern matcher и code walker, потому что всё оригинальное добро на клёвом compile-time syntax-case и — сюрприз! — не позволяет доопределять языки в рантайме.
Итого что в осадке остаётся? Разве что идеи о том, 1) что маленькие специализированные проходы удобнее комбинировать и дорабатывать, чем большие монолитные, 2) что eDSL лучше сраной кодогенерации, 3) что pattern matching удобен для написания трансляторов. Ну, блин, это вроде и так очевидные вещи.
Есть, правда, ещё идея о постоянном сохранении синтаксической корректности преобразований, но у меня есть некоторые сомнения в её радикальной полезности, ведь с понижением уровня языка и сокращением количества конструкций становится всё легче выдавать синтаксически корректную околесицу.
В общем, правы были те ребята из ICFP о том, что nanopass годится только как наглядное пособие для обучения. Даже во второй инкарнации. Ну, или как, э-э-э... pattern matcher для бек-энда, если закрыть глаза на обработку ошибок.
Я уж думал, появилось хоть что-то, уменьшающее количество ad-hoc решений при реализации языков. Но, похоже, создание подходящих утилит всё ещё остаётся искусством.
/discuss