Tập 55: IR subset

Khi checker đã xanh, chúng tôi bước vào giai đoạn sinh mã trung gian: hạ đường AST đã được kiểm tra kiểu xuống DUY IR. Sprint 85 chịu trách nhiệm cho mắt xích quan trọng này.

Mục tiêu là compiler/ir_subset.duy phải tạo ra các block IR và instruction khớp chính xác với định dạng text dump của JS compiler.

IR của subset rất phẳng: không có đối tượng phức tạp, mọi thứ được chuyển đổi thành các phép gán tạm thời (SSA registers) và các lệnh nhảy có điều kiện (jump_if). Việc viết module này bằng DUY buộc tôi phải suy nghĩ kỹ về cách tối ưu hóa bộ nhớ: làm sao cấp phát hàng nghìn câu lệnh IR mà không tạo ra áp lực rác lớn lên hệ thống runtime. Vì trong subset chưa có garbage collector hay lifetime checker hoàn chỉnh, tôi phải quản lý thủ công bộ nhớ của từng node IR bằng cách sử dụng các chỉ số mảng phẳng làm con trỏ giả lập.

Chúng tôi sử dụng mô hình mảng phẳng để biểu diễn IR. Công cụ duy ir-compare chạy so khớp trên 5 chương trình mẫu. Mỗi khi có sự khác biệt về số thứ tự register hoặc tên nhãn nhảy, digest sẽ báo đỏ.

Đêm tôi hoàn thành code phát sinh IR, khi chạy thử lệnh so sánh và thấy 5 file mẫu đều cho ra kết quả băm trùng khớp tuyệt đối, tôi biết rằng luồng logic phức tạp nhất của compiler đã được port sang DUY thành công. Con đường đi xuống mã máy chỉ còn cách một bước nữa.


Bình luận (0)

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