Сдача проекта #
При сдаче проекта следует показать преподавателю готовый интерпретатор, соответствующий требованиям ниже.
Команда сама выбирает — сдавать проект или сдавать зачёт по теории. Есть ограничения:
- Получить оценку «отлично» можно только путём сдачи проекта
- Получить оценки «удовлетворительно» и «хорошо» можно как путём сдачи проекта, так и через зачёт по теории
Вопросы к зачёту по теории преподаватель опубликует отдельно.
Обязательные требования #
При нарушении любого из обязательных требований проект не принимается, пока нарушения не будут устранены.
Требование №1: содержание репозитория #
- При сдаче зачитывается только код, который фактически находится в облачном репозитории в ветке
main(илиmaster). - Если какой-либо код или документация находятся в другом месте, то они не засчитываются.
- Репозиторий с одним коммитом не допускается к проверке, потому что нет возможности проверить процесс разработки.
Требование №2: структура проекта на C# #
Требование не касается проектов на C++ — для них действуют индивидуальные договорённости.
Проверить соответствие этим требованиям можно с помощью скрипта dushnila.
- Проект должен следовать структуре, показанной в шаблоне и в примерах:
Ожидается такая структура каталогов проекта:
./
├── docs/ # Документация к проекту
│ ├── competitors/ # Примеры кода на других языках программирования и их анализ
│ │ ├── *.md
│ │ └── ...
│ ├── specification/ # Спецификация своего языка программирования
│ │ └── *.md
│ └── theory/ # Памятки по теории
│ └── *.md
├── src/ # Исходный код на C#, кроме тестов
│ ├── Lexer/
│ │ └── Lexer.csproj
│ ├── ...
│ └── Interpreter/
│ └── Interpreter.csproj
├── tests/ # Тесты, модульные и приёмочные.
│ ├── Lexer.UnitTests/
│ │ └── Lexer.UnitTests.csproj
│ ├── ...
│ └── Interpreter.Specs/
│ └── Interpreter.Specs.csproj
├── .editorconfig
├── Directory.Build.props # Общие параметры сборки
└── MySolution.sln # Файл решения
Обязательный файл README.md #
В корне репозитория должен быть файл README.md с кратким описанием
- Что находится в репозитории
- Как выполнить сборку и запустить тесты
Обязательный файл LICENSE #
В корне репозитория должен быть файл LICENSE (без расширения) с текстом лицензии
- К проверке допускаются только проекты с OpenSource лицензиями
- Вы можете выбрать пермиссивные лицензии: MIT, Apache, BSD, Unlicense и другие
- Либо вы можете выбрать копилефтные лицензии: GPL 3, GPL 2, MPL, LGPL и другие
- Шаблоны лицензий есть на Githab в проекте licenses / license-templates
Требование №3: Чистая сборка и тесты #
- Сборка должна проходить без ошибок и предупреждений
- Запуск тестов должен проходить без ошибок и предупреждений
Проверяется так:
dotnet clean
dotnet build
dotnet test
При этом не допускаются следующие нарушения:
- Отключены анализаторы кода из шаблона проекта на C# / .NET
- Отключены или закомментированы некоторые тесты
Способ оценки проекта #
Итоговые баллы за проект выставляются по формуле:
score = (base_score + bonus_score) × architecture_factor × completeness_factor × correctness_factor
Состав команды #
Оценка при сдаче проекта зависит от выполненных лабораторных (кроме лабораторной №1, которая не учитывается).
В зачёт идут только лабораторные, выполненные полностью аналитиком и разработчиком. Прогресс студента с ролью «эксперт» при сдаче проекта не учитывается.
Пример #
Допустим, прогресс участников команды был таким:
- Аналитик сделал задания от 1.1A до 6.1A включительно
- Разработчик сделал задания от 1.1D до 4.1D включительно
- Эксперт сделал задания от 1.1D до 2.2D включительно
В этом примере в зачёт идут лишь лабораторные №2, №3, потому что:
- Разработчик не выполнил второе задание 4-й лабораторной и не сделал заданий 5-й и 6-й лабораторных.
- Эксперт не сделал 3-ю лабораторную, но его прогресс не учитывается
Допускается ситуация, когда задания члена команды сделали другие члены команды — например, если студент с ролью «аналитик» перестал учиться, то остальные могут просто сделать задания за него.
Базовая оценка — base_score #
Базовая оценка зависит base_score от числа полностью выполненных лабораторных:
| Реализованные лабораторные | Базовая оценка |
|---|---|
| №2, №3 | 5 |
| №2, №3, №4 | 10 |
| №2, №3, №4, №5 | 20 |
| №2, №3, №4, №5, №6 | 30 |
Бонусные баллы — bonus_score #
Бонусный балл bonus_score даётся за улучшение сверх требований лабораторных.
Засчитываются только варианты улучшений, перечисленные ниже.
Бонус №1: улучшенная диагностика ошибок (+6 баллов) #
Бонус начисляется за улучшенную диагностику ошибок, при которой показывается номер строки и колонки, где возникла ошибка.
- Такая диагностика должна работать для всех видов ошибок: лексических, синтаксических, семантических.
- Если же один из видов ошибок не покрыт такой диагностикой, то бонус не начисляется.
- Для реализации потребуется добавить целочисленные свойства Line и Column в класс Token или иначе передавать информацию о местоположении токена в коде
- Также потребуется сохранять информацию о местоположении в узлах AST для передачи номера строки и колонки
- Подумайте, как правильно обрабатывать переносы строк
\n,\r,\r\n - Подумайте, как обрабатывать табуляции
\t
Бонус №2: приёмочные тесты на Gherkin (+3 балла) #
Бонус начисляется за использование языка Gherkin для приёмочных тестов.
- Тесты должны содержать все примеры, написанные аналитиком
- Тесты должны следовать правилам из статьи Gherkin для приёмочных тестов.
- Для начисления бонуса требуется, чтобы тесты на Gherkin и промежуточный код были написаны качественно и не содержали очевидных изъянов.
Требования к архитектуре — architecture_factor #
Параметр оценки architecture_factor — это число от 0.5 до 1.0 в зависимости от качества архитектуры проекта.
- Несколько существенных недостатков могут снизить параметр до 0.5
- Если существенных недостатков нет, то параметр будет равен 1.0
Эталонной считается декомпозиция на следующие модули:
graph TD
Ast["Ast"]
Execution["Execution"]
Interpreter["Interpreter"]
Lexemes["Lexemes"]
Parsing["Parsing"]
Runtime["Runtime"]
Semantics["Semantics"]
Ast --> Runtime
Execution --> Ast
Interpreter --> Execution
Interpreter --> Parsing
Interpreter --> Runtime
Interpreter --> Semantics
Parsing --> Ast
Parsing --> Lexemes
Semantics --> Ast
Semantics --> RuntimeОднако оценка зависит не от сходства с эталоном, а от уровня осознанности при декомпозиции проекта на модули.
Требования к полноте реализации — completeness_factor #
Параметр оценки completeness_factor — это число от 0.5 до 1.0, зависящее от уровня соответствия реализации и спецификации.
- Несколько существенных недостатков могут снизить параметр до 0.5
- Если существенных недостатков нет, то параметр будет равен 1.0
Для этого преподаватель вместе со студентами выборочно проверяют соответствие:
- Требований лабораторных №4, №5, №6
- Спецификации языка программирования
- Реализации языка программирования
Любое расхождение снижает оценку.
Требования к корректности реализации — correctness_factor #
Параметр оценки correctness_factor — это число от 0.5 до 1.0, зависящее от уровня покрытия различных нюансов в спецификации и в тестах.
Несколько существенных недостатков могут снизить параметр до 0.5
Если существенных недостатков нет, то параметр будет равен 1.0
Для этого преподаватель вместе со студентами выборочно проверяют спецификацию и тесты на учёт нюансов, известных преподавателю.
Набор нюансов зависит от особенностей языка, но задача команды — подумать о неочевидных вещах и подводных камнях, решить их на своё усмотрение, описать их в спецификации и покрыть тестами.
Например, язык императивный и есть поддержка пользовательских функций, а также нескольких типов данных. В этом случае логично проверить:
- У функций обязательно указывать возвращаемый ими тип?
- У функций обязательно указывать типы параметров?
- Есть ли правило семантики «Функции с возвращаемым значением обязательно заканчиваются инструкцией
return»? - Есть ли правило семантики Тип выражения во всех
returnдолжен соответствовать типу, возвращаемому функцией»? - Допускает ли язык рекурсию?
- Допускает ли язык взаимную рекурсию?
- Есть ли вложенные функции?
- Есть ли механизм захвата переменных вложенной функцией (замыканием)?
Ссылки #
- Скрипт dushnila для проверки структуры репозитория.
- Шаблон проекта на C# / .NET
- Пример PsTiger
- Шаблоны лицензий licenses / license-templates
- Gherkin для приёмочных тестов.