Ngôn ngữ lập trình C đang tiến gần hơn đến việc có được một tính năng quản lý tài nguyên được mong đợi từ lâu. Tiêu chuẩn C2y sắp tới dự kiến sẽ bao gồm chức năng defer
gốc, với một số triển khai trình biên dịch đã đang trong quá trình phát triển hoặc xem xét.
Tiến độ chuẩn hóa chính thức
Tính năng defer cho C2y xuất phát từ đặc tả kỹ thuật TS25755, được phát triển từ các đề xuất trước đó bao gồm N3434. Phiên bản sửa đổi gần đây nhất, được ghi lại là N3687, phác thảo cách defer sẽ hoạt động như một tính năng ngôn ngữ tiêu chuẩn thay vì một phần mở rộng dành riêng cho trình biên dịch. Điều này đại diện cho một bước tiến đáng kể cho khả năng quản lý tài nguyên của C.
Không giống như các triển khai thử nghiệm dựa trên macro dựa vào các tính năng đặc thù của GCC, phiên bản được chuẩn hóa sẽ cung cấp chức năng defer có thể di chuyển trên các trình biên dịch khác nhau. Tính năng này được thiết kế để thực thi mã dọn dẹp tự động khi các biến ra khỏi phạm vi, tương tự như những gì các ngôn ngữ như Go cung cấp.
Thông số kỹ thuật chính:
- Tiêu chuẩn: C2y với đặc tả kỹ thuật TS25755
- Phiên bản mới nhất: N3687 (cập nhật từ N3488)
- Phạm vi: Dọn dẹp phạm vi từ vựng (chạy ở cuối khối)
- Bảo mật: Tránh các vấn đề về ngăn xếp thực thi của các triển khai macro hiện tại
Trạng thái triển khai trình biên dịch
Nhiều dự án trình biên dịch đã bắt đầu triển khai tính năng defer trước khi chuẩn hóa chính thức. GCC có các bản vá đang được xem xét, trong khi các trình biên dịch thay thế như onramp và slimcc đã thêm hỗ trợ. Việc áp dụng sớm này cho thấy sự quan tâm mạnh mẽ của ngành công nghiệp đối với tính năng này.
Các triển khai trình biên dịch đang sử dụng một cách tiếp cận trực tiếp hơn so với các giải pháp thay thế dựa trên macro hiện tại. Thay vì dựa vào các hàm lồng nhau và thuộc tính dọn dẹp, hỗ trợ defer gốc có thể tối ưu hóa tính năng này hiệu quả hơn trong khi duy trì khả năng hiển thị rõ ràng trong các bản build debug.
Tình trạng triển khai trình biên dịch hiện tại:
- GCC: Các bản vá đang được xem xét (patchwork.ozlabs.org/project/gcc/list/?series=470822)
- onramp: Đã triển khai (github.com/ludocode/onramp)
- slimcc: Đã triển khai (github.com/fuhsnn/slimcc)
Cân nhắc về bảo mật và hiệu suất
Các triển khai thử nghiệm hiện tại sử dụng các hàm lồng nhau của GCC làm tăng mối lo ngại về bảo mật do chúng dựa vào các trampoline stack có thể thực thi. Tuy nhiên, cách tiếp cận always-inline được sử dụng trong các triển khai macro gần đây tránh hoàn toàn vấn đề này bằng cách loại bỏ nhu cầu gọi hàm.
Từ khóa always_inline đảm nhiệm việc đó ở đây.
Tính năng defer được chuẩn hóa dự kiến sẽ giải quyết những mối lo ngại về bảo mật này trong khi cung cấp hiệu suất tốt hơn so với các giải pháp thay thế dựa trên macro. Các trình biên dịch sẽ có thể triển khai defer như một tính năng ngôn ngữ hạng nhất, cho phép các tối ưu hóa không thể thực hiện được với các giải pháp thay thế hiện tại.
Tác động rộng hơn đến phát triển C
Việc bổ sung defer vào C2y giải quyết một thách thức lâu dài trong lập trình C: dọn dẹp tài nguyên đáng tin cậy qua nhiều điểm thoát. Trong khi một số nhà phát triển đã chuyển sang quản lý bộ nhớ dựa trên arena để tránh các vấn đề dọn dẹp, defer vẫn có giá trị để quản lý các bộ mô tả tệp, mutex và các tài nguyên không phải bộ nhớ khác.
Tính năng này cũng cung cấp một giải pháp thay thế cho các giải pháp phức tạp hơn như cải tiến RAII vào C, điều này sẽ yêu cầu những thay đổi đáng kể đối với hệ thống kiểu và ngữ nghĩa của ngôn ngữ. Defer cung cấp một cách tiếp cận nhẹ hơn phù hợp hơn với triết lý thiết kế hiện có của C.
Việc chuẩn hóa defer trong C2y đại diện cho một sự phát triển thực dụng của ngôn ngữ, bổ sung các tính năng tiện lợi hiện đại trong khi duy trì các đặc điểm cốt lõi của C. Khi hỗ trợ trình biên dịch mở rộng, các nhà phát triển sẽ có quyền truy cập vào quản lý tài nguyên đáng tin cậy hơn mà không hy sinh tính di động và đơn giản khiến C có giá trị trong lập trình hệ thống.
Tham khảo: Defer: Resource cleanup in C with GCCs magic