- Logika resolusi tipe (type resolution) di kompiler Zig dirombak total, sehingga struktur internalnya menjadi lebih sederhana dan menghadirkan peningkatan yang juga terlihat oleh pengguna
- Desain baru menangani analisis field tipe secara lazy, sehingga tidak memeriksa detail struktur tipe yang belum diinisialisasi secara tidak perlu
- Pesan kesalahan dependency loop diperbaiki secara lebih spesifik, sehingga penyebab loop dapat dipahami dengan jelas
- Masalah analisis berlebihan pada fitur incremental compilation dan banyak bug telah diperbaiki, sehingga kecepatan build meningkat signifikan
- Perubahan kali ini mencakup puluhan perbaikan bug dan penyempurnaan kecil pada bahasa, yang secara keseluruhan memperkuat performa dan pengalaman pengembangan kompiler Zig
Perombakan ulang logika resolusi tipe
- Sebuah PR berukuran sekitar 30 ribu baris telah di-merge, menulis ulang logika resolusi tipe di kompiler Zig menjadi struktur yang lebih logis dan intuitif
- Dalam proses ini, struktur internal kompiler dirapikan, dan pengguna juga merasakan dampak perbaikannya secara langsung
- Kompiler diubah agar melakukan evaluasi lazy pada analisis field tipe, sehingga tidak lagi menelusuri detail struktur tipe yang belum diinisialisasi secara tidak perlu
- Pada contoh kode, jika sebuah struct yang berisi field
@compileError hanya digunakan sebagai namespace, sebelumnya akan memicu kesalahan kompilasi, tetapi sekarang dapat dikompilasi dengan normal
- Ini mencegah dependensi kode yang tidak perlu saat memakai tipe berbentuk namespace seperti
std.Io.Writer
Peningkatan pesan kesalahan dependency loop
- Sebelumnya, pesan kesalahan dependency loop cenderung ambigu, tetapi sekarang penyebab dan lokasinya ditampilkan dengan jelas
- Pada contoh kode ketika struct
Foo dan Bar saling mereferensikan, pesan kesalahan kini menunjukkan secara spesifik lokasi dependensi tiap tipe
- Pesan tersebut mencakup panjang loop, lokasi deklarasi tiap field, dan lokasi kueri alignment
- Bahkan pada loop yang kompleks, informasi yang diberikan cukup untuk memudahkan identifikasi akar masalah
Peningkatan performa incremental compilation
- Perubahan kali ini memperbaiki banyak bug pada fitur incremental compilation
- Secara khusus, masalah “over-analysis” diselesaikan sehingga hanya bagian yang berubah yang dikompilasi ulang
- Hasilnya, dalam banyak kasus kecepatan kompilasi meningkat signifikan
- Pengembang dapat mengaktifkan incremental compilation di Zig versi 0.15.1 atau lebih baru untuk merasakan pengalaman pengembangan yang telah ditingkatkan
Peningkatan lainnya
- PR ini juga mencakup puluhan perbaikan bug, perubahan kecil pada bahasa, dan peningkatan performa kompiler
- Sebagian besar terkait detail kecil atau kasus yang bersifat khusus
- Rincian perubahan lengkap dapat dilihat di Codeberg melalui PR #31403
- Jika menemukan bug baru, pengguna dianjurkan untuk melaporkan issue
Makna perubahan ini
- Dengan penyederhanaan logika resolusi tipe dan optimalisasi incremental compilation, stabilitas dan efisiensi kompiler Zig semakin diperkuat
- Pengembang akan menerima umpan balik yang lebih cepat dan jelas, serta dapat mengharapkan peningkatan produktivitas bahkan pada codebase besar
1 komentar
Komentar Hacker News
Saya adalah penulis devlog ini
Saya memahami kekhawatiran soal breakage kompatibilitas akibat perubahan bahasa, tetapi saya ingin menegaskan bahwa perubahan compiler kali ini tidak sampai menimbulkan dampak besar
Sebagai contoh, saat membangun ZLS dengan branch baru, perubahan yang diperlukan hanya mengganti
.{}menjadi.empty. Ini karena penghapusan nilai defaultstd.ArrayList, yang sebenarnya sudah berstatus deprecated sejak 1 tahun laluUntuk proyek Awebo juga, hanya ada tiga hal yang perlu diperbaiki di seluruh pohon dependensi — perubahan
.empty, penambahancomptime, dan penambahanorelse @alignOf(T)Sebagian besar perbaikan ini adalah perubahan sederhana yang bagi kebanyakan developer Zig bisa ditangani secara refleks
Inti dari PR ini bukanlah breakage, melainkan perbaikan bug dan peningkatan incremental compilation
Saya menilai kualitas dan perencanaan PR ini sangat tinggi, dan sama sekali tidak bermaksud meremehkan upaya penulisnya
Namun saya juga mendapat pelajaran bahwa ke depan saya harus memberi lebih banyak konteks dan menuliskan pendapat dengan lebih hati-hati
lib/std/multi_array_list.zig, saya jadi penasaranSaya tidak paham kenapa penggunaan
@alignOf(T)dalam definisiMultiArrayList(T)bisa menimbulkan dependensi siklikBahkan jika
TadalahMultiArrayListitu sendiri, bukankah itu tetap tipe monomorfik yang sepenuhnya terpisah? Mungkin saya melewatkan sesuatuKode terkait: tautan
Saya penasaran dengan pengalaman orang-orang yang menggunakan Zig di lingkungan production
Bahasanya sering berubah, jadi saya ingin tahu seperti apa siklus update atau rewrite-nya, dan apakah ada kasus paket dependensi tertinggal dari versi bahasa
Saya tahu Bun memanfaatkan Zig dengan baik, tetapi saya juga ingin mendengar contoh lain
Dalam 1~2 tahun terakhir, perubahan pada bahasa dan standard library berjalan tanpa masalah besar
Dulu upgrade memang merepotkan, tetapi sekarang rasanya hanya sebatas “sedikit tidak nyaman”
Jika ditanya soal pengalaman memakai Zig, bagian ini bahkan hampir tidak saya sebut karena sudah cukup stabil
Proyek-proyek besar seperti ini melakukan upgrade berdasarkan tagged release, dan biasanya menyelesaikan migrasi dalam beberapa hari hingga beberapa minggu
Dependensinya juga sangat sedikit, jadi beban upgrade tidak terlalu besar
Hanya saja, typo kecil kadang bisa memicu SIGBUS compiler crash, sehingga debugging jadi sulit
.zig-cachepernah membesar sampai 173GB dan menyebabkan masalah pada ARM VPSSaat menaikkan
lightpandadari 0.14 ke 0.15, prosesnya lancar. Sepertinya 0.16 juga tidak akan membawa masalah besarTetapi sebagai developer library, sulit mengikuti laju perubahan cepat di 0.16
Saat ini saya hanya menanganinya secara eksperimental di branch “dev”
Saya me-rewrite modul Node.js/TypeScript ke Zig, dan hasilnya 2x lebih cepat dengan penggunaan memori turun 70%
Dukungan
sqlite/serialisasiJSONdi Zig adalah keunggulan besarKekurangannya adalah tidak adanya sintaks closure atau vtable, sehingga lebih sulit memisahkan lapisan kode
Saya memakai
Arcsdan bumper allocator untuk menjaga keamanan memori, dan berencana terus menjalankannya dalam DebugSafe modeBeralih ke ReleaseFast memang memberi peningkatan sekitar 25%, tetapi tidak sebanding dengan hilangnya aspek keamanan
Walaupun kode harus diperbaiki, dalam jangka panjang ini adalah pendekatan yang benar
Saya terkesan dengan hasil kerja tim Zig
Saya sering memakai terminal ghostty yang dibuat dengan Zig, dan sangat stabil
Namun secara pribadi saya lebih memilih Rust
Rust mengambil model “closed world”, sedangkan Zig mengambil model “open world”
Rust mengharuskan trait diimplementasikan secara eksplisit, sedangkan di Zig cukup jika shape dari tipe tersebut sesuai
Ini membuat Zig memungkinkan metaprogramming yang kuat, tetapi type inference menjadi tidak jelas sehingga autocomplete, dokumentasi, dan dukungan LSP menjadi lebih sulit
Dari penjelasannya, ini terdengar mirip dengan interface di Go, tetapi setahu saya Zig tidak punya konsep padanan langsung untuk itu
Peralihan dari
kernel32keNtdllmenarikIni adalah konsep yang juga bisa diterapkan pada API user-space Linux
Terutama, cara penanganan error di batas kernel-user terasa mirip
Hanya saja di Linux, libc dan kernel sangat saling terikat sehingga penggunaan
errnomenjadi wajibSaya penasaran kenapa pola seperti ini juga muncul di Windows
errnoatauGetLastError()adalah warisan dari era sebelum threadDulu penjadwalan bersifat kooperatif sehingga variabel global aman, tetapi saat multicore dan thread muncul, itu menjadi berbahaya
Karena itu thread local kemudian muncul sebagai alternatif
Daripada memakai tipe seperti namespace, saya merasa mungkin lebih baik jika bahasa ini menambahkan namespace eksplisit
Jika sebuah fitur memberi optimasi di banyak tempat, maka fitur itu baru akan ditambahkan saat benar-benar perlu
Di Zig,
@importmengubah file menjadi struct, dan namespace direpresentasikan hanya sebagai struct bertingkatArtinya, namespace tidak lebih dari import lain
(Kopi saya belum sepenuhnya masuk, jadi saya tidak menjamin akurasinya)
Ada bagian yang sering terlewat dalam diskusi perubahan bahasa — yaitu dampaknya pada ekosistem
Jika bahasa sering mengalami breakage, bukan hanya aplikasi tetapi juga library, tool, dan tutorial yang harus terus mengejar perubahan
Akibatnya, ekosistem akan cenderung berpihak pada proyek yang aktif dipelihara, alih-alih library yang “sekali dibuat lalu dibiarkan”
Ini mungkin trade-off yang masuk akal pada tahap awal desain bahasa, tetapi dalam jangka panjang akan memengaruhi pertumbuhan ekosistem
Bahasa-bahasa baru lain banyak berupaya meminimalkan kelelahan akibat perubahan semacam ini
Akan menarik untuk melihat hasil dari pendekatan Zig
Blender sering memecahkan API, tetapi kebanyakan perbaikannya kecil
Tetap saja, seseorang harus memperbaikinya, dan jika maintenance berhenti, pengguna harus mem-patch sendiri
Addon berbayar memang lebih mungkin terus dipelihara, tetapi itu pun bukan jaminan
Library yang tidak dipelihara pada dasarnya memang kode buruk
Daripada terus mengkritik Zig, lebih baik berhenti mempromosikan bahasa lain (seperti C3)
Klaim di PR Zig bahwa “Chromium, boringssl, Firefox, Rust memanggil SystemFunction036 dari advapi32.dll” sebenarnya tidak benar
Mereka sudah memakai ProcessPrng, dan sejak Windows 10 ini tidak pernah gagal
Dasarnya ada di whitepaper Microsoft
Permintaan RNG dirancang agar sama sekali tidak bisa gagal, dan jika gagal maka prosesnya sendiri akan dihentikan
Jadi, demi menjamin bilangan acak berkualitas tinggi, API ini tidak mengembalikan kode error
Semantik bahasa Zig tampak sederhana di permukaan, tetapi interaksinya cukup subtil
Hal seperti ini terasa bisa menghasilkan corner case kompleks seiring waktu, seperti aturan template C++
PR 30 ribu baris adalah pencapaian besar
Namun mengubah semantik bahasa adalah hal yang sangat besar, jadi saya cukup terkejut
Saya paham Zig masih sebelum 1.0 sehingga perubahannya cepat, tetapi ungkapan yang terasa kasual seperti “kami mengubah semantik di branch ini” sedikit mengejutkan
Saya jadi penasaran apakah perubahan skala besar seperti ini memang budaya khas Zig, atau justru saya yang tertinggal zaman
Ungkapan “modern Zig” juga terasa lucu karena cepatnya laju perubahan bahasa ini
Devlog bukan tulisan pemasaran, melainkan lebih mirip catatan internal untuk orang dalam, dan Zig memang belum 1.0
PR tersebut memuat konteks dan alasan yang cukup
Saat memilih Zig, pada dasarnya kita sudah menerima tingkat tertentu dari risiko perubahan bahasa
Justru merapikannya dengan bersih sekarang akan lebih menguntungkan dalam jangka panjang
(Bayangkan warisan yang tidak bisa diperbaiki seperti prioritas operator bitwise di C)
mluggadalah kontributor inti Zig sekaligus anggota Zig FoundationPerubahan kali ini adalah upaya untuk mengatasi dependensi siklik dan merapikan sistem tipe
Proposal terkait sudah dipublikasikan di #3257 dan #15909
Dengan perubahan ini, resolusi tipe di Zig ditata ke struktur DAG (directed acyclic graph), sehingga stabilitas compiler meningkat drastis
Zig dikelola dengan model BDFN (Benevolent Dictator For Now), dan keputusan akhir ada pada Andrew Kelley
Namun timnya adalah organisasi nirlaba yang menempatkan kepercayaan pengguna dan kualitas bahasa sebagai prioritas tertinggi
Secara pribadi, bisa bekerja bersama Matthew adalah kehormatan besar
Secara formal tampak rapi, tetapi dalam praktiknya C adalah bahasa yang penuh kekacauan