Большинство книг и курсов начинают обсуждение с парсинга и
лексического анализа, что, на мой взгляд, очень глупая идея - парсинг
ведь всего лишь средство построения деревьев.
У меня первая лекция вводная про тему в целом, потом вторая про лексический анализ и третья про синтаксический/семантический. Обычно этому уделяют больше половины курса, но сейчас у меня нет такой возможности. Как минимум я бы вынес в отдельную тему семантический анализ.
Я бы начинал с
представления программы в виде дерева (как делают в SICP)
Пока что это нарушило бы определённую логик уповествования. Я пытаюсь преподносить информацию следующим образом: есть набор символов -> нужно понять что он допустим -> для обработки нужно построить дерево -> для оптимизаций нужно построить собственное представление. Мне кажется что это логично, т.к. четвёртой лекцией у меня идёт как раз представление программы внутри компилятора с объяснением основных аналитических структур (cfg, def-use graph и т.д.).
Например, в языке
описания запросов связка join -> filter должна практически всегда
переписываться на filter -> joinЯ не видел в книгах описаний PEG, так как тема достаточно новая.
Если уж и говорить о курсе программирования, лучше описывать ее, т.к.
нет ambiguity в разборе выражений.
Еще, про ML и тому подобные языки. Если есть нормальная система типов
с Sum & Product types, формальное описание языка становится очень
простым и надежным. Опять же, если понять базовые принципы построения
деревьев, можно использовать не только для компиляторов, но и для более
интересных практических вещей, например, преобразования функций в набор
выражений, которые будут оптимизироваться, например, распределенной
базой данных.
Вот тут уже начинаются термины, которые мне не очень понятны плюсь непосредственно ML. Т.к. я работаю с компилятором Си, и базовая кафедра выпускает специалистов для себя, то в всё преподавание нацеленно именно на него.
Про оптимизации и в принципе пайплайнинг - очень интересна тема
преобразования деревьев в разные формализмы (например, прямое
представление языка - оптимизированное дерево - внутреннее представление
- машинный код) без создания суперсета всех представлений - то, что в
большинстве курсов и практических реализаций отсутствует.
Я их учу тому как оно работает у нас на практике, т.е. рассматривать программу как граф. Более того у нас два внутренних представления. Вообще в этом году я пришёл к следующей логике повествования:
- Введение
- Фронтенд (лексическа + синтаксис + семантика)
- Внутреннее представление
- Распределение ресурсов
- Локальные оптимизации (в пределах линейного участка)
- Оптимизации cfg
- Оптимизации памяти
- Цикловые оптимизации
- Межпроцедурные и межмодульные оптимизации
- Анализ указателей
В целом я примерно это читал и раньше, но в другом порядке, плюс мне не очень нравилось как я это читал, плюс т.к. я занимаюсь довольно узким спектром вопросов, мне сложно собирать материал по всем темам сразу.