- Proyek Zig bertujuan untuk sepenuhnya menghapus ketergantungan pada library LLVM, Clang, dan LLD dari file executable zig utama
- Pekerjaan yang tersisa terbagi menjadi penghapusan LLD, penghapusan pemanggilan API LLVM, kemajuan backend C/x86/wasm/aarch64, penghapusan subperintah yang bergantung pada Clang dan penggunaan preprocessor, serta implementasi pengganti
zig ar - Backend LLVM sudah dapat menghasilkan file
.bc, tetapi compiler Zig tidak lagi akan memiliki kemampuan untuk mengompilasi.bcmenjadi file objek, sehingga dalam kasus ini diperlukan instalasi Clang terpisah - Dampak yang diharapkan mencakup penyederhanaan build dari source dan bootstrap, menghindari masalah terkait LLVM/Clang/LLD pada distribusi Linux dan Homebrew, serta pengurangan ukuran biner dari sekitar 150 MiB → 5 MiB
- Zig juga mengusung arah agar dapat mengimplementasikan optimization pass sendiri serta menarik kontribusi langsung dari proyek riset seperti alive2 dan produsen chip Intel, ARM, dan RISC-V
Ketergantungan yang ingin dihapus dari executable Zig
- Tujuan issue ini adalah menghapus sepenuhnya library LLVM, Clang, dan LLD dari proyek Zig
- Titik keterkaitan yang masih tersisa diringkas ke area LLD, LLVM, Clang, dan
zig ar
Pekerjaan tersisa terkait LLD
- completely eliminate dependency on LLD #8726: Masih ada pekerjaan untuk sepenuhnya menghapus ketergantungan pada LLD
Pekerjaan tersisa terkait LLVM
- Area LLVM mencakup output LLVM bitcode, tingkat kelulusan pengujian backend, dan pekerjaan penghapusan LLVM API
- directly output LLVM bitcode rather than using LLVM's IRBuilder API #13265: Pekerjaan untuk langsung menghasilkan LLVM bitcode alih-alih memakai IRBuilder API milik LLVM
- Backend C berada pada status 1742/1792 tes lulus, dengan tingkat kelulusan 97%
- enable the x86 backend by default for debug builds on x86_64-linux #22257: Pekerjaan untuk mengaktifkan backend x86 secara default pada build debug x86_64-linux
- Backend wasm berada pada status 1611/1765 tes lulus, dengan tingkat kelulusan 91%
- 100% behavior tests passing for the aarch64 backend #21172: Pekerjaan agar behavior test backend aarch64 lulus 100%
- ability to create import libs from def files without LLVM #17807: Fitur untuk membuat import libs dari file def tanpa LLVM
- Avoid LLVM API for setting a module's code model and PIC/PIE levels #21238: Pekerjaan untuk menghindari penggunaan LLVM API saat menetapkan code model dan level PIC/PIE modul
- completely eliminate dependency on LLVM library API calls #25492: Pekerjaan untuk sepenuhnya menghapus ketergantungan pada pemanggilan API library LLVM
Pekerjaan tersisa terkait Clang
- File source C++ di repositori Zig saat ini dibangun dengan clang saat bootstrap
- src/windows_sdk.cpp: port to Zig #15657: Pekerjaan untuk memindahkan
src/windows_sdk.cppke Zig
- src/windows_sdk.cpp: port to Zig #15657: Pekerjaan untuk memindahkan
zig cc,zig c++,zig translate-cand other subcommands without a clang/llvm dependency in the compiler binary #20875: Pekerjaan untuk menyediakanzig cc,zig c++,zig translate-c, dan subperintah lain tanpa ketergantungan clang/llvm di dalam biner compiler- make resinator use aro's preprocessor instead of clang #17752: Pekerjaan untuk membuat resinator memakai preprocessor aro alih-alih clang
- make mingw .def.in file parsing use aro's preprocessor instead of clang #17753: Pekerjaan agar parsing file mingw
.def.inmemakai preprocessor aro alih-alih clang - move
@cImportto the build system #20630: Pekerjaan untuk memindahkan@cImportke build system
zig ar dan batasan pemrosesan file .bc
- zig ar: a drop-in llvm-ar replacement #9828: Masih ada pekerjaan untuk menjadikan
zig arsebagai pengganti llvm-ar - Backend LLVM sudah dapat menghasilkan file
.bc, tetapi compiler Zig tidak lagi akan memiliki kemampuan untuk mengompilasi file.bcmenjadi file objek - Untuk menangani use case ini, Clang harus diinstal secara terpisah
Perubahan yang diharapkan dari penghapusan ketergantungan
- Semua bug di sisi Zig akan masuk sepenuhnya ke dalam lingkup tanggung jawab proyek Zig
- Proses membangun compiler dari source dan bootstrap menjadi lebih sederhana, dan sistem host hanya memerlukan compiler C
- Distribusi Linux dan package manager seperti Homebrew tidak lagi perlu menangani masalah yang mereka timbulkan terkait LLVM, Clang, dan LLD
- Ukuran biner compiler Zig berkurang dari sekitar 150 MiB menjadi 5 MiB
- Kecepatan kompilasi berpotensi meningkat dengan skala beberapa digit
- Zig dapat mengimplementasikan optimization pass sendiri untuk mendorong kemajuan state of the art dalam komputasi
- Dapat menarik proyek riset seperti alive2
- Dapat mendorong kontribusi langsung dari para pemangku kepentingan yang menginginkan machine code lebih baik untuk CPU mereka sendiri, seperti produsen chip Intel, ARM, dan RISC-V
2 komentar
Apakah optimisasi dan dukungan platformnya bisa setara dengan LLVM..
Komentar Hacker News
Andrew adalah sosok yang sangat tajam, jadi kalau itu sudah dinyatakan sebagai target, rasanya tim pada akhirnya akan berhasil mewujudkannya
Namun, dari sudut pandang orang yang tidak terlalu paham kesulitan Zig terkait LLVM, keputusan ini terlihat seperti mengalihkan kapasitas tim ke alat pendukung seperti binutils alih-alih ke Zig itu sendiri
Saat hanya melihat judulnya, saya kira mereka akan membuang kompilernya, dan untuk proyek seperti Zig, tampaknya ada banyak hal yang bisa diperoleh dengan tetap mempertahankan LLVM
Meski begitu, gagasan menulis ulang banyak kode di dalam LLVM ke Zig alih-alih C++ terdengar cukup keren dan ambisius. Bisa dibilang sama ambisiusnya dengan upaya Lattner saat membuat LLVM
Namun, kode yang tanpa sengaja menjadi kompleksitas waktu kuadratik juga akan sulit dihindari jika Zig nantinya menjadi sepopuler dan seberguna LLVM
Intinya, “jika sebuah misi antariksa tidak menggunakan kembali kendaraan peluncur yang sudah ada, maka proyek itu menjadi proyek pengembangan kendaraan peluncur, dan semua hal lain yang tadinya dianggap inti misi menjadi urusan sekunder”
Bagian lain yang saya ingat menambahkan premis seperti, “alih-alih berkompromi agar sesuai dengan kendaraan peluncur yang ada, orang bisa saja berpikir akan lebih murah dan efisien membuat kendaraan peluncur yang cocok untuk misi tertentu”
Sebagian keberhasilan Rust juga bertumpu pada kompatibilitas serupa dengan C/C++
Sulit membayangkan Zig bisa sukses tanpa kemampuan serupa, jadi saya berharap tonggak ini tidak didorong apa adanya
Karena GCC tidak mau mengizinkan atau mengimplementasikan hal-hal yang Apple inginkan atau butuhkan
Jika lebih difokuskan seperti TCC, sebagian besar pekerjaannya akan jatuh ke sisi pembuatan kode untuk berbagai arsitektur
Ada dua masalah di sini. Yang satu adalah pembuatan kode dan yang lain adalah bootstrapping
Dari pengalaman saya, pass optimisasi pada kompilator itu mudah ditulis dan menyenangkan. Untuk memahami alokasi register dan bentuk SSA memang perlu membaca paper, tetapi menulis kode yang mengalirkan IR melalui berbagai pass optimisasi sambil terus merapikannya bisa sangat menyenangkan
Tanpa LLVM pun, pass optimisasi berkualitas tinggi masih bisa dibuat. Tetapi tahap melinierkan IR menjadi kode mesin adalah pekerjaan yang membosankan dan biasa saja, kecuali kalau Anda memang menyukai semua cara x86-32/64 mengenkode instruksi seperti “mov [eax+8*ebx], 123”
Jika Anda mengoptimalkan ukuran biner, apakah Anda benar-benar ingin mengukur di platform mana “push eax; push eax; push eax” lebih pendek daripada “add rsp,12”? Itu baru cerita x86, dan kalau dikalikan dengan arsitektur non-x86 yang tidak penting bagi kebanyakan pengembang, skalanya jadi jauh lebih besar
Sangat mungkin juga bug besar pada code generator untuk arsitektur yang jarang dipakai tidak ditemukan selama bertahun-tahun
Yang kedua adalah bootstrapping. Kompilator Zig yang ditulis dalam Zig akan dikompilasi dengan apa? Misalnya, Anda bisa mengompilasi kompilator Zig dengan kompilator Zig minimal tanpa optimisasi yang ditulis dalam C
Tetapi kalau tanpa optimisasi, Anda lalu harus mengompilasi ulang kompilator Zig dengan kompilator Zig yang sudah teroptimisasi. Bukan masalah yang tak terpecahkan, tetapi proses build yang panjang dan rumit berisiko mengusir calon kontributor
Zig sudah banyak dipromosikan karena bisa mengompilasi C, mungkin bahkan C++, jadi sekarang mengatakan akan sepenuhnya melepas LLVM terasa cukup ekstrem
Kecuali jauh lebih banyak orang ikut mendukung, tampaknya sangat kecil kemungkinan mereka bisa mendekati tingkat dukungan platform milik LLVM
Saya masih bisa memahami rencana menambahkan backend sendiri bagi yang menginginkannya, tetapi membuang LLVM begitu saja terasa terburu-buru
Sekarang justru lebih dekat ke kebalikan dari terburu-buru, karena tim sedang mengumpulkan masukan, mempelajari use case yang terdampak, dan mengukur kelayakannya
Agak aneh juga harus membundel salinan LLVM berukuran 100MB+ yang bahkan tidak diperlukan untuk kasus umum, jadi ini cukup masuk akal. Sebagai developer, banyak yang mungkin memang sudah memasangnya
Namun, bisa jadi sulit menjamin bahwa Zig yang terpasang akan bekerja dengan benar dengan versi LLVM di sistem. Kita lihat saja nanti
https://github.com/ziglang/zig/issues/13265
Belakangan ini saya membaca lebih banyak tentang Zig, dan juga sempat memakainya sebagai cara mudah mengompilasi C++ dengan LLVM tanpa harus bergulat dengan paket sistem. Fakta bahwa orang bisa berpindah dari C/C++ ke Zig adalah nilai jual yang besar
Ini terasa sangat mendadak dan tidak terduga. Saya tidak tahu apakah ini tepat atau salah untuk proyeknya, tetapi dari sudut pandang saya, ini benar-benar terasa datang entah dari mana
Di satu sisi, saya menghormati tekad teliti untuk mengurangi dependensi, tetapi harga yang harus dibayar tampak cukup serius
Hilangnya kompatibilitas C++ pada dasarnya menghapus salah satu keunggulan yang paling sering disebut para penggemar Zig di sekitar saya
Penurunan performa, meski mungkin hanya sementara, juga merupakan hal penting lain yang sering mereka sebutkan
Untuk orang yang hanya membaca sekilas, perlu ditekankan bahwa ini bukan keputusan final, melainkan sebuah proposal
Selama sekitar 4 tahun saya menulis seluruh proyek dan library embedded dengan Zig, jadi sekarang beberapa arsitektur dengan dukungan tier 1 akan hilang begitu saja?
Bahasanya memang milik mereka, jadi terserah mau diapakan, tetapi kalau begitu saya harap branding-nya juga disesuaikan dengan itu
Mungkin dukungan tier 1 akan terbagi menjadi dua kategori: dukungan tier 1 bawaan, dan dukungan tier 1 melalui backend LLVM opsional
Jika suatu arsitektur sudah punya dukungan tier 1, tampaknya tidak ada alasan dukungan itu hilang hanya karena backend LLVM dijadikan dependensi opsional
Seperti yang ditulis Andrew dalam proposalnya, pendekatan ini bahkan bisa menjadi jalan untuk mendukung arsitektur yang lebih jarang dengan lebih baik. Saya sendiri dengan senang hati akan mengerjakan backend Zig untuk arsitektur prosesor yang menarik, tetapi tidak akan pernah berkontribusi ke LLVM. Bekerja dengan C++ bukan sesuatu yang ingin saya lakukan sebagai hobi
Apa manfaatnya? Bukankah itu pemborosan sumber daya?
DLang punya 3 compiler
gdc berbasis backend GNU Compiler Collection, ldc berbasis backend LLVM, dan dmd berbasis generator kode x86 yang saya tulis untuk Zortech/Symantec/Digital Mars
Masing-masing punya kelebihan, kekurangan, dan sasaran yang berbeda, tetapi bahasa D yang didukung tetap sama
Secara umum para pengguna menyukai adanya pilihan, dan sebagian bahkan memakai lebih dari satu
Kalau memang begitu, saya suka pendekatan Zig
Ini sangat berguna karena saat pengembangan kita bisa memakai compiler tercepat, lalu untuk rilis final memakai compiler dengan runtime tercepat atau penggunaan memori paling kecil
Selain itu, jika ada spesifikasi bahasa yang diikuti semua compiler, ada jaminan bahwa bahasanya stabil dan tidak tiba-tiba rusak dari bawah
Tentu saja, ada juga kelebihan pada bahasa seperti Zig yang masih bisa mengubah apa yang diinginkan untuk membuat bahasanya lebih konsisten, rapi, dan kuat. Namun belakangan ini saya jauh lebih menghargai stabilitas semacam itu, karena saya bisa fokus memberi nilai nyata bagi pengguna alih-alih terus mengejar perubahan alat pengembangan
Salah satu alasan utama Zig menarik bagi saya adalah karena bisa langsung disisipkan sebagai alternatif compiler C/C++
Di Windows, teman-teman saya bilang Zig lebih mudah dipasang sebagai compiler C/C++ daripada alternatif lain mana pun
Jika proposal ini diterima, secara pribadi saya rasa popularitas Zig akan turun sampai setara dengan Hare atau bahasa lain yang sangat niche
Untuk membuat rekan kerja saya mau mencoba Zig sekali saja, saya bahkan harus mengirimkan tulisan bahwa Uber memakainya di produksi. Kalau tidak memberi nilai langsung pada proyek yang sudah ada, mereka tidak akan berpikir dua kali
Meski begitu, saya paham latar belakang proposal ini. Waktu kompilasi LLVM bisa terasa mengerikan, dan punya bytecode sendiri memungkinkan teknik optimasi yang keren juga. Menangani bug LLVM pada praktiknya nyaris mustahil disentuh, dan saya juga melihat hal seperti itu di ekosistem Julia
Kalau rekomendasi saya ada artinya, menurut saya Zig sebaiknya 1) memakai bytecode kustom untuk build debug demi build cepat dan debugging cepat, dan 2) memakai LLVM untuk build rilis demi performa runtime yang cepat
Jika 1) bisa dilakukan sambil mempertahankan dukungan cross-compilation C/C++, misalnya dengan hanya menyerahkan bagian itu ke LLVM, maka meskipun ada trade-off harus memelihara kode backend tambahan, itu mungkin kompromi terbaik
Itu membutuhkan keterampilan tersendiri yang berbeda dari kerja compiler Julia tingkat tinggi, dan kadang perlu waktu lama untuk menggabungkan perbaikan bug ke upstream
Namun pada kenyataannya kami punya hubungan yang cukup baik dan produktif dengan upstream, dan jika kami memutuskan menghapus LLVM, proyek ini akan menyelesaikan jauh lebih sedikit hal
Terutama dukungan GPU dan dukungan HPC, misalnya PPC, bergantung pada LLVM
Karena itu kami tetap pada posisi bahwa Julia harus dibangun sesuai patchset/fork kami, dan kami tidak menginvestasikan waktu pada bug yang muncul pada build Julia tanpa patch tersebut. Ini khususnya sering terjadi pada build distribusi
Dari sudut pandang orang yang mengamati pengerjaan backend non-LLVM di bahasa lain, proposal yang ditautkan terasa terlalu penuh kesombongan
Kalau penulisnya bukan orang itu, saya akan menganggapnya sebagai isu GitHub yang asal ditulis oleh pemula Zig
Proposal itu meremehkan jumlah pekerjaan yang dibutuhkan, secara tersirat mengecilkan semua kerja yang sudah masuk ke LLVM, dan di setiap kalimatnya terasa kepercayaan diri sekaligus macho bahwa “jelas kita bisa membuatnya lebih murah, lebih cepat, dan lebih baik”. Mengecewakan
Sampai sekarang saya benar-benar menghormati pekerjaan Andrew, jadi dengan niat baik saya ingin menganggap mungkin ini ditulis terburu-buru atau spontan sehingga terkesan seperti itu
Namun tulisan ini tidak memberi kepercayaan, juga tidak membuat saya melihat proposalnya dengan pikiran yang lebih terbuka
Webpack dan esbuild adalah contohnya
Waktu yang tepat untuk membangun sesuatu tanpa LLVM adalah beberapa tahun lalu. Tetapi sekarang, kalau fitur C++ dihapus, itu kemungkinan akan menjadi akhir bagi Zig
Mengejutkan bahwa alih-alih menghapusnya secara bertahap, mereka tidak mengumumkan rencana untuk menulis compiler C++ mereka sendiri dengan Zig
Saya bahkan tidak yakin seseorang yang memulainya pada ulang tahunnya yang ke-18 bisa menulis compiler C++. Mungkin sisa waktu hidupnya pun belum tentu cukup untuk membuat compiler yang benar-benar berfungsi
Zig ingin menjadi C baru bagi dunia, bukan terlalu ingin menjadi C++ baru bagi dunia
Dari usulan ini juga terlihat bahwa cross-compile C akan tetap didukung
Pilihan ini mungkin memang tepat. Saat ini C banyak digunakan di dunia embedded, dan di ranah itu LLVM kurang baik
Kalau aku jadi Zig, aku juga ingin menargetkan semua mikrokontroler, dan ini satu-satunya jalan yang realistis untuk mencapainya