Ủy ban tiêu chuẩn C++ đã chính thức quyết định từ bỏ đề xuất Safe C++ đầy tham vọng để ủng hộ một cách tiếp cận bảo thủ hơn có tên Profiles. Quyết định này đã châm ngòi cho những cuộc thảo luận sôi nổi trong cộng đồng lập trình về tương lai của tính an toàn bộ nhớ trong một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất thế giới.
Đề xuất Safe C++, được giới thiệu một năm trước, nhằm mang lại những đảm bảo an toàn giống như Rust cho C++ thông qua một hệ thống ngữ cảnh an toàn tùy chọn. Đề xuất này hứa hẹn tính an toàn bộ nhớ mạnh mẽ, an toàn kiểu dữ liệu và an toàn luồng mà không phá vỡ mã nguồn hiện có. Các nhà phát triển có thể đánh dấu những phần cụ thể trong mã của họ là an toàn trong khi để lại những phần cũ không thay đổi, tạo ra một con đường di chuyển dần dần hướng tới các thực hành lập trình an toàn hơn.
So sánh Safe C++ và Profiles
Khía cạnh | Đề xuất Safe C++ | Phương pháp Profiles |
---|---|---|
Mức độ An toàn | Đảm bảo tương đương Rust | Hạn chế, kiểm tra giống linter |
Triển khai | Cú pháp và cấu trúc ngôn ngữ mới | Hạn chế trên các tính năng hiện có |
Lộ trình Di chuyển | Tự chọn các ngữ cảnh an toàn | Ràng buộc tại thời điểm biên dịch |
Khả năng Tương thích Ngược | Tương thích hoàn toàn với mã hiện có | Tương thích hoàn toàn với mã hiện có |
Trạng thái Ủy ban | Đã bỏ | Đang được theo đuổi tích cực |
Độ phức tạp Kỹ thuật | Cao (borrow checker, lifetimes) | Trung bình (dựa trên ràng buộc) |
Ủy ban ưu tiên tương thích ngược hơn thay đổi cách mạng
Sean Baxter, một trong những tác giả gốc của Safe C++, xác nhận rằng nhóm làm việc về An toàn và Bảo mật đã bỏ phiếu ưu tiên Profiles hơn đề xuất đầy tham vọng kia. Sự kháng cự của ủy ban trong việc áp dụng các cơ chế an toàn kiểu Rust phản ánh những căng thẳng văn hóa sâu sắc hơn trong cộng đồng C++. Nhiều thành viên ủy ban xem mô hình an toàn của Rust như một sự khởi hành quá cấp tiến khỏi triết lý truyền thống của C++.
Profiles đại diện cho một cách tiếp cận hoàn toàn khác về an toàn. Thay vì giới thiệu các cấu trúc ngôn ngữ mới như Safe C++ đề xuất, Profiles hoạt động bằng cách hạn chế các tính năng và mẫu sử dụng C++ hiện có. Hãy nghĩ về chúng như những hướng dẫn mã hóa được compiler thực thi có thể bắt được những lỗi thông thường mà không yêu cầu các nhà phát triển học cú pháp hoặc khái niệm hoàn toàn mới.
Những hạn chế kỹ thuật gây ra sự hoài nghi
Khả năng kỹ thuật của Profiles đã thu hút sự chỉ trích gay gắt từ những người ủng hộ an toàn. Không giống như Safe C++ hay bộ kiểm tra borrow của Rust, Profiles không thể cung cấp cùng mức độ đảm bảo toán học về tính an toàn bộ nhớ. Hệ thống này về cơ bản hoạt động như một linter nâng cao hơn là một cơ chế an toàn cơ bản.
Công nghệ profiles không tốt lắm. Nhưng điều đó không đáng kể so với vấn đề văn hóa, một khi bạn quyết định làm bản nhạc kèn túi mười lăm phút thành single chính của mình thì việc bạn có sử dụng đĩa vinyl màu hay không cũng không quan trọng.
Các nhà phê bình lập luận rằng Profiles đối mặt với những thách thức không thể vượt qua khi xử lý mã C++ thực tế. Các kiểu tham chiếu không sở hữu, thiết yếu cho hiệu suất trong nhiều ứng dụng, không thể được quản lý an toàn mà không có các tính năng ngôn ngữ tinh vi hơn như theo dõi thời gian sống. Ngay khi các nhà phát triển cần sử dụng các mẫu thông thường như string_view, các đảm bảo an toàn bắt đầu sụp đổ.
Những Hạn Chế Kỹ Thuật Chính của Profiles
- Không thể xử lý các kiểu tham chiếu không sở hữu một cách an toàn
- Không có khả năng theo dõi vòng đời
- Bị giới hạn ở các ràng buộc thời gian biên dịch trên các tính năng hiện có
- Gặp khó khăn với các mẫu phổ biến như
string_view
- Cung cấp các đảm bảo yếu hơn so với các hệ thống chứng minh toán học
- Hoạt động giống như một trình phân tích tĩnh nâng cao hơn là một hệ thống an toàn
Cộng đồng chia rẽ về con đường phía trước
Quyết định này đã phơi bày một sự chia rẽ cơ bản trong cộng đồng C++. Những người đam mê C++ lâu năm phục vụ trong các ủy ban tiêu chuẩn có xu hướng chống lại những thay đổi mạnh mẽ có thể làm xa lánh người dùng hiện tại. Trong khi đó, các nhà phát triển làm việc trên các ứng dụng quan trọng về bảo mật ngày càng thấy mình buộc phải xem xét các lựa chọn thay thế như Rust.
Một số thành viên cộng đồng đề xuất theo mô hình HTML5, nơi các nhà cung cấp trình duyệt về cơ bản đã bỏ qua cơ quan tiêu chuẩn W3C chính thức để tạo ra WHATWG. Tuy nhiên, không giống như các trình duyệt web nơi một vài công ty lớn kiểm soát việc triển khai, các compiler C++ được phát triển bởi các nhóm đa dạng với các ưu tiên và tài nguyên khác nhau.
Thời điểm của quyết định này tạo ra áp lực bổ sung. Với các quy trình ủy ban mất nhiều năm hoặc thậm chí nhiều thập kỷ, bất kỳ tính năng an toàn nào không được tiêu chuẩn hóa sớm có thể đến quá muộn để ngăn chặn sự xói mòn thêm vị thế của C++ trong lập trình hệ thống. Các ngôn ngữ như Rust và thậm chí các lựa chọn thay thế mới hơn như Zig tiếp tục giành được chỗ đứng trong các lĩnh vực truyền thống được C++ thống trị.
Nhìn về phía trước: Tiến bộ từng bước hay cơ hội bị bỏ lỡ?
Trong khi Profiles có thể mang lại một số cải thiện so với tình hình hiện tại, nhiều nhà phát triển đặt câu hỏi liệu các biện pháp an toàn từng bước có thể giải quyết những thách thức cơ bản mà C++ đang đối mặt hay không. Cách tiếp cận này có thể giúp bắt được một số lỗi thông thường nhưng không đạt được việc cung cấp các đảm bảo an toàn toàn diện mà phát triển phần mềm hiện đại ngày càng đòi hỏi.
Quyết định của ủy ban phản ánh một căng thẳng rộng lớn hơn giữa việc bảo tồn cơ sở mã nguồn khổng lồ hiện có của C++ và thích ứng với các yêu cầu an toàn đương đại. Liệu cách tiếp cận bảo thủ này có đủ để duy trì sự liên quan của C++ trong bối cảnh lập trình ngày càng quan tâm đến an toàn hay không vẫn là một câu hỏi mở.
Hiện tại, các nhà phát triển tìm kiếm đảm bảo an toàn mạnh mẽ có thể cần nhìn ra ngoài các tiêu chuẩn C++ chính thức để tìm các công cụ thử nghiệm, triển khai thay thế, hoặc các ngôn ngữ hoàn toàn khác. Việc từ bỏ đề xuất Safe C++ đánh dấu không chỉ một quyết định kỹ thuật, mà là một lựa chọn triết học về hướng đi tương lai của ngôn ngữ.
Tham khảo: Safe C++ proposal is not being continued