Можем либо здесь обсуждать, либо перенести на какую-нибудь выделенную площадку. Если здесь, тогда стоит перенести в новую ветку, т.к. создание компиляторов, в принципе, будет интересно немалой части слушателей подкаста.
Могу помочь с рецензированием/контентом, но я больше интересуюсь практикой (я на работе, по большому счету, проектирую некоторую разновидность компилятора).
Есть пара общих советов:
- Большинство книг и курсов начинают обсуждение с парсинга и лексического анализа, что, на мой взгляд, очень глупая идея - парсинг ведь всего лишь средство построения деревьев. Я бы начинал с представления программы в виде дерева (как делают в SICP)
- Оптимизации, по крайней мере общий подход, стоит описывать в начале курса с кучей примеров практического применения. Например, в языке описания запросов связка join -> filter должна практически всегда переписываться на filter -> join
- Я не видел в книгах описаний PEG, так как тема достаточно новая. Если уж и говорить о курсе программирования, лучше описывать ее, т.к. нет ambiguity в разборе выражений.
Еще, про ML и тому подобные языки. Если есть нормальная система типов с Sum & Product types, формальное описание языка становится очень простым и надежным. Опять же, если понять базовые принципы построения деревьев, можно использовать не только для компиляторов, но и для более интересных практических вещей, например, преобразования функций в набор выражений, которые будут оптимизироваться, например, распределенной базой данных.
Про оптимизации и в принципе пайплайнинг - очень интересна тема преобразования деревьев в разные формализмы (например, прямое представление языка - оптимизированное дерево - внутреннее представление - машинный код) без создания суперсета всех представлений - то, что в большинстве курсов и практических реализаций отсутствует.
И напоследок, интересная ссылка - https://www.youtube.com/watch?v=TQIHRBXM75E