11 poin oleh GN⁺ 2024-03-19 | 1 komentar | Bagikan ke WhatsApp
  • Cranelift adalah backend pembuatan kode berlisensi Apache-2.0, yang dikembangkan sebagai bagian dari runtime Wasmtime untuk WebAssembly
  • Pada Oktober 2023, proyek Rust mulai menyediakan Cranelift sebagai komponen opsional dalam toolchain nightly
  • Pengguna kini dapat memakai Cranelift sebagai backend pembuatan kode untuk debug build proyek yang ditulis dengan Rust
  • Cranelift bersaing dengan compiler yang sudah ada, dan menghasilkan kode lebih cepat dengan desain yang disederhanakan yang memprioritaskan hanya optimisasi penting

Pentingnya waktu kompilasi

  • Pengguna bahasa pemrograman menginginkan waktu kompilasi yang cepat
  • Rust, seperti bahasa lain yang menggunakan LLVM, juga menghadapi keluhan soal waktu kompilasi
  • Compiler yang dapat menghasilkan kode dengan cukup cepat bisa lebih menguntungkan daripada menggunakan interpreter
  • Compiler yang berfokus pada kecepatan kompilasi dapat memiliki nilai tersendiri

Optimisasi Cranelift

  • Cranelift melakukan optimisasi dalam berbagai cara saat menghasilkan kode
  • Pipeline optimisasinya berbasis E-graphs, yaitu struktur data yang merepresentasikan himpunan representasi antara secara efisien
  • Dalam compiler tradisional, urutan optimisasi sangat memengaruhi kualitas kode yang dihasilkan
  • Cranelift menggunakan E-graph agar urutan optimisasi tidak memengaruhi hasil
  • Mengekstrak representasi akhir dari E-graph adalah masalah NP-complete, tetapi Cranelift menggunakan heuristik untuk mengekstrak representasi yang cukup baik dengan cepat

Cranelift untuk Rust

  • Upaya untuk menggunakan Cranelift sebagai backend Rust cukup besar
  • Compiler Rust menggunakan mid-level IR untuk merepresentasikan program yang telah melalui type checking
  • Untuk menggunakan Cranelift, dibutuhkan pustaka yang mengonversi mid-level IR ke CLIF
  • Pustaka ini sebagian besar ditulis oleh anggota tim compiler Rust, "bjorn3"
  • Pengguna dapat mencoba backend Cranelift menggunakan rustup dan cargo.

Pendapat GN⁺

  • Adopsi Cranelift dapat dilihat sebagai respons terhadap permintaan berkelanjutan di komunitas Rust untuk mengurangi waktu kompilasi. Ini dapat membantu meningkatkan produktivitas developer.
  • Pendekatan Cranelift yang menggunakan E-graphs untuk menyelesaikan masalah urutan optimisasi menghadirkan paradigma baru dalam desain compiler. Ini dapat membuka arah baru dalam riset dan pengembangan compiler.
  • Dari sudut pandang kritis, seberapa stabil dan efisien Cranelift dibandingkan LLVM masih perlu divalidasi lewat lebih banyak kasus penggunaan di dunia nyata.
  • Backend compiler lain yang menawarkan fungsi serupa dengan Cranelift mencakup libgccjit milik GCC, dan melalui perbandingan dengan alternatif-alternatif ini, kelebihan dan kekurangan Cranelift bisa dipahami dengan lebih jelas.
  • Developer yang mengadopsi Cranelift perlu mempertimbangkan kompatibilitas dengan infrastruktur berbasis LLVM yang ada serta biaya transisinya, dan harus mengevaluasi performa serta stabilitas Cranelift dengan cermat.

1 komentar

 
GN⁺ 2024-03-19
Komentar Hacker News
  • Backend dan optimisasi dapat digunakan secara berbeda untuk crate yang berbeda. Untuk dependensi, sering kali masuk akal menggunakan build LLVM yang dioptimalkan, sementara untuk kode sendiri menggunakan debug LLVM atau Cranelift.
  • Artikel yang memberikan gambaran bagus tentang kecepatan optimisasi versus kualitas optimisasi. Secara khusus, compile copy-and-patch yang menggunakan kode yang telah dikompilasi sebelumnya masih yang paling cepat, tetapi ruang untuk optimisasinya lebih sedikit. Cranelift menggunakan e-graphs untuk merepresentasikan kesetaraan di IR, sehingga memungkinkan lebih banyak optimisasi dibanding pendekatan copy-and-patch. Output yang paling optimal kemungkinan tetap berasal dari toolchain kompiler tradisional seperti LLVM atau GCC, tetapi bagi pengguna yang ingin mendapatkan output yang "cukup cepat" secepat mungkin, teknik kompiler baru menawarkan alternatif yang menjanjikan.
  • Ada banyak komentar tentang full debug build, tetapi saya rasa perbedaan yang paling penting adalah waktu incremental build untuk perubahan kecil. Inilah yang mempercepat iterasi pengembangan. Saat membandingkan waktu build setelah perubahan kecil di rust-analyzer dan proyek gleam, penambahan Cranelift dan mold menunjukkan peningkatan yang jauh lebih cepat. Bahkan dibandingkan dengan Terraform yang dibangun dengan bahasa Go, ini menunjukkan peningkatan besar untuk Rust.
  • Dukungan untuk Mac M1-M3 saat ini belum ada, dan tampaknya juga belum ada dukungan Windows. Pembaruan terbaru dari kontributor yang paling aktif memberikan kesimpulan yang kurang jelas. Dukungan Windows saat ini diabaikan, dan macOS saat ini hanya mendukung x86_64. Jika menggunakan prosesor M1, Anda bisa mencoba memasang rustc versi x86_64 dan menggunakan Rosetta 2, tetapi karena Rosetta 2 dapat memengaruhi performa, itu perlu dibandingkan dengan backend LLVM.
  • Mencoba panduan di artikel pada proyek Bevy dan membandingkannya dengan build "normal". Release build tampak lebih cepat dibanding build Cranelift+debug, tetapi itu karena menggunakan sccache dan cache di NAS lokal. Saat dicoba lagi hanya dengan debug build tanpa caching, waktu kompilasi berkurang hampir setengahnya.
  • Menemukan ESC/Java melalui tautan Equality Graphs. Penasaran apakah ada yang benar-benar pernah mencoba atau berhasil menggunakannya. Menarik juga untuk membandingkannya dengan Spot bugs (sebelumnya dikenal sebagai Findbugs).
  • Sangat antusias bahwa debug build dengan Cranelift dapat mempercepat iterasi pengembangan. Terutama pada WASM/Frontend Rust, kecepatan iterasi itu penting, dan era baru tool Rust kadang-kadang memberikan build di bawah 1 detik. Karena ARM macOS masih belum didukung, pengguna M1-3 harus menunggu sedikit lebih lama.
  • Penasaran apakah ada benchmark runtime saat menggunakan Cranelift, bukan waktu kompilasi. Artikel menyebut "dua kali lebih lambat", tetapi data itu berasal dari 2020. Ingin tahu apakah sejak itu sudah banyak membaik.
  • Penasaran apakah ada yang bisa menjelaskan mengapa Cranelift diperkirakan lebih cepat daripada LLVM, dan mengapa peningkatan tersebut tidak bisa juga diterapkan pada LLVM.