Tập 57: Mở rộng subset

Đoạn hello-world chạy được rất đẹp, nhưng compiler thật cần nhiều cấu trúc dữ liệu phức tạp hơn thế. Nó cần struct để lưu thông tin định nghĩa, cần module để chia file, và cần khả năng gọi hàm đệ quy tương hỗ (mutual recursion) giữa các phase phân tích.

Sprint 88 và 89 là giai đoạn nới rộng biên giới của subset compiler.

Chúng tôi đưa thêm cấu trúc struct và cơ chế import module cơ bản vào subset. Việc này bắt type checker và codegen phải xử lý việc tính toán kích thước struct (struct layout sizing) và phân giải địa chỉ biến toàn cục giữa các module khác nhau.

Việc tính toán kích thước struct trên compiler native lúc đầu gặp lỗi do tôi đã quên tính toán phần padding căn lề của các kiểu dữ liệu khác nhau trên kiến trúc 64-bit. Compiler native sinh ra struct layout bị lệch so với layout mà linker kỳ vọng, dẫn đến việc chương trình crash ngay khi khởi động. Tôi đã phải viết một bộ test layout chuyên dụng để kiểm tra chéo kích thước từng kiểu struct trước khi phát sinh mã máy.

Chúng tôi viết thêm 5 fixtures phức tạp để kiểm chứng. Công cụ so khớp object (object-compare) được đưa vào hoạt động để đảm bảo file object .o sinh ra từ native compiler khớp cấu trúc nhị phân với file object do JS compiler sinh ra. Mỗi tính năng mới được nới rộng thành công giúp cho compiler viết bằng DUY tiến gần hơn đến việc có đủ sức mạnh để tự biên dịch chính nó — bài test tối cao của quá trình tự trị.


Bình luận (0)

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