6 poin oleh GN⁺ 2025-04-21 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-04-21
Komentar Hacker News
  • comptime milik Zig punya karakteristik yang unik

    • Menggantikan berbagai fitur di bahasa lain
    • Mudah dipahami karena memiliki transparansi referensial
    • Menyediakan kemampuan yang kuat melalui introspeksi
    • Memungkinkan penulisan kode yang sederhana namun kuat dengan pendekatan yang berbeda dari Lisp
    • Jarang ada bahasa dengan desain dan pendekatan baru seperti ini
  • Kekurangan comptime Zig dan solusinya

    • Menghasilkan kode lewat zig build, lalu mengompilasinya dengan @import
    • Memberikan lebih banyak kebebasan dan waktu eksekusi tak terbatas, tetapi tidak memberi kebebasan untuk membuat tipe Zig sebagai nilai dalam kompilasi saat ini
    • Mirip dengan pengalaman lama menghubungkan Perl dan Tcl ke C
    • Sikap komunitas Zig yang kritis terhadap diri sendiri kadang terasa membingungkan
  • Frasa bahasa Spanyol yang dikutip dari cerita Borges merujuk pada dewa Norse

  • Fleksibilitas comptime

    • Bisa ditambahkan ke parameter fungsi saat membutuhkan informasi tipe dalam pekerjaan yang sedang dilakukan
    • Jika dalam situasi tertentu tipe tidak bisa disediakan, perlu menyelesaikan masalah desain
  • Hal yang membuat fitur comptime Zig terkenal

    • Menyediakan berbagai kemampuan seperti generik, kompilasi kondisional, subtyping, serialisasi, ORM, dan lain-lain
    • Bahasa lain juga memiliki fitur evaluasi saat waktu kompilasi yang serupa
  • Posting blog yang edukatif

    • Menjelaskan perbedaan antara comptime for dan inline for
    • Versi inline hanya dapat mengetahui panjangnya di comptime
  • Pendapat positif tentang bahasa dan alat Zig

    • Andai ada mode aman seperti Rust
    • Jauh lebih maju dibanding C/C++
    • Sangat terkesan dengan kompiler Zig
  • Hal menarik tentang comptime Zig

    • Kemampuan merepresentasikan tipe sebagai nilai pada waktu kompilasi
    • Memungkinkan implementasi yang mendekati bahasa dinamis atau refleksi runtime tanpa overhead runtime
  • Kebingungan tentang eksekusi kode saat kompilasi

    • Pertanyaan apakah kode waktu kompilasi benar-benar dijalankan di mesin host lokal
    • Rasa penasaran mengapa Zig menyembunyikan platform host
    • Pendapat positif tentang kemampuan cross-compile Zig