1 điểm bởi GN⁺ 2024-08-26 | 1 bình luận | Chia sẻ qua WhatsApp

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, yacc hay Makefile
    • Tên dự án là Dozer

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 libc cơ bản, libcore và 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 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

 
GN⁺ 2024-08-26
Ý 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

    • Proto-Rust không có borrow checker hay hỗ trợ macro, không giải phóng bộ nhớ, và cũng không cần tạo ra mã tốt
    • Proto-Rust giống như C với cú pháp Rust
    • Tò mò không hiểu vì sao con đường này đã không được chọn
  • 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"

    • Dùng Cranelift làm backend, kiến trúc trình biên dịch có thể cắm thêm và dễ hack
    • Chưa có kế hoạch mã nguồn mở cho đến khi nó xử lý được printf("Hello World!")
    • Đang cố triển khai preprocessor và parser, đồng thời tham gia vào rust-peg và HimeCC
    • Tò mò không biết giới học thuật có lời giải nào cho vấn đề typedef hay không
  • Trong phần cứng cũng tồn tại cùng một vấn đề bootstrap

    • Máy tính được tạo ra bằng những máy tính và phần mềm đã được tạo ra trước đó
    • Đây là một chủ đề thú vị để suy ngẫm
  • Tôi đã phải lần theo 4 liên kết mới tìm thấy lợi ích của bootstrap

    • Tôi đã mong phần "tại sao" trong tiêu đề sẽ giải thích điều đó
  • Khi C++ được đưa vào chuỗi bootstrap thì việc bootstrap gần như kết thúc

    • Nếu muốn dùng Rust thì phải dùng nó trước khi C++ được đưa vào
    • Sẽ rất hay nếu trình biên dịch Rust có thể được bootstrap từ C
    • Nhưng các phiên bản rustc trước đó lại được biên dịch bằng các phiên bản rustc trước nữa
    • Có thể biên dịch thành công trình biên dịch OCaml bằng Guile
    • Tác giả muốn loại bỏ bước C++ và ưu tiên bước C
    • Động cơ của tác giả chưa rõ ràng
  • Để tạo ra nhị phân mới trên hệ thống đích, rustc phải hỗ trợ hệ thống đó

    • Nếu thêm hỗ trợ đó vào rustc thì nó có thể tự build
  • 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

    • Từ Scheme đi thẳng tới gcc hiện tại sẽ là một đường tắt rất lớn
    • Tuy nhiên, quan điểm phổ biến là việc viết một trình biên dịch C++ gần như bất khả thi
  • 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

    • Sẽ rất thú vị nếu được thấy so sánh giữa Rust và LLVM
    • Chúc may mắn
  • Có thể cân nhắc dùng FORTH như một phần của toolchain trong quá trình bootstrap