Tập 67: Bootstrap phải tái lập được

Khi tự trị chạy được trên máy của tôi (macOS), tôi có một cảm giác rất vui vẻ. Nhưng khi mang sắp code đó lên máy của một contributor khác chạy Linux, mọi thứ đổ vỡ. SHA256 hashes của Stage 1 và Stage 2 bị lệch nhau. Chuỗi fixed-point bootstrap bị đứt gãy.

Sprint 113 đặt ra nhiệm vụ: Bootstrap phải hoàn toàn tái lập được (reproducible bootstrap) đa nền tảng.

Sự lệch hash giữa các hệ điều hành thường đến từ những chi tiết rất nhỏ và ẩn: - Thứ tự duyệt của các file trong thư mục của Node.js (hệ thống file macOS trả về thứ tự khác Linux). - Cách định dạng dòng (line ending) và mã hóa ký tự của host platform. - Việc sử dụng các biến toàn cục mutable trong compiler dẫn đến trạng thái phân giải symbol bị trôi tùy thuộc vào thứ tự file biên dịch.

Chúng tôi loại bỏ hoàn toàn global mutable state trong compiler driver và chuẩn hóa thứ tự sort file trong resolver. Mỗi file nguồn đi vào compiler phải được định danh bằng một hash tĩnh và được sắp xếp theo bảng chữ cái trước khi xử lý.

Tôi nhớ đêm tôi cấu hình thành công reproducible CI. Khi chạy fixed-point ceremony trên cả Darwin arm64 (macOS) và Linux CI và thấy mã hash SHA256 của Stage 1/2 nhị phân trùng khớp nhau tuyệt đối trên hai hệ điều hành, tôi biết rằng DUY đã vượt qua bài kiểm tra portability đầu tiên. Trình biên dịch đã học được cách hành xử nhất quán, không phụ thuộc vào sự đỏ đỏm của host platform.


Bình luận (0)

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