Эпик №1: базовый уровень языка

Эпик №1: базовый уровень языка #

К сдаче третьей итерации — то есть первого эпика целиком — ваш проект должен выполнять два новых требования:

  1. Если вы пишете интерпретатор со своей VM, то нужно описать спецификацию вирутальной машины
  2. Если вы пишете компилятор или интерпретатор на C#, то нужно провести анализ покрытия кода тестами

Для компиляторов на C++/LLVM новых требований нет.

Требование №1. Спецификация виртуальной машины #

Если вы разрабатываете интерпретатор со своей виртуальной машиной, то вы должны добавить файл 04_virtual_machine.md, который содержит:

  • диаграмму, показывающую структуру вашей виртуальной машины
  • текстовые пояснения к диаграмме
  • список всех инструкций виртуальной машины с подробным описанием поведения каждой из них

Пример такой спецификации есть в PsTiger.

Диаграммы #

Диаграммы можно оформлять на языке Mermaid либо добавлять как изображения, экспортированные из Drawio

https://mermaid.js.org/syntax/classDiagram.html#syntax

Mermaid-диаграммы вставляются в markdown как блоки кода:

```mermaid
---
title: Bank example
---
classDiagram
    class BankAccount
    BankAccount : +string owner
    BankAccount : +decimal balance
    BankAccount : +deposit(decimal amount)
    BankAccount : +withdrawal(decimal amount)
```

Если вы предпочитаете drawio, то рекомендуется установить оффлайн приложение: https://www.drawio.com/

  • Диаграммы из Drawio можно экспортировать в формате PNG
  • Изображения в markdown добавляются так: ![alt-текст](URL), например: ![Схема](img/virtual-machine.png)

Требование №2. Анализ покрытия кода тестами #

Если вы разрабатываете проект на C#, то вы должны:

  1. Добавить возможность запуска тестов с анализом покрытия кода: см. Анализ покрытия тестами кода для C#/.NET.
  2. Провести как минимум один такой анализ и покрыть тестами существенные фрагменты кода, которые не были покрыты ранее

Как определить, что покрывать тестами #

Существенными фрагментами кода мы считаем все методы и участки кода с нетривиальным поведением — например, чтение экранированных символов в литералах строк.

Несущественные фрагменты кода можно тестами не покрывать.

Точно не требуют покрытия тестами:

  1. Выброс исключений, которые не должны возникать при нормальной работе компилятора
  2. Фрагменты кода в 1-2 строки, используемые для утилитарных целей
  3. Код, используемый только в тестах (однако такой код лучше разместить где-то в каталоге tests/)

Стратегия тестирования #

Вы должны сделать фокус на приёмочные тесты, запускающие интерпретатор целиком:

  1. Для C# тесты должны строиться на XUnit. По желанию можно использовать языки Gherkin с помощью фреймворка Reqnroll.
  2. Каждая итерация сопровождается доработками приёмочных тестов
  3. Нужно сделать два вида приёмочных тестов
    • тесты отдельных функций языка — можно поместить их в подкаталоге Features/
    • тесты полноценных программ — можно поместить их в подкаталоге Programs/