- Untuk target x86_64, Zig mengubah jalur default dari LLVM yang menurunkan bitcode menjadi file objek ke backend x86 self-hosted, sehingga kecepatan kompilasi build debug meningkat besar dan penggunaan memori turun signifikan
- Backend x86 self-hosted lulus 1.987 behavior test, lebih banyak daripada 1.980 milik backend LLVM, dan sebagian pengujian tambahan dari total 2.084 hanya dijalankan pada pengujian x86 self-hosted
- Pada benchmark
hello.zig, rata-rata 918ms di jalur LLVM turun menjadi 275ms pada backend self-hosted default, sehingga wall time berkurang 70,1%, dan peak RSS juga turun dari 214MB menjadi 137MB - Bahkan pada proyek besar seperti compiler Zig sendiri, waktu build turun dari 75 detik menjadi 20 detik, tetapi Windows belum menjadi target pergantian default karena pekerjaan pada COFF linker masih diperlukan
- Pekerjaan berikutnya mencakup paralelisasi penuh code generation, peningkatan linker, stabilisasi incremental compilation, peningkatan kualitas kode x86, dan perluasan backend aarch64
Peralihan backend default x86_64
- Untuk build target x86_64, Zig kini secara default menggunakan backend x86 self-hosted
- Jalur default sebelumnya adalah metode LLVM yang menurunkan file bitcode menjadi file objek
- Di Windows, default ini belum diubah
- Karena masih diperlukan lebih banyak pekerjaan pada COFF linker
Status kelulusan behavior test
- Backend x86 self-hosted lulus 1.987 behavior test
- Backend LLVM lulus 1.980 behavior test
- Total behavior test ada 2.084, tetapi pengujian tambahan sebagian besar tumpang tindih dengan pengujian backend x86 milik LLVM sendiri
- Pengujian tambahan ini hanya dijalankan saat pengujian x86 self-hosted
- Berdasarkan jumlah kelulusan, backend x86 Zig kini lebih maju daripada backend LLVM dalam implementasi bahasa Zig
Mengapa bersaing dengan jalur LLVM
- Alasan terbesar Zig bersaing dengan LLVM dalam code generation adalah karena hal ini bisa menciptakan perbedaan besar pada kecepatan kompilasi
- Latar belakang terkait dirangkum dalam penjelasan di Ziggit
Benchmark hello.zig
- Hasil
zig build-exe hello.zig -fllvm:- Rata-rata wall time: 918ms
- Peak RSS: 214MB
- CPU cycles: 4.53G
- Instructions: 8.50G
- Hasil jalur default
zig build-exe hello.zig:- Rata-rata wall time: 275ms
- Peak RSS: 137MB
- CPU cycles: 1.57G
- Instructions: 3.21G
- Backend self-hosted default menurunkan berbagai metrik dibanding jalur LLVM
- Wall time turun 70,1%
- Peak RSS turun 36,2%
- CPU cycles turun 65,2%
- Instructions turun 62,2%
- Cache misses turun 86,1%
- Branch misses turun 78,3%
Dampak pada proyek besar
- Pada proyek yang lebih besar seperti compiler Zig sendiri, waktu build turun dari 75 detik menjadi 20 detik
- Backend x86 self-hosted dapat memangkas waktu kompilasi secara besar bukan hanya pada contoh kecil, tetapi juga pada codebase besar
Pekerjaan berikutnya
- Zig sudah memulai pekerjaan paralelisasi penuh code generation
- Demo terkait tersedia sebagai rekaman asciinema
- Setelah peningkatan linker dan perbaikan bug lebih lanjut, incremental compilation dapat dibuat stabil dan kokoh bersama backend ini
- Kualitas kode x86 yang dihasilkan masih menyisakan ruang untuk perbaikan
- Target berikutnya adalah aarch64, dan pekerjaan diperkirakan akan dipercepat berkat pass Legalize yang baru
- Build master branch terbaru bisa diunduh dari halaman unduhan Zig untuk dicoba langsung
1 komentar
Komentar Hacker News
Setahu saya Zig punya banyak pekerjaan yang sedang berlangsung untuk menghadirkan pengalaman pengembangan yang lebih baik. Hampir setiap hari ada sesuatu yang dikerjakan, dan barusan juga ada hal seperti https://github.com/ziglang/zig/pull/24124
Dulu setahu saya hot code swapping juga pernah direncanakan, dan dengan kecepatan pengembangan saat ini saya tidak akan kaget kalau itu berjalan di x86_64 dalam waktu kurang dari setahun
Rasa sakit terbesar saya saat ini secara pribadi adalah kecepatan
comptime. Kompiler punya banyak pekerjaan yang harus dilakukan di sana, dan menjalankan DSL brainF** saat waktu kompilasi itu cukup lambat. Saya pernah mencobanya sendiri, dan itu eksperimen yang lucuBackend baru yang sedang diadopsi Zig secara keseluruhan sangat menarik. Saya ingin mencoba membuat sendiri backend URCL(https://github.com/ModPunchtree/URCL) untuk Zig
comptime, kami tahu apa yang perlu dilakukan, dan pekerjaan branch untuk itu juga sudah dimulai sejak lama. Hanya saja, karena perlu banyak mengerjakan ulang kode analisis semantik, ini jelas sesuatu yang bisa, harus, dan akan kami lakukan, tetapi sedang bersaing dengan prioritas laincomptimebenar-benar masalah besar. Saya sedang membuat pustaka JSON-RPC, dan sangat bergantung padacomptimeuntuk mendispatch permintaan JSON ke fungsi arbitrerKarena tipe statis yang ketat, tidak ada cara untuk melakukan dispatch dinamis saat runtime ke fungsi dengan parameter arbitrer, dan satu-satunya cara yang saya temukan adalah memetakan tipe fungsi saat waktu kompilasi dengan
comptimeKarena salinan kode hasil
comptimebertambah untuk tiap fungsi arbitrer, sepertinya ukuran kode akan membesarSecara spesifik, sepertinya mungkin membuat backend yang menerima AIR lalu menghasilkan laporan keamanan memori. Misalnya mengidentifikasi penggunaan nilai yang belum terdefinisi, stack pointer escape, use-after-free, double free, hal seperti alias xor mut, dan semacamnya
Ini saja sudah pencapaian yang luar biasa, dan seperti yang tertulis di log pengembangan, masih banyak lagi yang akan datang. Ide tentang kompiler yang selama proses kompilasi hanya memodifikasi bagian yang diperlukan dari biner terasa segar sekaligus benar-benar radikal, dan sekarang tampaknya sudah masuk dalam jangkauan proyek Zig
Saya menantikan kelanjutannya
Bagian “proyek besar seperti kompiler Zig turun dari 75 detik menjadi 20 detik. Ini baru permulaan” terasa sangat menjanjikan. Saya penasaran apa yang bisa dilakukan orang ini dengan itu, dan dia tampak benar-benar cerdas
Saya penasaran bagaimana keadaan manajemen paket. Saya sempat mencoba membuat aplikasi QuickJS + SDL3, tetapi beralih ke Rust karena kekacauan di sisi C++, dan di sana semuanya berjalan begitu saja. Akan bagus kalau bisa juga mencobanya di Zig
Ini juga punya kelebihan, karena Anda bisa bergantung pada arsip arbitrer, dan banyak paket Zig yang membungkus pustaka C sebenarnya lebih mirip skrip build yang bergantung pada rilis tarball tanpa modifikasi. Tentu saja, ini sedikit lebih menantang bagi pemula
Ada wrapper Zig native untuk SDL3: https://github.com/Gota7/zig-sdl3
Ada juga yang lebih berupa repackaging dasar dari pustaka/API C: https://github.com/castholm/SDL
Untuk QuickJS, satu-satunya pilihan adalah API C: https://github.com/allyourcodebase/quickjs-ng
Zig membuat penggunaan paket C secara langsung dengan cara seperti ini menjadi sangat mudah, tetapi tipe Zig jauh lebih ketat sehingga saat berinteraksi dengan API Anda akan sering melakukan casting
real 0m18.444s,user 0m17.408s,sys 0m1.688sBahkan pada prosesor yang sangat tua pun hasilnya segini, jadi saya tidak merasa perlu upgrade karena sudah terlalu cepat
Spesifikasinya seperti
AMD Athlon(tm) 64 X2 Dual Core Processor 4400+, 2 core, 2.3GHz, cache 512KBSaya sudah mengatakan ini saat D dan Nature, tetapi untuk semua bahasa yang punya backend sendiri, kita punya kewajiban untuk mendukung proyek yang berusaha tidak bergantung pada LLVM
Karena LLVM, riset dan pengembangan kompiler jadi mandek, terlalu banyak bahasa memutuskan bergantung pada LLVM, dan terlalu banyak orang tampaknya tidak lagi menganggap waktu iterasi cepat itu berharga atau berhenti berharap ada yang lebih baik
Iterasi cepat lewat kompilasi inkremental dan patch biner, plus debugging yang bagus, seharusnya menjadi ekspektasi untuk bahasa baru, bukan dianggap fitur niche atau sesuatu yang terlalu sulit
Seluruh industri rendering real-time pada dasarnya dibangun di atas LLVM atau fork LLVM, Microsoft juga mengganti kompiler shader-nya ke LLVM dan baru sekarang mulai meng-upstream kodenya
Sebagian besar infrastruktur kompiler konsol game juga berbasis Clang. Xbox sampai sekarang masih bertahan dengan MSVC, tetapi itu nyaris pengecualian
Secara keseluruhan, LLVM sangat sukses terutama dalam bootstrap hal-hal baru
Tidak bermaksud terdengar seperti menuntut atau tidak berterima kasih. Zig dikerjakan secara gratis. Hanya saja, yang paling membuat penasaran adalah jadwal 1.0 yang realistis
Zig hampir persis sesuai dengan yang saya inginkan dari bahasa tingkat rendah, dan saya sedang menunggu sampai stabil
Tentu saja, saya sangat menghargai filosofi desain Zig yang minimalis
Program hello world yang dibuat dengan
zig initberukuran 9.3MB saat dikompilasi. Dibandingkan dengan 7.6KB dari-Doptimize=ReleaseSmall, ini lebih dari 1000 kali lebih besar, sangat ekstrem-OReleaseSmall -fno-stripmenghasilkan executable 580KB, dan-ODebug -fstripmenghasilkan executable 1.4MBBackend x86 Zig memberikan pengalaman debugging yang jauh lebih baik bersama fork lldb yang memahami Zig: https://github.com/ziglang/zig/wiki/LLDB-for-Zig
Saya tidak ingat apakah saat ini logika
comptimebisa di-step-through. Itu topik yang dibahas baru-baru iniSepertinya Julia perlu mempertimbangkan beralih ke Zig kalau ingin mendapat peningkatan performa yang berarti. Saya ingat para pengembang Julia cemas soal penurunan performa setiap kali ada rilis LLVM
Kompilernya cukup bisa ditargetkan ulang, dan ini juga area yang sedang aktif dikerjakan. Jadi di masa depan, mungkin saja Zig bisa dibayangkan sebagai kompiler alternatif untuk beberapa bagian bahasa
@code_llvmyang benar-benar menampilkan IRSeperti cache kompilasi yang lebih granular, alat yang lebih baik untuk mencegah invalidasi, menghapus optimisasi world splitting, memperluas pemanfaatan multithreading di kompiler, prakompilasi otomatis untuk signature konkret, dan pembuatan kode yang lebih malas agar kode bisa di-hot-swap saat sudah terkompilasi
Dari sudut pandang pemula total, saya penasaran apa yang membuat Zig lebih baik daripada bahasa lain. Saya memahaminya sebagai C yang lebih modern, tetapi apa sebenarnya bagian modern itu?
Tidak seperti array di C, Zig punya slice yang mengetahui panjangnya sehingga lebih baik terkait buffer overflow, tipe optional eksplisit yang wajib diperiksa, dan pointer null tidak diizinkan. Bahkan saat diizinkan untuk integrasi dengan kode C, tipenya tetap secara jelas menunjukkan hal itu
Ada juga enum, tagged union, dan pemeriksaan kelengkapan yang dipaksakan pada ekspresi
switchPenanganan error bersifat eksplisit, dan fungsi mengembalikan error (nilai enum) yang harus ditangani pemanggil dengan satu cara atau lainnya. Di C, fungsi bisa mengembalikan integer yang menandakan error dan itu bisa diabaikan sepenuhnya
Namun, belum ada cara standar yang tertanam di bahasa untuk mengembalikan data sekaligus error. Pola mengoper struct error lewat parameter terasa seperti tempelan, jadi menurut saya semestinya ada sintaks khusus untuk itu
Ada blok
deferdanerrdeferuntuk pembersihan setelah fungsi mengembalikan hasil atau saat error terjadi, dan alih-alih makro, Anda bisa memakai pembuatan kodecomptimeserta refleksi tipe seperti@typeInfoAnda meneruskan allocator ke library sehingga pemanggil biasanya menentukan di mana dan bagaimana memori dialokasikan, dan bahkan hanya dengan
GeneralPurposeAllocatorsaja, kebocoran memori mudah ditemukanSetelah terus memakai bahasa tingkat tinggi sejak mulai belajar pemrograman, saya selalu membenci bagian-bagian C dan ekosistem sekitarnya yang sulit dipahami dan berlawanan dengan intuisi, tetapi Zig membuat saya untuk pertama kalinya menikmati pemrograman sistem
Apakah ini hanya mengganti backend? Saya penasaran apakah semua pass analisis dan tipe masih tetap ada, atau apakah verifikasinya juga dikurangi
Siklus kompilasi cepat memang membantu produktivitas, tetapi menurut saya itu hanya benar jika juga mencakup pengujian yang cepat
Kalau begitu, bukankah lebih mudah jika Zig untuk debug cukup dijalankan lewat interpretasi? Itu juga tampaknya akan menyelesaikan masalah harus mengulang pekerjaan untuk tiap target
gdbataulldbtampaknya bukan hal sepele. Alat seperti itu mengharapkan executable dengan informasi debug DWARFSebagai tambahan, di area seperti pengembangan game khususnya, performa mode debug juga benar-benar penting
Tidak ada kebutuhan praktis untuk menambahkan interpreter. Adanya backend kustom berarti sekarang dipakai untuk debug, tetapi di masa depan yang jauh juga bisa bersaing dengan LLVM dalam hal kecepatan
Menambahkan interpreter pun pada akhirnya tetap mengharuskan penulisan backend kustom, jadi kegunaannya kecil
Masalahnya adalah LLVM lambat baik untuk debug maupun rilis
Bukankah ini salah satu prasyarat untuk menghadirkan kembali async/await ke Zig?
https://github.com/ziglang/zig/wiki/FAQ#what-is-the-status-o...