- Cranelift là một backend sinh mã theo giấy phép Apache-2.0, được phát triển như một phần của runtime Wasmtime dành cho WebAssembly
- Vào tháng 10 năm 2023, dự án Rust bắt đầu cung cấp Cranelift như một thành phần tùy chọn trong bộ công cụ nightly
- Giờ đây người dùng có thể sử dụng Cranelift làm backend sinh mã cho các bản dựng debug của dự án viết bằng Rust
- Cranelift cạnh tranh với các compiler hiện có và tạo mã nhanh hơn nhờ thiết kế đơn giản hóa, chỉ ưu tiên các tối ưu hóa quan trọng
Tầm quan trọng của thời gian biên dịch
- Người dùng ngôn ngữ lập trình luôn muốn thời gian biên dịch nhanh
- Rust, cũng như các ngôn ngữ khác sử dụng LLVM, đã có những phàn nàn về thời gian biên dịch
- Một compiler có thể sinh mã đủ nhanh có thể có lợi thế hơn so với việc dùng trình thông dịch
- Một compiler tập trung vào tốc độ biên dịch có thể mang lại nhiều giá trị
Tối ưu hóa của Cranelift
- Cranelift thực hiện tối ưu hóa theo nhiều cách trong quá trình sinh mã
- Pipeline tối ưu hóa dựa trên E-graphs, một cấu trúc dữ liệu biểu diễn hiệu quả tập hợp các biểu diễn trung gian
- Trong các compiler truyền thống, thứ tự tối ưu hóa ảnh hưởng lớn đến chất lượng mã được tạo ra
- Cranelift sử dụng E-graph để thứ tự tối ưu hóa không ảnh hưởng đến kết quả
- Việc trích xuất biểu diễn cuối cùng từ E-graph là một bài toán NP-complete, nhưng Cranelift dùng heuristic để nhanh chóng trích xuất một biểu diễn đủ tốt
Cranelift cho Rust
- Đã có nhiều nỗ lực đáng kể để sử dụng Cranelift làm backend cho Rust
- Compiler Rust dùng mid-level IR để biểu diễn chương trình đã được kiểm tra kiểu
- Để dùng Cranelift, cần có một thư viện chuyển đổi mid-level IR sang CLIF
- Thư viện này chủ yếu được viết bởi "bjorn3", một thành viên của nhóm compiler Rust
- Người dùng có thể thử backend Cranelift bằng
rustup và cargo.
Ý kiến của GN⁺
- Việc đưa Cranelift vào có thể được xem là phản hồi trước nhu cầu kéo dài trong cộng đồng Rust về việc rút ngắn thời gian biên dịch. Điều này có thể góp phần nâng cao năng suất của nhà phát triển.
- Cách tiếp cận của Cranelift trong việc dùng E-graphs để giải quyết vấn đề thứ tự tối ưu hóa đưa ra một mô hình mới trong thiết kế compiler. Điều này có thể mở ra những hướng đi mới cho nghiên cứu và phát triển compiler.
- Từ góc nhìn phản biện, mức độ ổn định và hiệu quả của Cranelift so với LLVM vẫn cần được kiểm chứng thêm qua nhiều trường hợp sử dụng thực tế hơn.
- Các backend compiler khác cung cấp chức năng tương tự Cranelift có thể kể đến libgccjit của GCC; việc so sánh với các lựa chọn thay thế này có thể giúp làm rõ hơn ưu và nhược điểm của Cranelift.
- Các nhà phát triển đưa Cranelift vào sử dụng cần cân nhắc khả năng tương thích với hạ tầng hiện có dựa trên LLVM cũng như chi phí chuyển đổi, đồng thời đánh giá kỹ hiệu năng và độ ổn định của Cranelift.
1 bình luận
Ý kiến Hacker News
rustcvà dùng Rosetta 2, nhưng Rosetta 2 có thể ảnh hưởng đến hiệu năng nên cần so sánh với backend LLVM.sccachevà NAS cục bộ để cache. Khi thử lại chỉ với bản dựng debug và không có cache, thời gian biên dịch giảm gần một nửa.