- Fitur comptime di Zig menyediakan kemampuan evaluasi saat kompilasi yang sangat kuat, tetapi sengaja dibatasi
- Saat menjalankan kode pada waktu kompilasi, informasi host tidak dapat diakses, sehingga desainnya cocok untuk cross-compilation
- Pembuatan kode dinamis, DSL, RTTI, I/O, dan sebagainya tidak didukung, sebagai gantinya digunakan spesialisasi kode berbasis tipe yang eksplisit
- RTTI dapat diimplementasikan sendiri, dengan menyusun ulang informasi tipe yang hanya ada saat kompilasi agar bisa digunakan saat runtime
- Tipe baru bisa dibuat dengan comptime, tetapi API tidak bisa diperluas, sehingga tidak dimungkinkan menambahkan metode kustom
Hal-hal yang tidak dilakukan comptime di Zig
- Meskipun comptime di Zig menyediakan kemampuan kuat untuk generic, conditional compilation, serialisasi, ORM, dan lain-lain, sebagian fitur memang dibatasi secara eksplisit
- Justru batasan-batasan itu membuat desain Zig tetap ringkas dan mudah diprediksi
-
Tidak bisa mengakses informasi host (No Host Leakage)
- Kode comptime berjalan berdasarkan platform target, bukan sistem tempat kode itu dikompilasi
- Di Zig, pada waktu kompilasi tidak bisa memakai informasi sistem host seperti endianness, ukuran pointer, dan sebagainya
- Tujuannya adalah menjamin keamanan dengan mempertimbangkan cross-compilation
- Dalam kode contoh, output byte dari angka format BF16 berbeda tergantung platform target
-
Tidak ada pembuatan kode berbasis string (No #eval)
- Zig tidak menyediakan fitur pembuatan kode dinamis seperti
#include di C, mixin di bahasa D, atau macro di Rust
- Sebagai gantinya, Zig mendukung partial evaluation berbasis argumen
comptime
- Jika argumen tertentu diketahui saat kompilasi, hanya cabang terkait yang dipertahankan sehingga optimisasi kode dimungkinkan
-
Tidak bisa memperluas sintaks DSL (No DSLs)
- Di Zig tidak ada fitur untuk membuat sintaks buatan pengguna seperti di Lisp atau Rust
- Semua data hanya diteruskan dalam bentuk nilai (value) sesuai sintaks Zig
- DSL terbatas seperti string format (
printf) hanya bisa diimplementasikan sebagai string comptime
-
Tidak ada informasi tipe runtime (No RTTI)
- Zig bisa berperilaku seperti bahasa dinamis seperti Python, tetapi informasi tipe hanya ada pada comptime
- Agar bisa bekerja saat runtime, perlu mendefinisikan sendiri struct RTTI lalu memanipulasinya melalui pointer
- Contoh: mendefinisikan struct
RTTI yang berisi nama field dan informasi offset, lalu mengakses field melalui pointer
-
Tidak bisa membuat API baru (No New API)
- Di Zig, tipe baru memang bisa dibuat dengan comptime, tetapi metode tidak bisa ditambahkan ke tipe tersebut
- Jadi API tidak bisa diperluas seperti derive macro di Rust
- Saat mengimplementasikan serialisasi JSON, tidak bisa menambahkan metode
.to_json(), dan harus memakai fungsi global dengan argumen tipe
-
Tidak ada IO saat kompilasi (No IO)
- comptime di Zig melarang akses ke resource eksternal seperti file system, jaringan, database, dan lain-lain
- Dampaknya, reproducibility, keamanan, dan pemanfaatan cache menjadi lebih baik
- Jika membutuhkan IO, gunakan sistem build
build.zig untuk mengimpor kode Zig yang telah digenerasikan sebelumnya
-
Ringkasan: El Disco (keseimbangan antara abstraksi dan kesederhanaan)
- Zig menyediakan kemampuan metaprogramming yang kuat, namun tetap menjaga prediktabilitas melalui desain yang sangat terbatas
- Berkat batasan ini, comptime di Zig tetap praktis dan mudah dipahami
- Tanpa abstraksi yang rumit pun, fitur ini tetap berguna dalam penggunaan nyata, dan hanya menjalankan kemampuan yang memang dideklarasikan dengan jelas
1 komentar
Komentar Hacker News
comptimemilik Zig punya karakteristik yang unikKekurangan
comptimeZig dan solusinyazig build, lalu mengompilasinya dengan@importFrasa bahasa Spanyol yang dikutip dari cerita Borges merujuk pada dewa Norse
Fleksibilitas
comptimeHal yang membuat fitur
comptimeZig terkenalPosting blog yang edukatif
comptime fordaninline forcomptimePendapat positif tentang bahasa dan alat Zig
Hal menarik tentang
comptimeZigKebingungan tentang eksekusi kode saat kompilasi