- Bahasa Zig sedang beralih ke arah mengimplementasikan fungsi libc langsung di pustaka standar Zig, sambil secara bertahap menghapus kode sumber C yang ada
- Hingga saat ini sekitar 250 file sumber C telah dihapus, dan masih tersisa 2032 file
- Peralihan ini menghasilkan efek seperti peningkatan kecepatan kompilasi, pengurangan ukuran instalasi, dan pengecilan ukuran biner saat static linking
- Perbaikan terbaru memungkinkan zig libc dioptimalkan bersama kode lain di dalam Zig Compilation Unit (ZCU) alih-alih sebagai arsip statis terpisah, sehingga penghapusan kode duplikat dan optimisasi setingkat LTO menjadi mungkin
- Seiring Zig beralih menjadi penyedia static libc sendiri, jika terjadi masalah terkait maka laporan bug perlu dikirim langsung ke proyek Zig
Gambaran umum proyek Zig libc
- Beberapa kontributor ikut serta dalam subproyek zig libc, menggantikan implementasi libc berbasis C yang ada dengan wrapper pustaka standar Zig
- Tujuannya adalah menghapus kode C yang duplikatif, serta menyediakan fungsi seperti
memcpy, atan2 sebagai pemetaan sederhana atau dalam bentuk wrapper fungsi umum seperti strnlen
- Sebagai contoh, fungsi
strnlen diimplementasikan menggunakan std.mem.findScalar milik Zig
- Hingga saat ini sekitar 250 file sumber C telah dihapus, dan 2032 file masih tersisa
Peningkatan performa dan struktural
- Semakin banyak fungsi yang dipindahkan ke Zig, semakin kecil ketergantungan pada proyek eksternal dan bahasa C
- Efeknya mencakup peningkatan kecepatan kompilasi, penyederhanaan dan pengurangan ukuran instalasi, serta pengecilan ukuran biner aplikasi pengguna yang di-static link
- Perubahan terbaru membuat zig libc dikompilasi di dalam Zig Compilation Unit (ZCU) bersama kode Zig lain
- Tidak lagi ditautkan sebagai arsip statis terpisah, melainkan memanfaatkan struktur terpadu compiler dan linker
- Dengan demikian, penghapusan kode duplikat dan optimisasi antar fungsi menjadi mungkin
- Ini mirip dengan link-time optimization (LTO), tetapi dilakukan di tahap frontend, bukan tahap linker
Kemungkinan pengembangan ke depan
- Jika digabungkan dengan perubahan terbaru pada std.Io, ada kemungkinan pengguna dapat mengendalikan perilaku I/O libc
- Contoh: mengintegrasikan pemanggilan
read, write ke dalam event loop io_uring
- Fitur deteksi kebocoran resource juga bisa diterapkan pada kode C pihak ketiga
- Namun saat ini masih berupa gagasan eksperimental yang belum diuji
Pengujian dan jaminan kualitas
- Proyek libc-test milik Szabolcs Nagy sangat membantu dalam mencegah regresi pada fungsi matematika
- Kumpulan pengujian ini digunakan untuk memverifikasi akurasi Zig libc
Panduan untuk pengguna
- Zig sedang beralih ke tahap menyediakan sendiri fungsi musl, mingw-w64, dan wasi-libc
- Jika terjadi masalah terkait, pengguna perlu mengirim laporan bug langsung ke proyek Zig
- Ini untuk mencegah issue yang salah arah terkirim ke maintainer proyek libc independen yang sudah ada
Penutup
- Kalimat terakhir tulisan ini berbunyi “Abolish ICE” (tanpa penjelasan tambahan)
1 komentar
Komentar Hacker News
250 file C telah dihapus, dan sekarang tersisa 2032
Menyaksikan proses Zig menggantikan libc dari dalam adalah proyek yang cukup mendebarkan dalam jangka panjang
Banyak bahasa mengklaim sebagai pengganti C, tetapi Zig hampir satu-satunya yang benar-benar mengintegrasikan C ABI dan sistem build secara alami
Fitur translate-c juga bekerja dengan sangat baik
Daripada mencoba mempertahankan kompatibilitas 99% seperti C++, menurut saya lebih bijak memilih mempertahankan kesederhanaan C sambil menghindari jebakan bahasanya
Saya penasaran apakah dalam jangka panjang ini berarti Zig tidak akan berjalan di OpenBSD
Karena OpenBSD memblokir syscall langsung dan memaksa pemanggilan hanya lewat libc
Lihat thread ini untuk konteks terkait
Jika memberi opsi
-dynamic -lc, fungsi libc dari sistem target akan disediakanAda juga sistem seperti macOS yang hanya mendukung libc dinamis, dan setahu saya OpenBSD juga mendukung libc statis
Ini adalah perubahan yang sangat menarik dalam cara proyek Zig menautkan pustaka C
Tetapi saya penasaran, saat melakukan cross-compile program C untuk Windows yang memakai MinGW dengan Zig, apakah masih bisa menautkan libc MinGW secara statis
Jika menentukan
-target x86_64-windows-gnu -lc, sebagian fungsi libc disediakan Zig, sebagian lagi oleh vendored mingw-w64Zig menyediakan semuanya tanpa perlu instalasi mingw-w64 terpisah
Jika mau, Anda juga bisa langsung menentukan libc eksternal dengan
--libc libc.txtIni ide yang keren, tetapi saya khawatir apakah kita tetap harus terus melacak kerentanan CVE dari glibc atau musl untuk kode yang sudah di-porting
Pada jalur kode bersama seperti matematika, justru potensi bug bisa berkurang
Ada penjelasan bahwa ini “mirip mengaktifkan LTO melintasi batas libc, tetapi dilakukan dengan benar di frontend, bukan linker”
Saya penasaran kenapa pada tahap linker sudah terlambat, dan apakah Zig bisa melakukan lebih banyak optimasi dibanding linker pada level LLVM IR
Dalam pustaka statis yang sudah dioptimalkan, optimasi seperti ini sulit dilakukan saat link time
Jika digabungkan dengan perubahan std.Io terbaru, menarik bahwa pengguna bisa mengendalikan sendiri perilaku I/O libc
Misalnya dengan membuat semua panggilan read/write ikut masuk ke event loop io_uring
Secara pribadi saya lebih tertarik ke sisi kqueue, tetapi kutipan ini tampaknya juga berlaku di sana
Ada banyak bagian libc yang menakutkan, tetapi ini benar-benar proyek yang menarik
Misalnya hal-hal seperti "memfrob" atau "strfry", walau bercanda, ini hanya ada di glibc :)
Saya penasaran apakah Rust juga punya sesuatu seperti ini
Bukan mau memulai debat Zig vs Rust, tetapi saya juga ingin membuat lingkungan yang lebih mandiri di proyek Rust
Saya penasaran apakah ada yang tahu kapan Zig akan mencapai versi 1.0
Saya sangat tertarik dengan bahasanya, tetapi perubahannya masih banyak sehingga saya ragu memakainya untuk proyek penting
Meski begitu, proyek produksi besar seperti Bun, Ghostty, dan Tigerbeetle mengikutinya dengan baik
Semantik Zig sederhana, jadi saat upgrade versi biasanya cukup memperbarui compiler dan melakukan beberapa perbaikan mekanis
Yang menghalangi saya hanya kemauan rekan kerja untuk mengadopsinya, jadi untuk sekarang saya mulai dari proyek yang bisa saya buat sendiri
Sebagai referensi, video ini mungkin menarik