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 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中的個人誤解。如果您有任何疑問,請隨時在相關問題的評論中詢問或創建標有“問題”的新問題。當然,請添加所有新功能的測試。
非常感謝我們當前和過去的貢獻者: