Merancang Fitur Bahasa

Memilih fitur yang menembus setiap tahap pipeline: closure, class, atau pattern matching.

Daftar isi

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.

KandidatRumitTahap yang disentuhCatatan
closureyaL P S I Cmenangkap environment, butuh heap closure pada VM
classyaL P S I Cdispatch method, tabel method, konstruktor
pattern matchingyaL P S I Cexhaustiveness check dan bind variabel pada pola
for-loop rentangtidakL P S I Ctoken baru sedikit, satu node AST, emit jump pada codegen
string interpolationtidakL P S I Cparser 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.

python fitur_kandidat.py
"""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()
text Keluaran
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 tipe

Keluaran 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#