Saya memberi tantangan pada diri saya sendiri: menulis kompiler C yang dihosting sendiri dalam 10 jam. Inilah hasilnya, ditambah banyak pembersihan (periksa "rilis" untuk versi 10 jam).
Pelaksanaan:
Bahasa:
if
, while
, do``while
, return
.=
, ?:
(terner), ||
, &&
, ==
, !=
, <
, >=
, +
, -
, *
, ++
, --
(pasca operasi), !
, -
(unary), []
, ()
true
dan false
. String literal, dengan penggabungan otomatis. Filosofi umumnya adalah: hanya menyertakan fitur jika itu mengurangi ukuran kode total. Hal ini dilakukan secara ekstrem di cabang insane
.
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
Ini pertama-tama akan menghasilkan cc
dengan mengkompilasi mini-c dengan GCC. Kemudian membuat ccself
dengan mengkompilasi mini-c dengan cc
. Akhirnya membuat test/triangular
menggunakan ccself
, dan memeriksa hasilnya. Anda harus mendapatkan sesuatu seperti ini:
$ make selftest
gcc -std=c11 -Werror -Wall cc.c -o cc
cc cc.c
gcc -m32 a.s -o ccself
ccself tests/triangular.c
gcc -m32 a.s -o triangular; triangular 5; [ $? -eq 15 ]
Jika Anda menggunakan Windows, Anda perlu memeriksa cabang windows
. Di Linux 64 bit, Anda mungkin perlu sudo apt-get install gcc-multilib
untuk dapat mengkompilasi dan menjalankan kode 32 bit.
Kompiler C mikroskopis lainnya adalah c4 oleh rswier
. Dia menerapkan lebih banyak C, tapi menurut saya milik saya lebih sederhana :). Selain itu, c4 menghasilkan kode untuk VM-nya sendiri, sedangkan milik saya memiliki kesulitan yang signifikan dalam bekerja dengan perakitan x86 dan cdecl.
Saya menulis kompiler C lain yang jauh lebih canggih. Coba lihat. Ini juga merupakan hosting mandiri, tetapi dengan serangkaian fitur yang jauh lebih lengkap, dan bahkan beberapa tambahan eksperimental seperti lambda.
Hak Cipta (c) 2015 Sam Nipps
Izin dengan ini diberikan, secara gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menggunakan Perangkat Lunak tanpa batasan, termasuk namun tidak terbatas pada hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , mempublikasikan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan mengizinkan orang yang menerima Perangkat Lunak untuk melakukan hal tersebut, dengan tunduk pada ketentuan berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini akan disertakan dalam semua salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN, ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.