Perjalanan Penulisan Kompiler
Di repositori Github ini, saya mendokumentasikan perjalanan saya menulis kompiler kompilasi mandiri untuk subset bahasa C. Saya juga menuliskan detailnya sehingga jika Anda ingin mengikutinya, akan ada penjelasan tentang apa yang saya lakukan, alasannya, dan dengan beberapa referensi kembali ke teori penyusun.
Tapi jangan terlalu banyak teori, saya ingin ini menjadi perjalanan praktis.
Berikut langkah-langkah yang telah saya ambil sejauh ini:
- Bagian 0: Pengantar Perjalanan
- Bagian 1: Pengantar Pemindaian Leksikal
- Bagian 2: Pengantar Parsing
- Bagian 3: Prioritas Operator
- Bagian 4: Kompiler Sebenarnya
- Bagian 5: Pernyataan
- Bagian 6: Variabel
- Bagian 7: Operator Perbandingan
- Bagian 8: Pernyataan If
- Bagian 9: Perulangan Sementara
- Bagian 10: Untuk Loop
- Bagian 11: Fungsi, bagian 1
- Bagian 12: Jenis, bagian 1
- Bagian 13: Fungsi, bagian 2
- Bagian 14: Menghasilkan Kode Perakitan ARM
- Bagian 15: Petunjuk, bagian 1
- Bagian 16: Mendeklarasikan Variabel Global dengan Benar
- Bagian 17: Pemeriksaan Tipe dan Offset Penunjuk yang Lebih Baik
- Bagian 18: Nilai-Nilai dan Nilai-Nilai Ditinjau Kembali
- Bagian 19: Array, bagian 1
- Bagian 20: Karakter dan String Literal
- Bagian 21: Lebih Banyak Operator
- Bagian 22: Ide Desain untuk Variabel Lokal dan Panggilan Fungsi
- Bagian 23: Variabel Lokal
- Bagian 24: Parameter Fungsi
- Bagian 25: Panggilan Fungsi dan Argumen
- Bagian 26: Prototipe Fungsi
- Bagian 27: Pengujian Regresi dan Kejutan yang Menyenangkan
- Bagian 28: Menambahkan Lebih Banyak Bendera Run-time
- Bagian 29: Sedikit Refactoring
- Bagian 30: Merancang Struktur, Serikat, dan Enum
- Bagian 31: Struktur Pelaksana, Bagian 1
- Bagian 32: Mengakses Anggota dalam suatu Struktur
- Bagian 33: Serikat Pelaksana dan Akses Anggota
- Bagian 34: Enum dan Typedefs
- Bagian 35: Pra-Prosesor C
- Bagian 36:
break
dan continue
- Bagian 37: Pernyataan Ganti
- Bagian 38: Menggantung Yang Lain dan Lainnya
- Bagian 39: Inisialisasi Variabel, bagian 1
- Bagian 40: Inisialisasi Variabel Global
- Bagian 41: Inisialisasi Variabel Lokal
- Bagian 42: Ketik Casting dan NULL
- Bagian 43: Perbaikan Bug dan Operator Lainnya
- Bagian 44: Lipatan Konstan
- Bagian 45: Deklarasi Variabel Global, ditinjau kembali
- Bagian 46: Parameter Fungsi Batal dan Perubahan Pemindaian
- Bagian 47: Subset dari
sizeof
- Bagian 48: Subset dari
static
- Bagian 49: Operator Terner
- Bagian 50: Mengepel, bagian 1
- Bagian 51: Array, bagian 2
- Bagian 52: Petunjuk, bagian 2
- Bagian 53: Mengepel, bagian 2
- Bagian 54: Menumpahkan Register
- Bagian 55: Evaluasi Malas
- Bagian 56: Array Lokal
- Bagian 57: Mengepel, bagian 3
- Bagian 58: Memperbaiki Kenaikan/Penurunan Pointer
- Bagian 59: Mengapa Tidak Berhasil, bagian 1
- Bagian 60: Lulus Ujian Tiga Kali Lipat
- Bagian 61: Apa Selanjutnya?
- Bagian 62: Pembersihan Kode
- Bagian 63: Backend Baru menggunakan QBE
- Bagian 64: Backend untuk CPU 6809
Tidak ada jadwal atau garis waktu untuk bagian selanjutnya, jadi terus periksa kembali di sini untuk melihat apakah saya sudah menulis lagi.
Hak Cipta
Saya telah meminjam beberapa kode, dan banyak ide, dari kompiler SubC yang ditulis oleh Nils M Holm. Kodenya ada dalam domain publik. Menurut saya, kode saya cukup berbeda sehingga saya dapat menerapkan lisensi berbeda pada kode saya.
Kecuali dinyatakan lain,
- semua kode sumber dan skrip adalah (c) Warren Toomey di bawah lisensi GPL3.
- semua dokumen non-kode sumber (misalnya dokumen berbahasa Inggris, file gambar) adalah (c) Warren Toomey di bawah lisensi Creative Commons BY-NC-SA 4.0.