Thời gian biên dịch nhanh của Zig thuyết phục được đội ngũ phát triển Roc, dẫn đến việc viết lại toàn bộ trình biên dịch

BigGo Editorial Team
Thời gian biên dịch nhanh của Zig thuyết phục được đội ngũ phát triển Roc, dẫn đến việc viết lại toàn bộ trình biên dịch

Đội ngũ phát triển ngôn ngữ lập trình Roc đã thông báo kế hoạch viết lại trình biên dịch của họ từ Rust sang Zig, tạo ra nhiều cuộc thảo luận sôi nổi trong cộng đồng lập trình viên về việc lựa chọn ngôn ngữ cho lập trình hệ thống. Quyết định này được đưa ra khi nhóm đang chuẩn bị cho phiên bản đánh số đầu tiên của Roc, phiên bản 0.1.0.

Thời gian biên dịch là mối quan tâm chính dẫn đến thay đổi

Trọng tâm của sự chuyển đổi này nằm ở một vấn đề then chốt mà cộng đồng lập trình viên rất quan tâm: tốc độ biên dịch. Phản hồi từ cộng đồng cho thấy thời gian biên dịch chậm có thể ảnh hưởng đáng kể đến năng suất và sự hài lòng của lập trình viên. Như một lập trình viên đã nhận xét trong các cuộc thảo luận:

Tôi sử dụng Rust nhiều nhưng Roc nói đúng: thời gian biên dịch không tương xứng với độ an toàn mà bạn nhận được. Ít nhất là trong dự án của tôi.

Không chỉ là tốc độ: Các cân nhắc kỹ thuật

Cuộc thảo luận trong cộng đồng cho thấy ngoài thời gian biên dịch, quyết định này còn bao gồm nhiều cân nhắc kỹ thuật rộng hơn. Các lập trình viên chỉ ra rằng Zig mang lại nhiều ưu điểm cho việc phát triển trình biên dịch, bao gồm việc xử lý liên kết tĩnh tốt hơn, các thao tác bit trực quan hơn, và quản lý bộ nhớ đơn giản hóa thông qua việc truyền bộ cấp phát rõ ràng. Cộng đồng đặc biệt nhấn mạnh cách tiếp cận thực tế của Zig đối với lập trình hệ thống, định vị nó như một giải pháp trung gian giữa tính tối giản của C và sự phức tạp của Rust.

Những động lực chính để chuyển sang Zig:

  • Thời gian biên dịch nhanh hơn
  • Hỗ trợ liên kết tĩnh tốt hơn
  • Các thao tác xử lý bit trực quan hơn
  • Mô hình quản lý bộ nhớ đơn giản hơn
  • Tạo mã LLVM bitcode trực tiếp
  • Hỗ trợ MultiArrayList cho lập trình kiểu struct-of-arrays

Bối cảnh phát triển ngôn ngữ

Một góc nhìn thú vị từ cuộc thảo luận cộng đồng là cách thức phát triển của các ngôn ngữ lập trình hệ thống. Mặc dù Rust là lựa chọn tự nhiên khi trình biên dịch Roc được viết lần đầu vào năm 2019, Zig đã phát triển đáng kể kể từ đó. Các lập trình viên lưu ý rằng điều này phản ánh xu hướng rộng lớn hơn trong ngành, khi các dự án mới ngày càng cân nhắc việc sử dụng Zig cho các tác vụ lập trình hệ thống mà trước đây mặc định sẽ sử dụng Rust.

Các Thay Đổi Dự Kiến của Trình Biên Dịch:

  • Viết lại bộ phân tích cú pháp theo kiểu đệ quy giảm dần
  • Trình định dạng mới với việc kiểm soát độ rộng dòng
  • Hệ thống phân giải tên được sửa đổi
  • Cải thiện khả năng tạo tài liệu
  • Cập nhật quá trình đơn hình hóa không sử dụng Morphic
  • Tạo mã mới dựa trên LLVM bitcode
  • Chuyển đổi backend phát triển sang trình thông dịch

Tranh luận về việc triển khai Parser

Một điểm tranh cãi kỹ thuật trong cộng đồng xoay quanh quyết định chuyển từ parser combinators sang phân tích cú pháp recursive descent. Trong khi một số lập trình viên cho rằng parser combinators về cơ bản là recursive descent với các tính năng bổ sung, những người khác ủng hộ sự thay đổi này, viện dẫn khả năng xử lý lỗi tốt hơn trong các parser được viết thủ công.

Việc viết lại này thể hiện một sự thay đổi đáng kể trong bối cảnh lập trình hệ thống, nơi các cân nhắc thực tế như tốc độ biên dịch và tính tiện dụng trong phát triển ngày càng thách thức sự thống trị của tính an toàn bộ nhớ như yếu tố quyết định chính trong việc lựa chọn ngôn ngữ.

Ghi chú kỹ thuật:

  • Parser combinators: Kỹ thuật lập trình hàm để xây dựng parser bằng cách kết hợp các hàm phân tích nhỏ hơn
  • Recursive descent: Kỹ thuật phân tích từ trên xuống trong đó mỗi ký hiệu không kết thúc trong ngữ pháp có hàm phân tích riêng
  • Static linking: Quá trình trong đó các thư viện được tích hợp vào tệp thực thi cuối cùng, giúp nó dễ dàng chạy trên nhiều hệ thống khác nhau

Tham khảo: Rewriting a Language's Compiler in Itself