Учебный курс «Проектирование компиляторов» - 2023

Прочитал очередной семестр курса компиляторов. Получилось довольно любопытно, и добавилось много идей для переосмысления. В этом году у меня была сложная группа, т.к. среди магистрантов только два учились на этом факультете. Остальные пришли с инженерных специальностей и обладали околонулевой базой. Читать в таких условиях компиляторы довольно сложно, и в итоге мы даже не дошли до оптимизаций. Далее распишу основные моменты по пунктам.

Фактические заметки

Организационные заметки

Заметки по теории

Заметки по практике:

Выводы по семестру

Организационные

  1. Нужно изменить систему бонусов. Во-первых убавить её так, чтобы нельзя было получить более одного балла сверху. И даже этот бал за что-то достаточно выдающееся.
  2. Нужно вести нормальный учёт посещаемости. И перестать говорить, что я посещаемость не учитываю. С отмазкой вроде «у меня работа, я не успеваю на лекции» надо быть жёстче. Сказал студенту, что у меня тоже работа, но на лекции почему-то хожу.
  3. Хочу большое вовлекать студентов в полезную деятельность. Для этого нужен какой-то проект, который можно разрабатывать. Соответственно, хочу предложить им вариант выполнения части проекта в обмен на автомат. Осталось только найти проект.

Теоретическая часть

  1. Сейчас появилось понимание, что я его фундаментально делаю неправильно (да, опять). Общие очертания, конечно, останутся, но я активно работаю над тем чтобы он стал как единое целое. Это прямо пересекается с общим проектом, над которым могли бы работать студенты.
  2. Лекция по аппаратной части нужна между окончанием семантического анализа и началом промежуточного представления. Иначе студенты не понимают, почему представление такое, какое оно есть, и не понимают кодогенерацию.
  3. Раньше читал аппаратную часть и время исполнения в одной лекции. Это не правильно время исполнения (стант программы, процедурный механизм, структура исполняемого файла) нужно читать после кодогенератора отдельной лекцией.
  4. В лекциях нужно прямо приводить примеры кода, реализующие те или иные структуры. Например, приводить реальный код реализации узла ast.
  5. В качестве примеров в лекциях нужно своё собственное промежуточное представление, и свой собственный виртуальный ассемблер. Это ещё раз к вопросу о большом проекте.
  6. Потенциальная возможность задания по написанию реферата всё ещё открыта.
  7. Заметил, что много ссылок на учебные курсы из вражеских стран уже не актуальны - все попрятали материалы. Нужно пройтись и актуализировать список.

Практическая часть

  1. Нужно поднять сервер с автоматизированной проверкой задания. Сейчас я проверяю только в ручную, но это занимает определённое время, и наверняка какие-то случаи я упускаю.
  2. Раньше я говорил, что количество попыток сдачи не важно. У некоторых студентов оно переваливает за 10. Тестировать студенты абсолютно не умеют и не хотят. Буквально, не глядя в код нахожу ошибки с первой попытки. Если внедрять автоматизированное тестирование, то нужно исключить вариант брут-форса проверочной системы. А значит, нужно ограничение на количество попыток. Например, после 5 неудачных попыток - минус балл. Должно стимулировать писать тесты.
  3. Разрешать писать bash-скрипт вместо Makefile было ошибкой. Теперь только Makefile.
  4. Нужно явно прописать в задании, что если sanitaizer ломается, то я работу не принимаю. Разумеется, он у всех ломается, и многие даже не понимают, почему это плохо.
  5. В целом по концепции задач: сейчас я даю программируемый калькулятор, но это задание довольно легко гуглится, и возникает большой соблазн его списать. Некоторые преподаватели в качестве задания дают даже реализацию Форта своим студентам. Надо в эту сторону подумать.
  6. После первой лекции нужно проводить отдельную лекцию, где я озвучиваю требования, основные проблемы и подходы к практической работе. Включая проверку, необходимость писать тесты, создание архива и сценариев сборки.

Материалы курса

Лекция 1. Введение в компиляторы. (слайды)

Лекция 2. Лексический анализ. (слайды)

Лабораторная работа 1. Создание лексического анализатора. (текст)

Лекция 3. Синтаксический анализ. (слайды)

Лабораторная работа 2. Создание синтаксического анализатора. (текст)

Лекция 4. Семантический анализ. (слайды)

Лабораторная работа 3. Создание дерева разбора. (текст)

Лекция 5. Внутреннее представление программы в компиляторе. (слайды)

Лекция 6. Создание целевого кода. (слайды)

Лекция 7. Время исполнения программы. (слайды)

Лекция 8. Оптимизации памяти.

Вопросы к зачёту (список)

Литература по курсу (список)