Shivyc adalah kompiler Hobby C yang ditulis dalam Python 3 yang mendukung subset dari standar C11 dan menghasilkan biner yang cukup efisien, termasuk beberapa optimasi. Shivyc juga menghasilkan pesan kesalahan kompilasi waktu yang bermanfaat.
Implementasi trie ini adalah contoh dari apa yang dapat dikompilasi Shivyc saat ini. Untuk daftar fitur yang lebih komprehensif, lihat direktori tes fitur.
Shivyc hanya membutuhkan Python 3.6 atau lebih baru untuk mengkompilasi kode C. Perakitan dan tautan dilakukan dengan menggunakan Binutils dan GLIBC GNU, yang hampir pasti sudah Anda instal.
Untuk menginstal shivyc:
pip3 install shivyc
Untuk membuat, menyusun, dan menjalankan program contoh:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Untuk menjalankan tes:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Untuk kenyamanan mereka yang tidak menjalankan Linux, docker/ Directory menyediakan dockerfile yang mengatur lingkungan X86-64 Linux Ubuntu dengan segala sesuatu yang diperlukan untuk Shivyc. Untuk menggunakan ini, jalankan:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Ini akan membuka cangkang di lingkungan dengan shivyc terpasang dan siap digunakan
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
Docker Shivyc Executable akan memperbarui langsung dengan perubahan apa pun yang dibuat di direktori Shivyc lokal Anda.
Shivyc hari ini memiliki preprocessor yang sangat terbatas yang mem -parsing komentar dan memperluas arahan #include . Fitur -fitur ini diimplementasikan antara lexer.py dan preproc.py .
Shivyc Lexer diimplementasikan terutama di lexer.py . Selain itu, tokens.py berisi definisi kelas token yang digunakan dalam lexer dan token_kinds.py berisi contoh kata kunci dan token simbol yang diakui.
Shivyc Parser menggunakan teknik keturunan rekursif untuk semua penguraian. Ini diimplementasikan dalam parser/*.py dan membuat pohon parse node yang didefinisikan dalam tree/nodes.py dan tree/expr_nodes.py .
Shivyc melintasi pohon parse untuk menghasilkan IL kustom datar (bahasa menengah). Perintah untuk IL ini ada di il_cmds/*.py . Objek yang digunakan untuk pembuatan IL ada di il_gen.py , tetapi sebagian besar kode pembangkit IL ada dalam fungsi make_code dari setiap simpul pohon di tree/*.py .
Shivyc secara berurutan membaca perintah IL, mengubah masing-masing menjadi kode perakitan Intel-Format X86-64. Shivyc melakukan alokasi register menggunakan algoritma penyatuan register george dan appel yang diulang (lihat referensi di bawah). Fungsionalitas generasi ASM umum ada di asm_gen.py , tetapi banyak dari kode pembangkit ASM ada dalam fungsi make_asm dari masing -masing perintah IL di il_cmds/*.py .
Permintaan tarik ke Shivyc sangat disambut. Tempat yang baik untuk memulai adalah halaman masalah. Semua masalah berlabel "fitur" adalah tugas TODO. Masalah berlabel "bug" adalah kesalahpahaman individu di Shivyc. Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya dalam komentar dari masalah yang relevan atau buat masalah baru berlabel "pertanyaan". Tentu saja, tolong tambahkan tes untuk semua fungsi baru.
Terima kasih banyak kepada kontributor kami saat ini dan masa lalu: