Dường như không thể tránh khỏi việc các kiểu phụ thuộc thời gian biên dịch sẽ xuất hiện trong lập trình hệ thống. C++ có templates và constexpr. Rust có const generics. Zig có comptime. Thậm chí cả C cũng có _Generic. Tuy nhiên, những tính năng này thường bị hạn chế, thiếu hệ thống kiểu đúng đắn, hoặc cả hai. Tôi đang phát triển Syl, một ngôn ngữ lập trình mãi lắm mã hóa tính toán thời gian biên dịch trong một hệ thống kiểu modal. Syl chủ yếu được lấy cảm hứng từ công trình của András Kovács về lý thuyết kiểu hai tầng, cũng như kế hoạch cho OxCaml. Trình biên dịch Syl có thể tìm thấy trên GitHub. Trong Syl, mọi giá trị đều có một chế độ đi kèm với một kiểu. Các chế độ mô tả các tính chất của giá trị độc lập với kiểu của chúng. Ví dụ, OxCaml sử dụng các chế độ để chỉ ra liệu một giá trị có được sở hữu duy nhất, có thể được ghi vào, có thể được gửi đến một luồng khác, v.v. Syl có hai trục chế độ: staticity và erasure. Trên trục staticity, một giá trị có thể là static hoặc dynamic. Trên erasure, giá trị đó có thể là erased hoặc unerased. Ví dụ, các hằng số là static unerased, vì chúng rõ ràng là có thể biết được cả ở thời gian biên dịch và thời gian chạy. Bạn có thể kiểm tra bằng cách viết một chú thích chế độ: Mỗi trục chế độ có một quan hệ phụ thuộc. Nếu bạn có một giá trị static, thì an toàn khi quên rằng nó có thể biết được ở thời gian biên dịch và do đó coi nó là dynamic. Tương tự, một giá trị unerased có thể được coi là erased. Các chú thích chế độ có thể "làm yếu" chế độ, nhưng không thể "cường mạnh" nó.
Nguồn chính
- THẢO LUẬNpolywolflobste.rs