Lamina: Backend trình biên dịch đa kiến trúc tạo mã native mà không cần LLVM
(github.com/SkuldNorniern)Xin chào, một người quen của tôi gần đây đã phát triển một backend trình biên dịch, thấy khá thú vị nên chia sẻ lại.
- Giới thiệu dự án
Lamina là một backend trình biên dịch đa kiến trúc tạo mã native trực tiếp từ IR dựa trên SSA mà không cần các phụ thuộc nặng như LLVM. Nó hỗ trợ x86_64, AArch64, RISC-V và WebAssembly trên cùng một IR.
Mỗi lần làm một DSL đơn giản hoặc một ngôn ngữ thử nghiệm, việc phải build LLVM và quản lý các phụ thuộc nặng tới vài GB luôn tạo cảm giác quá cồng kềnh. Dự án này bắt đầu từ ý tưởng: “Hãy thử làm một thứ nhẹ hơn, chỉ cần đưa IR vào là ra assembly.”
- Các đặc điểm chính
▸ Không có phụ thuộc bên ngoài
Chuyển đổi trực tiếp từ IR sang mã máy mà không cần LLVM hay Cranelift.
Thời gian build ngắn hơn và việc phân phối cũng đơn giản hơn.
▸ IR dựa trên SSA
Vì ở dạng Static Single Assignment nên việc tổ chức pipeline tối ưu hóa khá gọn gàng.
▸ Mô hình bộ nhớ tường minh
Phân biệt rõ cấp phát stack/heap ngay ở cấp IR, giúp việc phân tích bộ nhớ dễ hơn.
▸ Đa kiến trúc
Hỗ trợ nhiều target trên cùng một IR:
- x86_64 (Linux, macOS, Windows)
- AArch64/ARM64 (Linux, macOS, Windows)
- RISC-V (RV32/64/128)
- WebAssembly (32/64-bit)
▸ API IRBuilder
Cung cấp API để xây dựng IR theo phong cách hàm.
Theo mô tả, nó có thể biểu diễn luồng điều khiển và các phép toán bộ nhớ theo cách an toàn về kiểu.
- Trạng thái hiện tại
Các phép toán số học cơ bản, luồng điều khiển như điều kiện/nhánh/vòng lặp, gọi hàm không đệ quy và một số tối ưu hóa đơn giản đã hoạt động.
Dù chưa sẵn sàng cho production, nhưng theo mô tả thì đã đủ để thử nghiệm làm backend cho toy language hoặc DSL.
- Quy trình sử dụng
Đại khái là sẽ dùng theo kiểu này:
- Parse ngôn ngữ nguồn để tạo AST
- Dùng IRBuilder để chuyển AST sang Lamina IR
- Lamina thực hiện tối ưu hóa và tạo mã native theo từng target
Chỉ cần phần tạo IR được viết tốt, phần còn lại Lamina sẽ tự xử lý.
- Kết lời
Cá nhân tôi luôn cảm thấy việc “tự làm một backend trình biên dịch” là điều gì đó rất xa vời, nên khi thấy người quen thực sự làm được thì khá bất ngờ.
Tất nhiên nó chưa đạt mức độ hoàn thiện hay tối ưu hóa như LLVM, nhưng để thử nghiệm nhẹ nhàng hoặc dùng cho mục đích giáo dục thì trông khá ổn.
Bản thân tôi cũng đã thử phát triển một trình biên dịch cho ngôn ngữ Eom Jun-sik bằng lamina.
Nếu bạn quan tâm thì rất đáng để xem thử!
Chưa có bình luận nào.