Skip to content

Releases: andrey-terekhov/RuC

Compiler v2.2.0

12 Nov 14:38
Compare
Choose a tag to compare

Нововведения:

  • Добавлена функция exit(int)
  • Добавлен тип enum
  • Добавлена свертка констант, что позволяет требовать константность внутри выражения case

Внутренние улучшения:

  • Рефакторинг печати промежуточных представлений (дерева и таблиц, человекочитаемых кодов RuC-VM)
  • Дерево выражений теперь строится снизу вверх, что позволяет отказаться от дополнительных проходов для регистровых машин
  • Использование новой библиотеки strings для хранения значений строковых литералов
  • Добавлены узлы объявлений параметров функций

Исправления:

  • Исправлены проверки операндов присваивания
  • Исправлены ошибки взаимодействий с типом void* (void*)
  • Исправления внутренней библиотеки item_t

Compiler v2.1.1

17 Aug 22:23
018e3cf
Compare
Choose a tag to compare

Исправления:

  • Реализована расширяемость структуры workspase, путем замены статических массивов на вектора строк
  • Конструкции t_create_direct и t_exit_direct удалены, как нерабочие
  • Удалена функция fread, из-за сложности ее поддержки в виртуальной машине
  • Добавлены проверки index != SIZE_MAX в функции быстрого доступа, с постфиксом by_index
  • Оптимизирована логика добавления строковых ключей в ассоциативный массив
  • Исправлена обработка пустых ключей в map_last_read
  • Исправлена очистка памяти в strings_remove

Улучшения:

  • Добавлена функция быстрого получения длины строки в strings.h:
size_t strings_get_length(const strings *const vec, const size_t index);
  • Добавлены функции удаления записи в hash.h:
int hash_remove(hash *const hs, const item_t key);
int hash_remove_by_index(hash *const hs, const size_t index);
  • Добавлены функции получения индекса в map.h:
size_t map_get_index(map *const as, const char *const key);
size_t map_get_index_by_utf8(map *const as, const char32_t *const key);
size_t map_get_index_by_io(map *const as, universal_io *const io, char32_t *const last);

Compiler v2.1.0

13 Aug 17:36
Compare
Choose a tag to compare

Добавлены следующие улучшения:

  • Добавлена начальная инициализация таблицы идентификаторов
  • Добавлен тип builtin_t для встроенных функций
  • Разбор встроенных функций теперь производится также, как и пользовательских
  • Во время кодогенерации, встроенные функции подменяется инструкциями
  • Добавлены конструкторы типов массивов и указателей
  • Реализовано ключевое слово typedef
  • Добавлен следующий интерфейс работы с файлами:
FILE *fopen(char fname[], char mode[]);

char fgetc(FILE *stream);
char fputc(char ch, FILE *stream);

int fclose(FILE *stream);

Проведен рефакторинг кодогенератора виртуальной машины:

  • Переписана генерация объявлений, теперь объявления массивов не используют fallthrough
  • Генерация операторов разнесена на мелкие функции, node_set_next больше не используется
  • Чтение выражений теперь всегда происходит с нужного узла
  • Узлы окончания блоков игнорируются, а чтение происходит по известному числу потомков

Compiler v2.0.3

12 Aug 21:28
Compare
Choose a tag to compare

Добавлена конвертация типов double и int64_t, без потери данных, в item_t:

size_t item_store_double(const double value, item_t *const stg);
size_t item_store_double_for_target(const item_status status, const double value, item_t *const stg);
double item_restore_double(const item_t *const stg);

size_t item_store_int64(const int64_t value, item_t *const stg);
size_t item_store_int64_for_target(const item_status status, const int64_t value, item_t *const stg);
int64_t item_restore_int64(const item_t *const stg);
  • Расширены соответствующие интерфейсы работы с элементами в библиотеках: vector.h, stack.h, hash.h и tree.h
  • Оптимизирована структура узла дерева:

node

Compiler v2.0.2

12 Aug 09:01
Compare
Choose a tag to compare

Исправления:

  • Изолирована конвертация отрицательных чисел для беззнаковых типов
  • Исправлена перестановка родительских ссылок в node_order
  • Исправлена работа hash_get_index
  • Исправлено чтение блочных комментариев
  • Исправлена работа тернарного оператора
  • Исправлена обработка списков инициализации в дереве
  • Отключено предупреждение C4221

Улучшения:

  • В библиотеку map.h добавлена функция возврата последнего считанного ключа
  • В uniscanner.h добавлена функция отката последнего считанного символа
  • Расширен интерфейс utf8.h для обработки UTF-8 символов

Создана библиотека strings.h, для работы с вектором строк:

strings strings_create(const size_t alloc);

size_t strings_add(strings *const vec, const char *const str);
size_t strings_add_by_utf8(strings *const vec, const char32_t *const str);
size_t strings_add_by_vector(strings *const vec, const vector *const str);

const char *strings_get(const strings *const vec, const size_t index);
const char *strings_remove(strings *const vec);

size_t strings_size(const strings *const vec);
bool strings_is_correct(const strings *const vec);

int strings_clear(strings *const vec);

Compiler v2.0.1

18 Jun 18:03
Compare
Choose a tag to compare

Доработки дерева:

  • Отключена обратная совместимость со старым деревом
  • Удалена буферизация из нового
  • Исправлена реализация следующих функций:
int node_order(const node *const fst, const node *const snd);
int node_swap(const node *const fst, const node *const snd);
int node_remove(node *const nd);
  • Создана функция добавления узла перед существующим:
/**
 *	Insert new node before existing
 *
 *	@param	nd			Current node
 *	@param	type		New node type
 *	@param	argc		Amount of new node arguments
 *
 *	@return	Inserted node
 */ 
node node_insert(const node *const nd, const item_t type, const size_t argc);

В связи с закрытием Travis CI для некоммерческого использования, непрерывная интеграция перенесена в GitHub Actions. Добавлены следующие платформы:

Compiler v2.0.0

15 Jun 11:07
ffdabda
Compare
Choose a tag to compare

Добавлена полноценная реализация интерфейса дерева:

tree

Создана библиотека работы с Хеш-таблицей:

hash hash_create(const size_t alloc);

size_t hash_add(hash *const hs, const item_t key, const size_t amount);
size_t hash_get_index(const hash *const hs, const item_t key);
size_t hash_get_amount(const hash *const hs, const item_t key);
item_t hash_get(const hash *const hs, const item_t key, const size_t num);
size_t hash_set(hash *const hs, const item_t key, const size_t num, const item_t value);

item_t hash_get_key(const hash *const hs, const size_t index);
size_t hash_get_amount_by_index(const hash *const hs, const size_t index);
item_t hash_get_by_index(const hash *const hs, const size_t index, const size_t num);
int hash_set_by_index(hash *const hs, const size_t index, const size_t num, const item_t value);

bool hash_is_correct(const hash *const hs);

int hash_clear(hash *const hs);

Отсортированы константы компилятора (файлы defs.h и tokens.h):

  • Константы сгруппированы по соответствующим перечислениям (enum)
  • Добавлены Doxygen-комментарии
  • Стандартизирован формат именования, Snake case в верхнем регистре

Общие исправления и улучшения:

  • Исправлено построение дерева для инициализаторов массивов и объявлений структур
  • Добавлен флаг -Wno для "отключения" восстановления после ошибок
  • Макросы GENERATE_TREE и GENERATE_CODES привязаны к Debug конфигурации проекта
  • Отключен цветной вывод в Debug сборках macOS
  • Добавлены модификаторы static и inline для приватных функций (там где это уместно)
  • Внедрено использование типа bool (библиотека <stdbool.h>)
  • Исправлено форматирование печати size_t (%zi заменен на %zu)
  • Добавлены пропущенные запятые в конце enum
  • Удалены лишние пробелы и табуляции в конце строк

Compiler v1.9

19 May 23:31
Compare
Choose a tag to compare

Доработки дерева:

  • Функция добавления потомков node_set_child заменена на node_add_child
  • Реализована возможность удаления узлов - node_remove
  • Добавлен интерфейс сохранения/восстановления узлов по индексу - node_save и node_load

Добавлена библиотека работы со стеком:

stack stack_create(const size_t alloc);

int stack_push(stack *const stk, const item_t value);
item_t stack_pop(stack *const stk);
item_t stack_peek(const stack *const stk);

int stack_reset(stack *const stk);
size_t stack_size(const stack *const stk);
int stack_is_correct(const stack *const stk);

int stack_clear(stack *const stk);

Закончен рефакторинг парсера выражений:

  • Полный переход на новый интерфейс дерева
  • Чтение исходного файла одним токеном
  • Изоляция взаимодействия с анонимным стеком
  • Общее улучшение читаемости кода
  • Расширены возможности функций внешнего интерфейса
  • Реализован разбор конструкций for (declaration; expression[opt]; expression[opt]) statement

Тестирование:

  • Добавлена ошибка передачи вещественного массива аргументом в функцию, ожидающую целочисленный
  • Тесты с несколькими ожидаемыми ошибками были отсортированы и помещены в подпапки */warning/*
  • Расширены тесты конструкций for
  • Протестированы области видимости идентификаторов
  • Добавлена ошибка инициализации структуры без полей, тест:
struct st {} s = 1;

void main()
{
	print(s);
}

Compiler v1.8

03 Mar 20:32
Compare
Choose a tag to compare

Общие улучшения:

  • Исправлена работа с абсолютными путями в ОС Ubuntu
  • Введены новые флаги тестовой системы:
    • -f, --fast для ускорения тестирования (отключает Debug тесты)
    • -r, --remove для принудительного удаления папки build
  • Реализована возможность отката к предыдущей позиции в universal_io
  • Добавлены функции перестановки узлов:
    • node_swap, с потомками
    • node_order, без потомков
  • Определен новый базовый тип элементов таблиц item_t
    • Может быть переопределен макросом ITEM
    • В зависимость от значения ITEM определяется тип и размер item_t
    • В значение ITEM записывается максимальное количество бит для хранения одного элемента
    • Для знаковых типов необходимо указать отрицательное число
  • Упрощен внутренний интерфейс компилятора, для интеграции новых генераторов:
    • Все проверки синтаксиса перенесены в анализатор
    • Отладочные печати дерева и кодов вынесены в соответствующие библиотеки
    • Общие для всех генераторов части вынесены в compile_from_ws и compile_from_io
    • Предоставлен доступ к списку флагов из кодогенератора
  • Типы глобальных флагов syntax изменены на item_t
  • Внутренние таблицы компилятора переведены на использование векторов
  • Таблица reprtab преобразована в ассоциативный массив, с интерфейсом:
map map_create(const size_t alloc);

size_t map_reserve(map *const as, const char *const key);
size_t map_add(map *const as, const char *const key, const item_t value);
size_t map_set(map *const as, const char *const key, const item_t value);
int map_set_by_index(map *const as, const size_t index, const item_t value);

item_t map_get(map *const as, const char *const key);
item_t map_get_by_index(const map *const as, const size_t index);

const char *map_to_string(const map *const as, const size_t index);
int map_is_correct(const map *const as);

int map_clear(map *const as);

Закончен рефакторинг кодогенератора:

  • Добавлены модификаторы static и const
  • Проведен рефакторинг имен:
    • Улучшено именование переменных
    • Названия функций приведены к одному формату
    • Переименованы интерфейсы взаимодействия со структурой адресов
  • Следующие таблицы перенесены в локальный контекст:
    • memory
    • processes
    • stack
  • Интерфейс внутренних таблиц проведен к inline типу
  • Неиспользуемое поле main-ссылки переопределено под максимальное количество потоков VM
  • Созданы локальные таблицы идентификаторов и представлений для сжатия выходного файла
  • Реализованы флаги сжатия таблиц (пока только проверка)
    • -i64, -i32, -i16, -i8 - для знаковых типов, размера 8, 4, 2 и 1 байт
    • -u64, -u32, -u16, -u8 - для беззнаковых типов, соответственно

Проведен рефакторинг парсера операторов и объявлений:

  • Реализация парсера разделена на несколько файлов
  • Уменьшен средний размер функций
  • Максимально сокращен интерфейс разбора выражений, все обращения к стекам изолированы
  • Распутаны вызовы при разборе инициализаций
  • Уменьшено количество наведенных ошибок
  • Для работы меток больше не требуется hash
  • Устаревшие тесты на ошибки перенесены в ./tests/executable

Compiler v1.7

21 Jan 03:15
Compare
Choose a tag to compare

Созданы и интегрированы изолированные интерфейсы взаимодействия со следующими таблицами:

  • Таблица памяти mem
  • Таблица процессов инициализации iniprocs
  • Таблица функций functions
  • Таблица идентификаторов identab
  • Таблица режимов modetab
  • Таблица представлений reprtab

Добавлен новый интерфейс взаимодействия с деревом (в режиме обратной совместимости):

node node_get_root(syntax *const sx);
node node_get_child(node *const nd, const size_t index);
node node_get_next(node *const nd);

size_t node_get_amount(const node *const nd);
int node_get_type(const node *const nd);
int node_get_arg(const node *const nd, const size_t index);

int node_set_type(node *const nd, const int type);
int node_add_arg(node *const nd, const int arg);
int node_set_arg(node *const nd, const size_t index, const int arg);
node node_set_child(node *const nd);

int node_is_correct(const node *const nd);

Проведен рефакторинг сканера:

  • Считыватель лексем разбит на более мелкие функции
  • Добавлено распознавание новых ошибок и "восстановление" после них
  • Вынесены общие для компилятора и препроцессора функции:
    • utf8_is_letter
    • utf8_is_digit
    • utf8_is_power
  • Исправлены множественные ошибки сегментации
  • Исключено использование exit функции (полный переход на статус коды)

Системные улучшения:

  • Удалены все использования оператора goto из кода
  • Добавлена поддержка кодировки CP866 для ОС Windows
  • Добавлено тестирование Debug сборок и обработка полного спектра статус кодов
  • Обновлена система сборки CMake:
    • Добавлен -s флаг для удаления информации об исходном коде из исполняемого файла
    • Включены оптимизации 2 уровня для Release сборок (скорость исполнения)
    • Отключена работа assert для Release
    • Отключены все оптимизации для Debug сборок
    • Исправлена линковка для Linux и macOS
      • Добавлен поиск динамических библиотек в той же папке