Shivyc是用Python 3编写的爱好C编译器,它支持C11标准的子集并产生合理高效的二进制文件,包括一些优化。 Shivyc还生成有用的编译时错误消息。
Trie的实现是Shivyc今天可以编译的一个示例。有关功能的更全面列表,请参见功能测试目录。
Shivyc仅需要Python 3.6或更高版本才能编译C代码。组装和链接是使用GNU Binutil和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可执行文件将通过您本地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中定义的节点的解析树。
Shivyc穿越解析树以生成平坦的自定义IL(中间语言)。此IL的命令在il_cmds/*.py 。用于IL生成的对象位于il_gen.py中,但是大多数IL生成代码都在tree/*.py中每个树节点的make_code函数中。
Shivyc顺序读取IL命令,将每个命令转换为Intel-Format X86-64汇编代码。 Shivyc使用George和Appel的迭代寄存器合并算法执行登记处分配(请参阅下面的参考文献)。一般的ASM生成功能在asm_gen.py中,但是ASM生成代码的大部分都在il_cmds/*.py中的每个IL命令的make_asm函数中。
非常欢迎向Shivyc的拉请求。一个好的起点是问题页面。所有标记为“功能”的问题都是TODO任务。标有“错误”的问题是Shivyc中的个人误解。如果您有任何疑问,请随时在相关问题的评论中询问或创建标有“问题”的新问题。当然,请添加所有新功能的测试。
非常感谢我们当前和过去的贡献者: