Nói C lỗi thời là một lời phê bình quá dễ dàng. Hiểu vì sao C vẫn sống khỏe qua hơn nửa thế kỷ mới là phần khó của một kỹ sư hệ thống.
Assembly cho con người quyền điều khiển phần cứng tuyệt đối, đồng thời bắt họ tự trả tiền cho từng thanh ghi, từng địa chỉ và từng sự khác biệt của kiến trúc máy. C xuất hiện như một thỏa hiệp phi thường: đủ gần phần cứng để viết hệ điều hành, nhưng đủ trừu tượng để cùng một ý tưởng có thể biên dịch chạy trên nhiều loại máy khác nhau.
Con trỏ (pointer) không phải một sai lầm ngớ ngẩn của Dennis Ritchie. Nó là chiếc chìa khóa vạn năng trong thời đại bộ nhớ tính bằng kilobyte, trình biên dịch còn non trẻ và chi phí trừu tượng hóa phải được tính toán bằng kính lúp. Hành vi không xác định (Undefined Behavior) cũng không sinh ra để hành hạ thế hệ sau; nó cung cấp cho trình biên dịch khoảng tự do tối ưu tối đa trong một thế giới mà hiệu năng là điều kiện sống còn.
Vấn đề là chiếc chìa khóa vạn năng đó mở được cả cửa nhà lẫn cửa chuồng cọp. C không hề biết con trỏ nào đang sở hữu dữ liệu, con trỏ nào chỉ mượn tạm, vùng nhớ nào đã hết hạn, hay một phép cộng địa chỉ vừa vô tình bước ra ngoài ranh giới hợp lệ. Nó tin tưởng lập trình viên tuyệt đối. Lập trình viên lại thường phải sửa lỗi lúc hai giờ sáng, nên đây rõ ràng là một mô hình an ninh có phần quá lạc quan.
Món nợ lịch sử không nằm ở việc C tồn tại. Nó nằm ở chỗ rất nhiều tầng phần mềm hiện đại vẫn đang phải giả vờ rằng ý nghĩa của bộ nhớ chỉ là một con số địa chỉ thô sơ. Trong khi đó, ý định thực tế của chúng ta giàu thông tin hơn thế nhiều: đây là dữ liệu độc quyền, kia là một góc nhìn tạm thời, vùng này sẽ được giải phóng cùng một phiên xử lý, và lời gọi nọ bắt buộc phải chạm vào thiết bị ngoại vi.
DUY không được xây trên thái độ coi thường C. Một ngôn ngữ muốn làm lập trình hệ thống mà không học từ C cũng giống như một kiến trúc sư không muốn học về trọng lực vì thấy nó quá cổ hủ. Bài học đúng đắn là: hãy giữ lại quyền kiểm soát phần cứng sát sườn của C, đồng thời đưa thêm ý nghĩa ngữ nghĩa vào chương trình để trình biên dịch có thể giữ luật cùng con người.
Từ đó, câu hỏi thay đổi: "Nếu hôm nay được đặt lại hợp đồng giữa lập trình viên và máy tính, ta sẽ ghi thêm những điều khoản nào?"
Bình luận (0)
Đang tải bình luận...