Учебный курс «Проектирование компиляторов» - 2023
Прочитал очередной семестр курса компиляторов. Получилось довольно любопытно, и добавилось много идей для переосмысления. В этом году у меня была сложная группа, т.к. среди магистрантов только два учились на этом факультете. Остальные пришли с инженерных специальностей и обладали околонулевой базой. Читать в таких условиях компиляторы довольно сложно, и в итоге мы даже не дошли до оптимизаций. Далее распишу основные моменты по пунктам.
Фактические заметки
Организационные заметки
- Изначально в списке группы было 23 человека. К моменту зачёта в ведомости было 19 человек. 9 человек получили недопуск. У одного неявка. Сдали хорошо, преимущественно за счёт бонусных баллов (как среднее за выполненные лабораторные работы и за работу на лекциях).
- За выполнение лабораторных работ и активность на лекциях я начисляю бонусные баллы к оценке за зачёт. Сейчас есть ощущение, что +4 балла (десятибалльных) - слишком много и слишком смещает оценку. Такая щедрость была оправдана, когда я не мог заставить студентов выполнять работы (их не было в плане), но сейчас свою актуальность бонусы потеряли. Проблема в том, что они дают сильное искажение оценки. И вот один из примеров ниже.
- Впервые студент попросил у меня поставить вместо пятёрки четвёрку. Ситуация такая: отвечает весьма плохо, но бонусы обеспечивают ему отлично. Он сам понимает, что ответ максимум на три. В итоге я согласился, поставить ему четыре, но такой подход весьма уважаю. Надеюсь молодой человек найдёт себя в этом мире.
- Спустя два года наконец вернулся к очному формату, и он мне нравится гораздо больше. А вот студентам меньше - лекции на запись не поставишь, да ещё и ездить приходится. Теперь пытаются фотографировать слайды - писать контексты нынче не модно. Даже печатать их не модно. Хоть вводи конспект как обязательное требование.
Заметки по теории
- В этом семестре лекции начались с большой задержкой. Это и несколько других факторов привели к тому, что до лекций по оптимизациям даже не добрались. Получился почти классический курс компиляторов (хотя на самом деле гораздо лучше).
- Ради эксперимента решил лекцию по аппаратной части перенести на момент после кодогенератора. Логика была примерно такая: проходим лицевую часть->кодогенератор->исполняемый файл. В итоге эта идея потерпела полное фиаско в момент когда стали говорить про планирование инструкций (даже раньше, т.к. не очень понятно что такое LD/ST и откуда они вообще взялись). Выяснилось, что студенты не понимают, что такое задержка инструкции. И что такое конвейер тоже не знают. В итоге пришлось это объяснять, импровизированно, рисуя у доски. И заняло это три лекции вместо одной.
- Создалось впечатление, что пока не удаётся донести общую картину происходящего. Предполагаю, что всё ещё слишком слабая согласованность материала и отсутствие целостного подхода.
Заметки по практике:
- В этом семестре, несмотря на поздний старт, удалось взять планку в три обязательные лабораторные работы (без них в ведомость оценка не проставляется). Это прогресс, нужно дальше работать в этом направлении.
- За несколько раз удалось отбить желание списывать. Система, когда снимаются бонусные баллы и у источника, и у списавшего хорошо работает. Ну и надо отдать должное студентам - многие принципиально пытались делать сами. Ещё одна из проблем в том, что расширенная версия этих работ лежит в исходниках у меня на сайте как пособие по разработке компилятора. Студенты это пособие быстро нашли и даже попытались мне в почти неизменном виде сдать. К счастью успели проговорить, что оттуда тоже списывать не стоит, и больше таких проблем не возникало.
- Уверяли, что не использовали ChatGPT для моего предмета (подошёл, когда они обсуждали как с его помощью выполнили работы по другому предмету). В целом, судя по ошибкам и характеру кода - верю.
- Большинство студентов не владеет Си. И даже в C++ ручное управление памятью для них - неподъёмная задача. И это по специальности системное программирование!
Выводы по семестру
Организационные
- Нужно изменить систему бонусов. Во-первых убавить её так, чтобы нельзя было получить более одного балла сверху. И даже этот бал за что-то достаточно выдающееся.
- Нужно вести нормальный учёт посещаемости. И перестать говорить, что я посещаемость не учитываю. С отмазкой вроде «у меня работа, я не успеваю на лекции» надо быть жёстче. Сказал студенту, что у меня тоже работа, но на лекции почему-то хожу.
- Хочу большое вовлекать студентов в полезную деятельность. Для этого нужен какой-то проект, который можно разрабатывать. Соответственно, хочу предложить им вариант выполнения части проекта в обмен на автомат. Осталось только найти проект.
Теоретическая часть
- Сейчас появилось понимание, что я его фундаментально делаю неправильно (да, опять). Общие очертания, конечно, останутся, но я активно работаю над тем чтобы он стал как единое целое. Это прямо пересекается с общим проектом, над которым могли бы работать студенты.
- Лекция по аппаратной части нужна между окончанием семантического анализа и началом промежуточного представления. Иначе студенты не понимают, почему представление такое, какое оно есть, и не понимают кодогенерацию.
- Раньше читал аппаратную часть и время исполнения в одной лекции. Это не правильно время исполнения (стант программы, процедурный механизм, структура исполняемого файла) нужно читать после кодогенератора отдельной лекцией.
- В лекциях нужно прямо приводить примеры кода, реализующие те или иные структуры. Например, приводить реальный код реализации узла ast.
- В качестве примеров в лекциях нужно своё собственное промежуточное представление, и свой собственный виртуальный ассемблер. Это ещё раз к вопросу о большом проекте.
- Потенциальная возможность задания по написанию реферата всё ещё открыта.
- Заметил, что много ссылок на учебные курсы из вражеских стран уже не актуальны - все попрятали материалы. Нужно пройтись и актуализировать список.
Практическая часть
- Нужно поднять сервер с автоматизированной проверкой задания. Сейчас я проверяю только в ручную, но это занимает определённое время, и наверняка какие-то случаи я упускаю.
- Раньше я говорил, что количество попыток сдачи не важно. У некоторых студентов оно переваливает за 10. Тестировать студенты абсолютно не умеют и не хотят. Буквально, не глядя в код нахожу ошибки с первой попытки. Если внедрять автоматизированное тестирование, то нужно исключить вариант брут-форса проверочной системы. А значит, нужно ограничение на количество попыток. Например, после 5 неудачных попыток - минус балл. Должно стимулировать писать тесты.
- Разрешать писать bash-скрипт вместо Makefile было ошибкой. Теперь только Makefile.
- Нужно явно прописать в задании, что если sanitaizer ломается, то я работу не принимаю. Разумеется, он у всех ломается, и многие даже не понимают, почему это плохо.
- В целом по концепции задач: сейчас я даю программируемый калькулятор, но это задание довольно легко гуглится, и возникает большой соблазн его списать. Некоторые преподаватели в качестве задания дают даже реализацию Форта своим студентам. Надо в эту сторону подумать.
- После первой лекции нужно проводить отдельную лекцию, где я озвучиваю требования, основные проблемы и подходы к практической работе. Включая проверку, необходимость писать тесты, создание архива и сценариев сборки.