Zig Incremental Compilation: Rebuild dalam Milidetik yang Bikin Developer Ketagihan
AW
Axel W

Dipublikasikan 28 Juli 2026

Zig Incremental Compilation: Rebuild dalam Milidetik yang Bikin Developer Ketagihan

Zig, bahasa systems programming yang terus naik daun, baru saja mencapai milestone penting di kompilernya. Fitur incremental compilation, yang sudah lama dinanti komunitas, kini tersedia dalam kualitas yang cukup matang untuk proyek nyata. Matt Lugg, anggota tim core Zig, membagikan insight mendalam mengenai implementasi ini di blog pribadinya. Zig kini bisa mendeteksi perubahan pada fungsi dan deklarasi individual, mengompilasi ulang hanya bagian yang berubah, dan mem-patch byte hasil kompilasi langsung ke binary output.

Hasilnya adalah rebuild yang sangat cepat. Sebagai demonstrasi, Lugg menunjukkan pengeditan aplikasi Fizzy, sebuah pixel editor, menggunakan Zig master branch. Build awal memakan waktu sekitar 5 detik, namun setiap perubahan selanjutnya di-rebuild dalam 50 hingga 70 milidetik. Ini bukan sekadar microbenchmark, melainkan aplikasi grafis kompleks yang sedang dikembangkan secara aktif.

Pipeline File Processing

Bagian pertama dari pipeline compiler bekerja pada level file sumber. Prosesnya terdiri dari tiga langkah yang diulang: membaca file dari disk, parsing ke AST, dan mengubah AST menjadi ZIR (Zig Intermediate Representation) melalui pass AstGen. ZIR sendiri adalah representasi SSA-form IR yang untyped.

Proses ini memiliki beberapa properti menarik. Pertama, setiap file diproses sebagai pure function dari isi file tersebut, tanpa state eksternal. Kedua, Parse dan AstGen cukup cepat: di laptop Lugg, memproses seluruh direktori src/ compiler Zig (tanpa paralelisme) hanya memakan waktu sekitar 920 milidetik. Ketiga, berkat data-oriented design patterns yang digunakan Zig, ZIR bisa ditulis dan dibaca dari disk menggunakan single writev/readv system call tanpa langkah serialisasi terpisah.

Semantic Analysis dan Analysis Units

Bagian tersulit dari incremental compilation adalah semantic analysis, yang mencakup type checking dan comptime evaluation. Zig menangani ini dengan memecah kompilasi menjadi analysis units yang bisa dianalisis secara independen. Terdapat empat jenis analysis unit: layout struct/union, type deklarasi container-level, value konstanta container-level, dan body runtime function.

Selama analisis unit tertentu, compiler mempopulasi set unit lain yang menjadi dependensinya. Misalnya, jika sebuah fungsi runtime menggunakan tipe tertentu, maka layout dan type deklarasi tipe tersebut masuk ke dependency graph. Ketika ada perubahan, Zig hanya perlu menganalisis ulang unit yang terdampak beserta dependen-transitifnya.

Desain Bahasa untuk Incremental

Menurut Lugg, desain bahasa itu sendiri sangat memengaruhi kemudahan implementasi incremental compilation. Zig telah melakukan beberapa penyesuaian kontroversial selama bertahun-tahun untuk memudahkan fast incremental compilation. Konsep container-level declaration dan pembatasan evaluasi comptime yang bisa ditrace secara deterministik adalah contoh keputusan desain yang memudahkan pemodelan dependency graph.

Bagi developer Indonesia yang tertarik mencoba, fitur incremental compilation ini tersedia di Zig master branch, sementara untuk yang lebih suka menggunakan tagged release harus menunggu versi 0.17.0. Dengan adanya fitur ini, Zig semakin menantang dominasi Rust dan C++ di ranah systems programming dengan menawarkan developer experience yang unggul.