Đọc được AST mới chỉ là điều kiện cần. Để biên dịch, trình biên dịch native phải tự phân giải tên (name resolution) và kiểm tra kiểu (type checking). Sprint 128 đặt ra thử thách port semantic core.
Chúng tôi viết tools/sym_subset.duy (1,037 dòng) và tools/tc_subset.duy (5,387 dòng) bằng code DUY. Đây là phần logic nặng nhất, đòi hỏi compiler phải tự theo dõi ownership chuyển dịch, mượn vùng nhớ, và lan truyền effects mà không được phép dùng các cấu trúc dynamic map/set của JavaScript. Do trong subset chưa có dynamic map, tôi buộc phải viết một hash map tối giản chạy trên mảng phẳng cố định để quản lý bảng ký hiệu.
Chúng tôi chạy tests trên corpus gồm 13 file phân giải symbol và 33 file typecheck (19 accept và 14 reject).
Mốc kiểm thử quan trọng nhất là bảo toàn vị trí span: khi phát hiện lỗi gán sai kiểu, native checker phải in ra mã lỗi, dòng/cột chính xác tuyệt đối như bản JS oracle. Chỉ cần lệch một cột do tính sai độ dài token của biến, gate kiểm thử sẽ lập tức báo đỏ.
Tôi nhớ có lần test suite báo mismatch chỉ vì native checker tính độ dài của token chứa ký tự đặc biệt UTF-8 (như tiếng Việt) theo số byte thay vì số ký tự, làm dấu trỏ dưới dòng lỗi bị lệch đi 2 cột. Sửa lỗi này buộc tôi phải viết lại một phần thư viện xử lý chuỗi Unicode thô của stdlib. Khi cả 19 accept và 14 reject tests đều xanh hoàn toàn trên cả hai compiler, chúng tôi biết rằng trình biên dịch mới đã có trí tuệ để tự phân xử tính đúng sai ngữ nghĩa của ngôn ngữ.
Bình luận (0)
Đang tải bình luận...