По работе пишу DSL, в котором смешиваются декларативные и императивные подходы. Застрял на фазе генерации промежуточного кода, потому что непонятно, как подобрать такой дизайн, который можно будет легко расширять. Например, известная форма SSA — какие абстрации выбрать для результатов операций? Должна ли "инструкция" хранить ссылку на результат, или же генератор промежуточного кода должен возвращать кортеж из адреса и инструкции? Или адреса и аккумулятора инструкций? И всё в таком духе.
Какие можно посмотреть проекты, где идеи компиляторов реализованы на бОльшем уровне нежели студенческая курсовая, но при этом не так сложно, как в GCC и LLVM? В книжках (Modern Compiler Design, Engineering a Compiler), к сожалению, очень-очень-очень поверхностный псевдокод и куча "капитанских" идей, до которых человек, решивший писать компилятор, в состоянии дойти самостоятельно. Парадокс, но the dragon book на фоне остальных смотрится куда как более фундаментальной, хотя есть мнение, что для разработки современных компиляторов её даже открывать не стоит.
P.S. Открыл код CPython. Лексер и парсер реализованы вручную. Закрыл код CPython.