Khi parser và checker đã xong, chúng tôi bước vào giai đoạn hạ đường AST sang representation trung gian: sinh DUY IR native. Sprint 129 chịu trách nhiệm cho mắt xích này.
Chúng tôi viết tools/ir_subset.duy (1,025 dòng) và tools/ir_verify_subset.duy (1,920 dòng).
Module ir_subset chuyển đổi typed AST thành các khối lệnh phẳng của IR. Module ir_verify_subset thực thi nhiệm vụ gác cổng: duyệt qua IR mới sinh ra và kiểm tra các bất biến cấu trúc. Chúng tôi xây dựng 5 fixtures accept và 5 fixtures reject (negative IR) để thử thách verifier.
Invalid IR -> [ ir_verify_subset ] -> Reject (IFFOLD, UNKNOWN_VAR, ...)
Mọi nỗ lực tối ưu hóa bậy bạ hoặc sinh mã sai lệch từ native AST đều bị verifier chặn đứng trước khi kịp đưa xuống backend. Tôi nhớ lúc chạy thử một pass tối ưu hóa IR do tôi tự viết, do nhầm lẫn nhãn nhảy của lệnh jump_if, pass này đã tạo ra một khối cơ bản không có lối thoát (terminal block). Verifier native đã lập tức phát hiện và in ra lỗi TERMINAL_BLOCK_MISSING, từ chối biên dịch.
Chạy ir-verify-compare đạt kết quả xanh hoàn toàn trên 10 fixtures là lời khẳng định rằng native compiler đã có khả năng tự bảo vệ mình trước những lỗi sinh mã nội bộ. Chúng tôi đã xây dựng được một hàng rào an toàn vững chắc ngay giữa lòng trình biên dịch.
Bình luận (0)
Đang tải bình luận...