Khi viết một chương trình bình thường, chúng ta được sống trong sự xa hoa của hệ điều hành và thư viện chuẩn (libc). Lệnh print hoạt động vì có printf của C gánh phía dưới. Bộ nhớ heap có sẵn nhờ malloc quản lý.
Nhưng nếu DUY muốn viết một hệ điều hành, hoặc chạy trên một vi điều khiển không có hệ điều hành, những thứ xa hoa ấy lập tức biến mất. Chúng tôi cần freestanding mode.
Sprint 24 giới thiệu cờ --freestanding.
duy build --freestanding source.duy
Khi cờ này được bật, compiler DUY sẽ cắt đứt mọi liên kết mặc định với libc của host. Không còn nút khởi động ngầm, không còn các hàm runtime ngoại bang. Chương trình DUY trở thành một thực thể "trần trụi" đối mặt với linker.
Điều này nghĩa là chúng tôi phải tự chịu trách nhiệm cho những thứ cơ bản nhất:
- Định nghĩa điểm vào thật sự của chương trình (thường là _start thay vì main).
- Tự viết panic hook để xử lý khi chương trình gặp lỗi nghiêm trọng mà không có hệ điều hành bắt hộ.
- Tự viết hàm print bằng cách ghi trực tiếp vào cổng nối tiếp (serial port) hoặc thông qua syscall.
Tôi nhớ cảm giác hụt hẫng khi biên dịch freestanding lần đầu. Lệnh build thất bại ngay lập tức vì linker báo thiếu hàm memcpy và memset. Thì ra, chính LLVM khi tối ưu hóa các lệnh gán struct đã tự động chèn các lời gọi đến những hàm này của thư viện C. Không có libc, tôi buộc phải tự viết các hàm memcpy và memset tối giản bằng DUY và liên kết chúng vào.
Freestanding mode là bài test đầu tiên về tính hệ thống của ngôn ngữ. Nếu một ngôn ngữ không thể biên dịch ở chế độ freestanding mà không crash vì thiếu symbol của hệ điều hành, nó chưa thể tự xưng là một systems language thật sự. DUY đã vượt qua bài test đó, dù ban đầu artifact đầu ra chỉ là một file object thô liên kết với một runtime tối giản do chính tôi tự viết từng byte.
Bình luận (0)
Đang tải bình luận...