Releases: andrey-terekhov/RuC
Compiler v2.2.0
Нововведения:
- Добавлена функция
exit(int)
- Добавлен тип
enum
- Добавлена свертка констант, что позволяет требовать константность внутри выражения
case
Внутренние улучшения:
- Рефакторинг печати промежуточных представлений (дерева и таблиц, человекочитаемых кодов RuC-VM)
- Дерево выражений теперь строится снизу вверх, что позволяет отказаться от дополнительных проходов для регистровых машин
- Использование новой библиотеки strings для хранения значений строковых литералов
- Добавлены узлы объявлений параметров функций
Исправления:
- Исправлены проверки операндов присваивания
- Исправлены ошибки взаимодействий с типом
void* (void*)
- Исправления внутренней библиотеки
item_t
Compiler v2.1.1
Исправления:
- Реализована расширяемость структуры
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
Добавлены следующие улучшения:
- Добавлена начальная инициализация таблицы идентификаторов
- Добавлен тип
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
Добавлена конвертация типов 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);
Compiler v2.0.2
Исправления:
- Изолирована конвертация отрицательных чисел для беззнаковых типов
- Исправлена перестановка родительских ссылок в
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
Доработки дерева:
- Отключена обратная совместимость со старым деревом
- Удалена буферизация из нового
- Исправлена реализация следующих функций:
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. Добавлены следующие платформы:
- Windows Server 2016 (Visual Studio 2017)
- Windows Server 2019 (Visual Studio 2019)
- macOS Catalina 10.15
- Ubuntu 20.04
Compiler v2.0.0
Добавлена полноценная реализация интерфейса дерева:
Создана библиотека работы с Хеш-таблицей:
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
Доработки дерева:
- Функция добавления потомков
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
Общие улучшения:
- Исправлена работа с абсолютными путями в ОС 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
Созданы и интегрированы изолированные интерфейсы взаимодействия со следующими таблицами:
- Таблица памяти
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
- Добавлен поиск динамических библиотек в той же папке
- Добавлен