Trình biên dịch Rust được viết bằng C
(notgull.net)Tại sao lại viết trình biên dịch Rust bằng C?
-
Có nhiều lý do khiến hoạt động gần đây giảm đi
- Các sự kiện cá nhân như người thân qua đời
- Trách nhiệm trong công việc tăng lên
- Sự nhiệt huyết với mã nguồn mở giảm sút
- Tập trung vào một dự án mới
-
Dự án này là viết một trình biên dịch Rust thuần C
- Được viết hoàn toàn bằng C, không dùng C++,
flex,yacchayMakefile - Tên dự án là Dozer
- Được viết hoàn toàn bằng C, không dùng C++,
Tại sao lại làm việc này?
- Cần hiểu bootstrapping và tầm quan trọng của nó
- Muốn chạy mã Rust thì cần có trình biên dịch
- Trình biên dịch chính của Rust là rustc
- rustc được viết bằng Rust và cần thiết để biên dịch mã Rust
- Để biên dịch rustc thì cần một phiên bản rustc trước đó
- Các phiên bản đầu tiên của rustc được viết bằng OCaml
- Trình biên dịch OCaml có thể được biên dịch bằng Guile, và Guile được viết bằng C
Nguyên lý đi xuống
-
Giới thiệu dự án Bootstrappable Builds
- Bắt đầu từ một binary seed 512 byte
- Từng bước tạo ra các trình biên dịch ngày càng phức tạp hơn từ những trình biên dịch đơn giản
- Cuối cùng có thể biên dịch TinyCC, GCC, Linux, v.v.
-
Rust xuất hiện rất muộn trong quá trình này
- Dùng mrustc để biên dịch rustc phiên bản 1.56
- Nếu muốn dùng Rust trước khi đưa C++ vào thì là không thể
-
Dozer hướng tới một trình biên dịch Rust có thể bootstrap bằng C
- Phải có khả năng bootstrap bằng TinyCC
Kế hoạch
-
Đã làm việc với Dozer trong hai tháng qua
- Có thể biên dịch bằng TinyCC và cproc
- Dùng QBE làm backend
- Hiện đã xong lexer và một phần parser
- Việc mở rộng macro/module đang được để lại sau
- Type check hiện chỉ hỗ trợ
i32 - Phần sinh mã vẫn còn chưa hoàn thiện
-
Kế hoạch sắp tới
- Từng bước phát triển Dozer để có thể biên dịch các mẫu
libccơ bản,libcorevà rustc - Tạo một công cụ tương tự
cargođể có thể biên dịch các gói Rust - Loại bỏ mã được sinh tự động
- Tạo quy trình biên dịch rustc và
cargo
- Từng bước phát triển Dozer để có thể biên dịch các mẫu
Tổng hợp của GN⁺
- Bài viết này nói về một dự án viết trình biên dịch Rust bằng C thuần
- Giải thích tầm quan trọng của bootstrapping và quá trình tạo ra trình biên dịch Rust theo cách đó
- Dự án Dozer hướng tới một trình biên dịch Rust có thể bootstrap bằng C
- Đây là một dự án rất thách thức; chưa rõ có thành công hay không, nhưng bản thân việc thử sức đã có ý nghĩa
1 bình luận
Ý kiến trên Hacker News
Để bootstrap Rust, có lẽ nên viết một proto-Rust bằng C trước, rồi dùng proto-Rust để viết toàn bộ trình biên dịch Rust
Tôi đang viết một trình biên dịch C bằng Rust như một dự án sở thích, và gọi nó là "Small C Compiler"
printf("Hello World!")typedefhay khôngTrong phần cứng cũng tồn tại cùng một vấn đề bootstrap
Tôi đã phải lần theo 4 liên kết mới tìm thấy lợi ích của bootstrap
Khi C++ được đưa vào chuỗi bootstrap thì việc bootstrap gần như kết thúc
Để tạo ra nhị phân mới trên hệ thống đích, rustc phải hỗ trợ hệ thống đó
Hãy tưởng tượng việc viết một trình thông dịch hoặc trình biên dịch C++ bằng Scheme
Khi nhìn vào toàn bộ stack, đây có thể là một cách để né tránh vấn đề "trusting trust"
Tôi thích việc dùng QBE làm backend
Có thể cân nhắc dùng FORTH như một phần của toolchain trong quá trình bootstrap