Shivycは、Python 3に書かれたHobby Cコンパイラで、C11標準のサブセットをサポートし、いくつかの最適化を含む合理的に効率的なバイナリを生成します。 Shivycは、役立つコンパイル時間エラーメッセージも生成します。
Trieのこの実装は、Shivycが今日コンパイルできるものの例です。機能のより包括的なリストについては、機能テストディレクトリを参照してください。
Shivycは、CコードをコンパイルするためにPython 3.6以降のみを必要とします。組み立てとリンクは、GNU Binutilsと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は、SHIVYCに必要なすべてのものを備えたX86-64 Linux Ubuntu環境を設定するDockerFileを提供します。これを使用するには、実行してください。
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 Shivyce実行可能ファイルは、ローカル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の反復レジスタCoulescingアルゴリズムを使用して登録割り当てを実行します(以下の参照を参照)。一般的なASM生成機能はasm_gen.pyにありますが、ASM make_asmコードの多くは、 il_cmds/*.py 。
Shivycへのリクエストをプルすることは大歓迎です。開始するのに適した場所は、問題ページです。 「機能」とラベル付けされたすべての問題は、TODOタスクです。 「バグ」とラベル付けされた問題は、Shivycの個々の誤解です。ご質問がある場合は、関連する問題のコメントでお気軽にお問い合わせください。または、「質問」というラベル付けされた新しい問題を作成してください。もちろん、すべての新しい機能についてテストを追加してください。
現在および過去の貢献者に感謝します: