Tập 49: LLVM trở thành đường chính

Sau khi đã chứng minh được sức mạnh của LLVM qua OS lab và freestanding mode, việc duy trì hai backend song song (C backend và LLVM backend) trở thành một gánh nặng bảo trì không đáng có. Mỗi khi thêm một cú pháp mới (như enum hay toán tử ?), chúng tôi phải viết code sinh mã gấp đôi. Điều này làm chậm tốc độ phát triển và tăng gấp đôi số lượng bugs cần debug.

Sprint 71-75 (Phase K) chốt hạ một quyết định quan trọng: đưa LLVM thành backend mặc định.

# Lệnh này mặc định dùng LLVM backend
duy build examples/hello.duy

C backend bị đẩy lùi về vị trí tham chiếu (reference backend) phục vụ cho các so sánh conformance và deprecate dần. duy build từ nay không còn sinh ra các file .c tạm thời nữa. Trình biên dịch phun trực tiếp ra file nhị phân hoặc object file thông qua LLVM.

Quyết định này ép toàn bộ hệ thống test suite (lúc này đã lên tới hơn 200 tests) phải chạy qua LLVM path. Chúng tôi phải xây dựng một ma trận conformance (parity matrix) để đảm bảo mọi tính năng của ngôn ngữ (từ match exhaustiveness, view checking cho đến panic propagation) đều chạy đúng và không bị regression so với C backend cũ.

Tôi đã dành cả tuần để port và kiểm tra toàn bộ bộ test. Có những test case chạy đúng bên C backend nhưng lại crash bên LLVM chỉ vì LLVM tối ưu hóa quá mạnh tay và loại bỏ những đoạn code mà nó cho là "dead code" nhưng thực chất lại là những đoạn kiểm tra an toàn bộ nhớ của chúng tôi. Tìm ra các kẽ hở tối ưu hóa đó của LLVM là một trải nghiệm mở mang tầm mắt. Báo cáo benchmark 003-llvm-default.md cho thấy hiệu năng biên dịch tăng lên đáng kể do bỏ được bước trung gian ghi file C và gọi compiler ngoài. Quan trọng hơn, compiler từ nay có một trục xương sống duy nhất, sạch sẽ và chuẩn quy để tiến lên.


Bình luận (0)

Đang tải bình luận...