Shivyc - это компилятор Hobby C, написанный на Python 3, который поддерживает подмножество стандарта C11 и генерирует достаточно эффективные двоичные файлы, включая некоторые оптимизации. Shivyc также генерирует полезные сообщения об ошибках с компиляцией.
Эта реализация Trie является примером того, что Shivyc может составить сегодня. Для более полного списка функций см. В справочнике тестирования функций.
Shivyc требует только Python 3.6 или более позднего дня для компиляции C -кода. Сборка и связь выполняются с использованием бинутилов GNU и GLIBC, которые вы почти наверняка уже установили.
Чтобы установить Shivyc:
pip3 install shivyc
Чтобы создать, компилировать и запустить пример программы:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Чтобы запустить тесты:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Для удобства тех, кто не работает Linux, docker/ Directory предоставляет DockerFile, который устанавливает среду x86-64 Linux Ubuntu, все необходимое для Shivyc. Чтобы использовать это, запустите:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Это откроет оболочку в среде с установленным и готовым к использованию Shivyc
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
Docker Shivyc Executibeababid будет обновлять в прямом эфире с любыми изменениями в вашем локальном каталоге Shivyc.
Сегодня Shivyc имеет очень ограниченный препроцессор, который анализирует комментарии и расширяет директивы #include . Эти функции реализованы между lexer.py и preproc.py .
Shivyc Lexer реализован в основном в lexer.py . Кроме того, tokens.py содержит определения классов токенов, используемых в Lexer и token_kinds.py содержит случаи распознанных ключевых слов и токенов символов.
Сигнал Shivyc использует методы рекурсивного спуска для всего анализа. Он реализован в parser/*.py и создает дерево разбора узлов, определенное в tree/nodes.py и tree/expr_nodes.py .
Шивик пересекает дерево анализа, чтобы генерировать плоский пользовательский IL (промежуточный язык). Команды для этого IL в il_cmds/*.py . Объекты, используемые для генерации IL, находятся в il_gen.py , но большая часть кода, генерирующего IL, находится в функции make_code каждого узла дерева в tree/*.py .
Shivyc последовательно считывает команды IL, преобразуя каждый в код сборки Intel-Format x86-64. Shivyc выполняет распределение регистра с помощью итерационного реестра Аппеля иерного реестра коалесцирующего алгоритма (см. Ссылки ниже). Общая функциональность генерации ASM находится в asm_gen.py , но большая часть кода, генерирующего ASM, находится в функции make_asm каждой команды IL в il_cmds/*.py .
Приглашенные запросы на Shivyc очень приветствуются. Хорошим местом для начала является страница проблем. Все проблемы с надписью «функция» - это задачи TODO. Проблемы, помеченные «ошибкой», являются индивидуальным неправильным сотрудником в Shivyc. Если у вас есть какие -либо вопросы, пожалуйста, не стесняйтесь задать в комментариях соответствующего выпуска или создайте новую проблему с надписью «Вопрос». Конечно, добавьте тест (ы) для всей новой функциональности.
Большое спасибо нашим нынешним и прошлым участникам: