Tập 84: Attributes — Bản hợp đồng tường minh của hệ thống

Attributes trong nhiều ngôn ngữ cao cấp (như Annotation trong Java hay Decorator trong TypeScript) hoạt động giống như một thứ phép thuật kỳ bí. Chúng tự động thay đổi hành vi của chương trình ở runtime bằng cơ chế reflection hoặc sinh mã động ngầm. Trong lập trình hệ thống freestanding, điều này là một thảm họa vì nó giấu đi luồng điều khiển thực tế của chương trình và đòi hỏi runtime metadata khổng lồ, làm tăng đáng kể dung lượng file thực thi.

Trong DUY, attributes chỉ là một bản hợp đồng tĩnh giữa lập trình viên và compiler. Không có reflection. Không có magic runtime.

Sprints 143-145 là chiến dịch chuẩn hóa hệ thống attributes của DUY, chia làm hai nhóm chính: 1. Systems attributes: @extern dùng để khai báo FFI gọi thư viện ngoài (không có thân hàm), @repr(C) để ép memory layout của struct tương thích với ABI của C, @inline gợi ý compiler inlining hàm để tối ưu tốc độ, và @target để kiểm soát biên dịch chéo cho các kiến trúc CPU khác nhau. 2. Tool attributes: @test để đăng ký các hàm kiểm thử tự động, @deprecated để cảnh báo mã nguồn lỗi thời, và @must_use để compiler báo lỗi nếu kết quả trả về của hàm bị bỏ qua một cách vô ý.

@extern
fn malloc(size: i32) -> *i32;

@repr(C)
struct Point {
  x: i32,
  y: i32
}

Thử thách lớn nhất là cài đặt parser để đảm bảo attributes không thể trở thành một kênh macro ẩn giúp người dùng viết code tùy tiện. Compiler kiểm tra nghiêm ngặt vị trí đặt attribute; việc gắn một attribute sai vị trí (ví dụ gắn @extern vào một biến cục bộ) sẽ ngay lập tức kích hoạt gate đỏ của parser.

Tôi nhớ lúc chạy thử code FFI gọi hàm malloc của C. Nếu thiếu attribute @repr(C) trên struct truyền vào, LLVM backend sẽ tự ý sắp xếp lại các trường theo quy tắc tối ưu riêng, làm hàm malloc đọc sai địa chỉ ô nhớ và gây crash hệ thống lập tức. Khi thêm @repr(C), compiler cam kết giữ đúng layout của C ABI. Bản hợp đồng đã được ký kết và thực thi nghiêm túc.


Bình luận (0)

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