Pengerjaan akhir jalur compiler adalah menambahkan satu fitur bahasa baru yang menembus setiap tahap pipeline, yaitu lexer, parser, semantik, IR, dan codegen. Topik ini membahas kriteria fitur yang layak dipilih sebagai pengerjaan akhir dan membandingkan beberapa kandidat, dari yang rumit seperti closure dan class hingga yang sederhana seperti for-loop rentang dan string interpolation. Setelah membaca topik ini, pembaca dapat memilih fitur yang menembus seluruh tahap pipeline tanpa tertahan oleh satu tahap yang terlalu berat, sehingga pengerjaan akhir benar-benar menguji pemahaman menyeluruh.
Kriteria fitur yang menembus pipeline#
Fitur yang dipilih sebagai pengerjaan akhir harus menyentuh kelima tahap pipeline. Fitur yang hanya menyentuh sebagian tahap, misalnya hanya menambah operator baru pada lexer dan parser, tidak menguji pemahaman menyeluruh dan terasa seperti latihan modul awal. Sebaliknya, fitur yang menembus semua tahap memaksa pembaca menghubungkan keputusan di lexer dengan kebutuhan di parser, keputusan di parser dengan struktur AST yang dipakai semantik, serta keputusan di semantik dengan instruksi IR dan bytecode yang dibangkitkan codegen.
Tiga pertanyaan memandu pemilihan, dan fitur yang menjawab ya pada ketiganya adalah kandidat yang layak:
- Apakah fitur ini membutuhkan token baru pada lexer? Bila tidak, tahap lexer tidak tersentuh.
- Apakah fitur ini membutuhkan produksi tata bahasa dan node AST baru pada parser? Bila tidak, tahap parser tidak tersentuh.
- Apakah fitur ini membutuhkan instruksi baru pada IR atau bytecode sasaran, serta dispatch baru pada VM? Bila tidak, tahap codegen tidak tersentuh.
Selain menembus pipeline, fitur harus dapat dikerjakan dalam lingkup satu modul. Fitur yang terlalu rumit, seperti garbage collection bertingkat atau sistem tipe dependen, akan tertahan pada satu tahap dan tidak sempat menyelesaikan keseluruhan. Keseimbangan antara cakupan tahap dan kemudahan pengerjaan menjadi kriteria utama, sehingga fitur yang menembus semua tahap tetapi tidak membebani satu tahap secara berlebihan menjadi pilihan ideal.
Perbandingan kandidat#
Lima kandidat dipertimbangkan, yaitu closure, class, pattern matching, for-loop rentang, dan string interpolation. Closure menangkap environment dari scope sekitarnya, sehingga membutuhkan representasi heap closure pada VM dan aturan tangkapan variabel pada semantik. Class membutuhkan dispatch method, tabel method per kelas, dan konstruktor, sehingga menambah banyak node AST dan instruksi VM. Pattern matching membutuhkan exhaustiveness check pada semantik dan pengikatan variabel pada pola, yang menjadi rumit sekiranya pola bersarang diperbolehkan.
For-loop rentang dan string interpolation tergolong sederhana. For-loop rentang hanya menambah beberapa token baru pada lexer, satu node AST pada parser, satu deklarasi scope pada semantik, serta pola jump pada codegen. String interpolation membutuhkan lexer yang mengenali placeholder, parser yang membangun ekspresi konkatenasi, dan konversi tipe ke string pada codegen. Keduanya menembus kelima tahap tanpa tertahan pada salah satu tahap. Tabel berikut merangkum kandidat beserta tahap yang disentuh dan catatan singkat.
| Kandidat | Rumit | Tahap yang disentuh | Catatan |
|---|---|---|---|
| closure | ya | L P S I C | menangkap environment, butuh heap closure pada VM |
| class | ya | L P S I C | dispatch method, tabel method, konstruktor |
| pattern matching | ya | L P S I C | exhaustiveness check dan bind variabel pada pola |
| for-loop rentang | tidak | L P S I C | token baru sedikit, satu node AST, emit jump pada codegen |
| string interpolation | tidak | L P S I C | parser membangun ekspresi konkatenasi, butuh konversi tipe |
Tabel di atas adalah ringkasan statis. Berkas fitur_kandidat.py di samping topik ini mencetak tabel yang sama dengan keluaran yang dapat direproduksi, sekaligus menyaring kandidat yang menembus semua tahap dan tidak rumit sebagai rekomendasi.
"""Ringkasan kandidat fitur untuk pengerjaan akhir compiler.
Setiap kandidat diperiksa terhadap lima tahap pipeline:
L = lexer, P = parser, S = semantik, I = IR, C = codegen dan VM
Skrip ini mencetak tabel ringkasan kandidat beserta tahap yang disentuh,
lalu memberikan rekomendasi untuk pengerjaan akhir. Kandidat dinyatakan
layak sebagai pengerjaan akhir bila menembus kelima tahap pipeline dan
tidak terlalu rumit untuk dikerjakan dalam satu modul.
"""
# Daftar kandidat: (nama, rumit, catatan)
# Setiap kandidat sengaja menembus kelima tahap pipeline, sebab fitur yang
# hanya menyentuh sebagian tahap tidak menguji pemahaman menyeluruh.
KANDIDAT = [
("closure", True,
"menangkap environment, butuh heap closure pada VM"),
("class", True,
"dispatch method, tabel method, konstruktor"),
("pattern matching", True,
"exhaustiveness check dan bind variabel pada pola"),
("for-loop rentang", False,
"token baru sedikit, satu node AST, emit jump pada codegen"),
("string interpolation", False,
"parser membangun ekspresi konkatenasi, butuh konversi tipe"),
]
def main() -> None:
print("Kandidat fitur untuk pengerjaan akhir compiler")
print("Tahap: L=lexer, P=parser, S=semantik, I=IR, C=codegen/VM")
print()
print("Kandidat Rumit Tahap Catatan")
print("-" * 72)
for nama, rumit, catatan in KANDIDAT:
rumit_str = "ya" if rumit else "tidak"
# Semua kandidat menembus L, P, S, I, C.
tahap_str = "L P S I C"
print(f"{nama:<22} {rumit_str:<6} {tahap_str:<14} {catatan}")
print()
print("Rekomendasi (menembus semua tahap, tidak rumit):")
for nama, rumit, catatan in KANDIDAT:
if not rumit:
print(f" - {nama}: {catatan}")
if __name__ == "__main__":
main()Kandidat fitur untuk pengerjaan akhir compiler
Tahap: L=lexer, P=parser, S=semantik, I=IR, C=codegen/VM
Kandidat Rumit Tahap Catatan
------------------------------------------------------------------------
closure ya L P S I C menangkap environment, butuh heap closure pada VM
class ya L P S I C dispatch method, tabel method, konstruktor
pattern matching ya L P S I C exhaustiveness check dan bind variabel pada pola
for-loop rentang tidak L P S I C token baru sedikit, satu node AST, emit jump pada codegen
string interpolation tidak L P S I C parser membangun ekspresi konkatenasi, butuh konversi tipe
Rekomendasi (menembus semua tahap, tidak rumit):
- for-loop rentang: token baru sedikit, satu node AST, emit jump pada codegen
- string interpolation: parser membangun ekspresi konkatenasi, butuh konversi tipeKeluaran menunjukkan lima kandidat, dengan tiga kandidat rumit dan dua kandidat sederhana. Rekomendasi di akhir keluaran menyaring dua kandidat yang menembus semua tahap dan tidak rumit, yaitu for-loop rentang dan string interpolation. Kedua kandidat ini menjadi calon utama untuk pengerjaan akhir.
Memilih fitur utama untuk modul ini#
For-loop rentang dipilih sebagai fitur utama untuk modul ini, dengan bentuk for IDENT in a..b { body }. Pilihan ini didasarkan pada tiga alasan. Pertama, for-loop menambah token baru yang jelas pada lexer, yaitu for, in, dan .., sehingga tahap lexer benar-benar tersentuh. Kedua, for-loop menambah produksi tata bahasa dan node AST baru berupa ForStmt dengan tiga komponen, yaitu variabel loop, rentang, dan badan, sehingga tahap parser tersentuh. Ketiga, for-loop menambah pola jump pada codegen dan dispatch loop pada VM, sehingga tahap codegen tersentuh.
String interpolation juga layak, tetapi membutuhkan konversi tipe ke string yang menambah kasus pada semantik dan codegen. For-loop rentang lebih ringkas karena rentang a..b hanya berlaku pada dua bilangan bulat, sehingga semantik hanya memeriksa tipe endpoint dan codegen hanya membangkitkan loop dengan komparasi serta inkrementasi. Pilihan ini akan dipakai konsisten pada spesifikasi, implementasi, dan test suite, sehingga setiap topik membangun di atas keputusan yang ditetapkan di sini.
Ringkasan#
- Fitur pengerjaan akhir harus menembus kelima tahap pipeline, yaitu lexer, parser, semantik, IR, dan codegen, agar benar-benar menguji pemahaman menyeluruh.
- Tiga pertanyaan memandu pemilihan, yaitu token baru pada lexer, produksi dan node AST baru pada parser, serta instruksi baru pada IR dan bytecode.
- Closure, class, dan pattern matching menembus semua tahap tetapi rumit, sedangkan for-loop rentang dan string interpolation menembus semua tahap dan sederhana.
- For-loop rentang dipilih sebagai fitur utama karena menambah token, node AST, dan pola jump yang jelas pada setiap tahap tanpa membebani satu tahap secara berlebihan.
Referensi#
- Crafting Interpreters — Bob Nystrom — Bab tentang perancangan fitur bahasa pada interpreter kecil, menjadi rujukan tingkat kesulitan tiap kandidat.
- Lua 5.4 Reference Manual — Lua.org — Bentuk pernyataan loop pada Lua sebagai pembanding desain for-loop.
- The Rust Reference: For loops and ranges — Rust Project
— Sintaksis rentang
a..bdan semantik iterasi yang menjadi inspirasi bentuk for-loop rentang pada modul ini.