Ngôn ngữ lập trình hệ thống không cần một kẻ phản diện mặc áo choàng đen. Nó đối mặt với những thứ đáng sợ hơn nhiều: hành vi không xác định (Undefined Behavior), chi phí ẩn bị che giấu, và hợp đồng lập trình chỉ tồn tại mơ hồ trong đầu người viết.
Con trỏ thô (raw pointer) thường bị đưa ra trước vành móng ngựa đầu tiên, nhưng bản thân nó chỉ là một công cụ truyền tin vật lý. Điều nguy hiểm thật sự là con trỏ thô không mang theo đủ câu chuyện của nó. Nó không tiết lộ dữ liệu thuộc về ai, còn sống bao lâu, có thể bị thay đổi đồng thời hay không, hay việc truy cập có nằm trong giới hạn bộ nhớ hợp lệ. Khi câu chuyện bị biến mất, trình biên dịch cũng hoàn toàn mất đi năng lực hỗ trợ con người.
Cấp phát ẩn (hidden allocation) là một kiểu mơ hồ nguy hại khác. Một dòng code trông có vẻ vô hại có thể âm thầm cấp phát bộ nhớ trên Heap, kích hoạt bộ runtime phức tạp bên dưới, giữ khóa mutex hoặc làm tăng đột biến độ trễ (latency). I/O ẩn (hidden I/O) còn khó chịu hơn: nhìn vào chữ ký hàm không cách nào biết nó chỉ thực hiện tính toán thuần túy hay đang âm thầm mở file, kết nối mạng và treo luồng để đợi thế giới bên ngoài trả lời.
Hành vi không xác định (Undefined Behavior) chính là đỉnh cao của sự đứt gãy hợp đồng an toàn. Khi chương trình bước vào vùng ấy, câu hỏi "nó sẽ làm gì tiếp theo?" không còn một câu trả lời logic nào mà lập trình viên có quyền đòi hỏi. Trình biên dịch được phép giả định điều đó không xảy ra để tối ưu hóa mã, phần cứng vẫn chạy tiếp, và người gỡ lỗi (debugger) đứng ở giữa giống như một nhà ngoại giao không có phiên dịch viên.
DUY chọn bốn kẻ thù cụ thể để tuyên chiến trong vùng mã an toàn (safe code):
- Vòng đời tham chiếu treo lơ lửng (dangling lifetimes);
- Cấp phát bộ nhớ (allocation) và I/O bị che giấu;
- Đột biến dữ liệu (mutation) hoặc vùng không an toàn (
unsafe) vượt qua ranh giới mà không khai báo; - Biểu diễn trung gian (IR) lỗi vẫn lọt xuống backend sinh mã máy.
Đây không phải là danh sách toàn bộ các vấn đề của ngành phần mềm. Nhưng nó đủ cụ thể để biến triết lý thiết kế thành các luật lệ biên dịch. Khái niệm owned, view, và region sẽ chịu trách nhiệm kể câu chuyện bộ nhớ. Hệ thống effect sẽ kể câu chuyện hành vi của hàm. Từ khóa unsafe sẽ đánh dấu rõ ràng nơi các bảo đảm bị nới lỏng. Bộ xác minh typed IR sẽ đảm bảo ngữ nghĩa không bị rơi rụng giữa frontend và machine code.
And then, một câu hỏi khó chịu khác xuất hiện: "Nếu AI đã có thể viết code rất nhanh và sửa lỗi giùm ta, tại sao ta còn cần một trình biên dịch nghiêm khắc đến thế?"
Bình luận (0)
Đang tải bình luận...