Учебный курс «Проектирование компиляторов» - 2024
Закончил большую часть курса этого года. Большую - потому что остались должники, которые планируют всё-таки досдать материал. Двое даже с прошлого года (уходили в академ). По сравнению с прошлым годом внёс некоторые усовершенствования, и готов дорабатывать курс дальше. Итак, что же получилось в этом году, и куда двигаться.
Фактические заметки
Организационные заметки
- Из 14 человек до зачёта дошли 8 (плюс один второгодник). При этом один из недопущенных заявил, что хочет сдавать осенью. Как он это собирается делать мне не понятно.
- Из тех, кто дошёл до зачёта сдали все. У одного студента при этом будет проставлен недопуск, т.к. критерии допуска к зачёту выполнены не были.
- Впервые пришлось срезать уже проставленную оценку за зачёт, причём двум студентам. Ситуация: зачёт прошёл, оценки к себе на бумажку записал. Один студент (тот, что с недопуском) очень хочет успеть поставить оценку в основную сессию, а не осенью. Для этого необходимо досдать лабораторные работы. Студент списывает работу у своего товарища, на чём он попадается. Из объяснения - думали, что если зачёт сдан, и оценка поставлена, то уже ничего страшного. Но оказалось, что оценка не поставлена, поэтому наказываются оба студента.
- Учёл вывод прошлого года: уменьшил количество бонусов, и теперь максимум можно получить +1 балл (по пятибалльной шкале). Гораздо более справедливая система.
- Учёл вывод прошлого года: посещаемость явным образом ведётся, гораздо понятней кто и как работает в семестре.
- Учёл вывод прошлого года: стараюсь вести телеграм-канальчик с различными новостями мира компиляторов. К сожалению, не получается делать это регулярно, но уж лучше так, чем никак.
Заметки по теории
- Сама теоретическая часть прошла ровно. Как и в прошлом году, студенты не воспринимают общей картины. Всё ещё не очень понимаю, в чём причина. Также накладывается то, что уже через неделю они не могут вспомнить материала предыдущей лекции. Тут сложно сделать что-то в рамках одного курса. Ещё важный момент - крайне слабая подготовка на входе (в заметках по практике будет хороший пример).
- Добрались до оптимизаций, однако не успели рассмотреть цикловые и межпроцедурные. Если бы не несколько пропущенных лекций, то вполне можно было бы успеть и их.
- В голове немного меняется представление о том, как надо подавать оптимизации. Раньше оптимизации структурировались по своей локальности: те, что работают по потоку данных или на небольшом окне операций, те, что на уровне графа потока управления, те, что на уровне процедуры, межпроцедурные. Сейчас больше прихожу к выводу, что нужно идти от решаемой проблемы: показать, где основные проблемы и возможности улучшения производительности, и какие оптимизации для решения этих проблем существуют.
- Учёл вывод прошлого года: добавил курсовой проект. Наверное, одно из самых удачных решений этого года. Проект заключается в том, что нужно выбрать тему, изучить её и выступить с докладом на 10 минут. Считаю, что получилось весьма неплохо, но ошибкой было давать возможность выбирать темы вида «обзор проекта». Например, студент выбирает тему «Обзор архитектуры компилятора gcc», и, разумеется, ничего написать по этой теме не может. В следующем году оставлю только возможность делать доклад по одной научной публикации.
- Учёл вывод прошлого года: снова рассказываю аппаратную часть отдельной лекцией между фронтендом и мидлендом.
Заметки по практике:
- Учёл вывод прошлого года (частично): сервер проверки не поднял, но автоматизированную проверку ввёл. Позволяет проверять работы гораздо быстрее и тратить меньше времени на описание ошибок.
- Учёл вывод прошлого года: сделал отдельные слайды с требованиями к выполнению работ. В требования включил проверку с sanitaizer'ом, сборкой Makefile'ом и к структуре проекта. Провёл отдельную лекцию с пояснениями. Кроме того сделал вводную работу, о которой расскажу ниже.
- Учёл вывод прошлого года: теперь за количество попыток снижаются баллы. Более того, уменьшил коэффициент бонуса. Теперь максимум +1 балл за все работы плюс один балл за работу на лекциях.
- Чтобы уменьшить количество неудачных попыток из-за технических моментов, добавил первую лабораторную работу. Задание - написать программу «Hello, world», удовлетворяющую всем требованиям. С первого раза не справился никто (по крайней мере из тех, кто вовремя сдавал). Это задание не входит в систему оценивания. Помогло студентам сориентироваться в выполнении требований.
- В среднем сдавали работы неплохо. Можно попробовать ввести следующую работу на генерацию кода.
Выводы по семестру
Организационные
- Нужна дальнейшая корректировка системы бонусов - 5 попыток, дальше минус балл (изначально так и хотел, но на лекции и в слайдах случайно указал 10). Более того, следует ввести отрицательные баллы - когда оценка за работу уходит в минус, следует снимать баллы на зачёте. Ситуации, когда оценка уходит в минус характерна для студентов, которые пытаются сдавать всё в последний момент и получают минусы за несоблюдение сроков.
- В целом на факультете крайне не хватает курсов системщины. Основная проблема - как всегда кадры, точнее их отсутствие. К сожалению, я не могу бросить всё и заниматься только преподаванием. Пока что выхода из этой ситуации нет.
Теоретическая часть
- Общего проекта, который хотел давать студентам пока нет, и пока что не будет, но очертания курса незначительно меняются (допиливаются напильником). Сейчас основная проблема - отсутствие источников материала. Я уже много лет хочу написать свой учебник, но каждый раз не получается собраться и сделать его хорошо.
- Частично сделал, но надо продолжать улучшать: в лекциях нужно прямо приводить примеры кода, реализующие те или иные структуры. Например, приводить реальный код реализации узла ast.
- Сохраняется с прошлого года: в качестве примеров в лекциях нужно своё собственное промежуточное представление, и свой собственный виртуальный ассемблер. Это ещё раз к вопросу о большом проекте.
- Сохраняется с прошлого года: заметил, что много ссылок на учебные курсы из вражеских стран уже не актуальны - все попрятали материалы. Нужно пройтись и актуализировать список.
- Курсовой проект с небольшим докладом был удачной идеей, но требует корректировки. Ошибкой было давать возможность выбирать общие темы. Курсовой проект следует ограничить разбором одной академической публикации.
Практическая часть
- Можно добавить пятую работу по кодогенерации.
- Усовершенствовать тестирование: добавить разных sanitaizer'ов, valgring, поглядеть в сторону fuzzing-тестирования.
- Всё ещё не придумал разных задач для повышения вариативности, но есть некоторые идеи. Во-первых нужно отказаться от калькулятора двоичных выражений (он значительно проще двух других вариантов). Во-вторых можно попробовать варьировать инфиксную и постфиксную грамматику. В-третьих, при добавлении работы на кодогенератор, можно варьировать целевой язык. Так получится достаточное количество комбинаций и защита от списывания.
Материалы курса
Материалы с прошлого года почти не изменились, приводить здесь не буду.