Задание 6.1A

Лабораторная №6 — задание 6.1A #

Нужно написать спецификацию семантики типов данных в своём языке программирования и внести связанные изменения в другие файлы спецификаций.

Порядок выполнения. #

Изменения зависят от особенностей вашего языка — это описано далее.

  1. Определите, какие три типа данных вы будете поддерживать — см. варианты ниже
  2. Напишите примеры программ под каждый тип данных — см. информацию ниже
  3. Создайте в проекте файл docs/specification/types.md для спецификации семантики типов
  4. Напишите спецификацию, учитывая предлагаемую структуру и список особенностей ниже
  5. Проверьте остальные документы в docs/specifications
    • не допускаются противоречия между разными документами
    • нежелательно дублировать информацию между разными документами

Варианты наборов типов данных #

Выберите для своего языка три типа данных из списка ниже:

  1. Строковый тип — как string в C#
  2. Целые числа (32-битные либо 64-битные) — как int или long в C#
  3. Числа с плавающей точкой — как double в C#
  4. Числа с плавающей точкой в десятичной системе счисления — как decimal в C#
  5. Булев тип — как bool в C#
  6. Символьный тип — как char в C# либо как char8_t, char16_t или char32_t в C++

Кроме того, надо поддерживать пустой (выражение без возвращаемого типа) — как void в C#

Уточнения:

  1. Вы можете поддерживать большее число типов, но это не рекомендуется.
  2. Как минимум один из типов должен быть числовым
  3. Как минимум один из типов должен быть нечисловым — то есть строковым, символьным или булевым

Выбор примеров программ #

Выберите и напишите два-три примера программ так, чтобы продемонстрировать работу каждого из типов данных.

Список возможных примеров:

  1. ReverseString — читает строку, переворачивает её символы и печатает результат
    • Пример: “Hello world!” → “!dlrow olleH”
    • Подсказка: используйте технику двух указателей (two pointers) для переворота строки
  2. CheckPalindrome — читает строку и печатает “yes”, если это палиндром, а иначе печатает “no”
    • Палиндром — это строка, которая читается одинаково как слева направо, так и справа налево
    • Подсказка: используйте технику двух указателей (two pointers) для проверки на палиндром
    • Вы должны сделать проверку нечувствительной к регистру
    • Пример: “Hello” → “no”
    • Пример: “Anna” → “yes”
  3. ToLower — читает строку, переводит все её символы в нижний регистр и печатает результат
    • Пример: “Hello world!” → “hello world!”
  4. CountVowels — читает строку и выводит число гласных букв английского алфавита в этой строке
    • Пример: “Hello world!” → “3”
  5. ValidateIpv4 — читает строку и проверяет, что это допустимый IPv4 адрес
    • Для допустимых адресов печатает “yes”
    • Для недопустимых печатает “no”
  6. FizzBuzz — читает число за числом в цикле и далее печатает:
    • “Fizz”, если число делится на 3
    • “Buzz”, если делится на 5
    • “FizzBuzz”, если число делится и на 3, и на 5
    • Само число в остальных случаях
  7. ValidateDate — читает дату в формате “YYYY-MM-DD” и проверяет корректность указанной даты
    • Для допустимых дат печатает “yes”
    • Для недопустимых печатает “no”
    • Следует поддерживать как минимум даты в диапазоне от 1000-01-01 до 2999-12-31
    • Пример: “2025 february 10” → “no”
    • Пример: “2025-02-10” → “yes”
    • Пример: “2025-02-29” → “no”
  8. IsLeapYear — читает номер года, проверяет, является ли он високосным, печатает “yes” или “no”
    • Проверять надо согласно григорианскому календарю
    • Пример: “2025” → “no”
    • Пример: “2024” → “yes”
    • Пример: “1600” → “no”
    • Пример: “2000” → “yes”

Предлагаемая структура документа #

Можно задать следующие разделы:

НазваниеЧто содержит
Краткое описаниеСписок типов данных и ключевые принципы
ЛитералыОписание литералов для всех типов данных
ОператорыСемантика операторов для всех типов данных
ПеременныеСемантика объявлений и присваиваний переменных

Вопросы на подумать #

Ниже перечислены вопросы, над которыми стоит подумать при написании спецификации.

Объявление переменных и присваивания #

  1. Обязательно ли указывать тип переменной? Если нет, то как выводятся типы (как работает type inference)?
  2. Можно ли изменить тип переменной присваиванием?

Преобразования типов #

  1. Разрешены ли неявные преобразования?
  2. Разрешены ли явные преобразования?
  3. Какие встроенные функции позволяют преобразовывать типы данных?
    • Пример: функция ord(c: char): int преобразует символ в число, представляющее его ASCII-код
    • Пример: функция parseInt(s: string): int преобразует строку в число, интерпретируя входную строку как запись числа в десятичной системе счисления

Целочисленный тип #

  1. Сколько байт вмещает целочисленный тип?
  2. Как преобразовать целое число в другие поддерживаемые типы данных?

Числа с плавающей точкой #

  1. Какие операции поддерживаются для чисел с плавающей точкой?
  2. Какой формат чисел с плавающей точкой — IEEE 754 binary32 (как float в C#), IEEE 754 binary64 (как double в C#) или иной?

Булев тип данных #

  1. Для каких операторов следует реализовать вычисление по короткой схеме (short-circuit evaluation)?
  2. Как преобразовать число в булев тип?
  3. Как напечатать значение булева типа?

Строковый тип #

  1. Как преобразовать строку в число и обратно?
  2. Строки поддерживают только ASCII или ещё и подмножество Unicode?
  3. В какой кодировке хранятся символы в строке (ASCII, UTF-8, UTF-16, UTF-32)?
  4. Как конкатенировать строки?
  5. Как выделить подстроку?

Символьный тип #

  1. К какой кодировке относится символ?
    • ASCII — 1-байтные символы с кодами 0..127
    • UCS-2 — 2-байтные символы, соответствующие символам Basic Multilingual Plane в Unicode
    • Unicode — 4-байтные символы
  2. Как преобразовать символ в целое число и обратно?

Справочные материалы #

  1. Пример PsTiger
  2. Лекция 10. Типы данных