Tutorial Membuat Interpreter/Compiler

Membuat sebuah interpreter/compiler masih merupakan misteri bagi sebagian besar orang. Setelah melihat-lihat aneka kurikulum, dan slide kuliah di berbagai tempat di Indonesia, saya mulai menyadari mengapa. Pertama: dasar teori untuk membuat sebuah compiler/interpreter kurang diajarkan dengan baik, dan yang kedua: mata kuliah kompilasi hanya berisi teori, padahal mempraktikkan pembuatan compiler/interpreter tidaklah sulit

Proses interpretasi/kompilasi dimulai dengan parsing source code. Masalah parsing seharusnya sudah diajarkan di mata kuliah otomata. Parsing akan membuat sebuah parse tree, dan kemudian dikonversi menjadi abstract syntax tree. Untuk menangani pembuatan parser, diperlukan struktur data tree. Pelajaran mengenai tree diajarkan di mata kuliah struktur data.


Jika Anda pernah mendapat kuliah dasar pemrograman yang menggunakan LISP, pemahaman pemrosesan tree akan lebih mudah, karena pemrosesan tree umumnya rekursif. Pengetahuan LISP akan membantu abstraksi Anda dalam memproses tree.

Berikutnya kode perlu dijalankan. Untuk sebuah interpreter, ini sangat mudah, eksekusi bisa dilakukan langsung dengan mengunjungi pohon. Untuk sebuah compiler, atau interpreter yang menggunakan pendekatan bytecode, pengetahuan yang diperlukan adalah mengenai arsitektur komputer. Pengetahuan arsitektur komputer akan membantu dalam proses pembuatan kode assembly atau bytecode.

Berikutnya Anda perlu tahu lingkungan di mana hasil kompilasi akan dijalankan. Misalnya Anda membuat compiler yang membuat executable untuk Linux, Anda akan memerlukan library dasar (misalnya untuk input/output) bagi OS Linux. Nah di sini kuliah sistem operasi dan kuliah pemrograman sistem sangat berguna.

Membuat website sederhana sangat mudah, tapi membuat website yang besar dan rumit seperti facebook akan sulit. Sama halnya dengan pembuatan compiler, jika Anda hanya ingin membuat interpreter/compiler yang bisa menjalankan kode saja, maka hal itu bisa cepat dilakukan. Compiler atau interpreter untuk bahasa yang sangat spesifik (DSL/Domain Specific Language) dapat dibuat dengan mudah.

Hal yang sulit dalam pembuatan sebuah compiler adalah bagaimana menghasilkan compiler yang menghasilkan kode cepat (atau bagaimana cara menginterpretasi kode dengan cepat). Masalah ini sangat rumit,  Anda akan memerlukan pengetahuan algoritma dan struktur data yang kompleks. Teori mengenai graf juga akan diperlukan (masalah analisis alur eksekusi program melibatkan banyak graf). Tapi topik terakhir ini pun sudah bisa diatasi dengan adanya aneka tools di internet.

Saat ini sudah banyak tools yang tersedia untuk memudahkan semua langkah di atas, namun untuk memakai tools-tools tersebut Anda perlu tahu dasar teorinya. Untuk parsing, sudah ada puluhan parser generator (bison, antlr, jflex, dsb). Untuk membuat bahasa yang diinterpretasi memakai bytecode, sudah ada BCEL (bytecode engineering library) untuk Java,  Parrot/PIR, NekoVM, dsb. Jika Anda ingin menghasilkan kode native yang sudah dioptimasi, Anda bisa menggunakan LLVM.

Tools yang saya sebutkan umumnya bukan barang baru, dan sudah tersedia sejak lama (dari tools yang saya sebutkan di atas: yang terbaru NekoVM: tahun 2005, Bison sudah ada sejak 1988). Tools yang saya sebutkan sifatnya gratis, dan bahkan boleh dipakai di proyek komersial. Jadi jika ada yang menyatakan bahwa pembuatan compiler sederhana itu sangat sulit, maka jelas bahwa orang itu kurang mengenal bidang kompilasi. Jika Anda cukup memperhatikan semua kuliah Anda, membuat interpreter/compiler itu hanya sedikit lebih sulit dari membuat website.

Untuk menunjukkan bahwa pembuatan interpreter/compiler tidak sesulit itu, saya telah membuat tutorial yang bisa diakses di http://yohan.es/compiler/.
Tutorial ini masih belum lengkap, dan akan terus diperbarui.

2 komentar pada “Tutorial Membuat Interpreter/Compiler”

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *