Hacktical C: Hướng dẫn thực tế gây tranh cãi về vai trò của C trong lập trình hiện đại

BigGo Editorial Team
Hacktical C: Hướng dẫn thực tế gây tranh cãi về vai trò của C trong lập trình hiện đại

Trong thời đại mà các ngôn ngữ an toàn bộ nhớ và trừu tượng cấp cao chiếm ưu thế, một cuốn sách mã nguồn mở mới có tên Hacktical C đã xuất hiện, định vị mình như một hướng dẫn thực tế dành cho các hacker về ngôn ngữ lập trình C. Được phát hành dưới giấy phép mở, cuốn sách đã làm dấy lên những cuộc thảo luận sôi nổi trong cộng đồng lập trình về tính phù hợp, an toàn và vị trí của C trong hệ sinh thái lập trình hiện đại.

C như Assembly di động - Huyền thoại hay thực tế?

Một trong những điểm gây tranh cãi nhất trong cuộc thảo luận cộng đồng xoay quanh tuyên bố của tác giả rằng C đứng ở một vị trí riêng biệt như một ngôn ngữ assembly phần lớn có tính di động. Đặc điểm này đã gặp phải sự phản đối đáng kể từ các nhà phát triển, họ cho rằng C còn xa mới được coi là ngôn ngữ thực sự cấp thấp theo tiêu chuẩn hiện đại.

Khi máy tính của bạn là PDP-11, nếu không thì nó chỉ là một ngôn ngữ hệ thống cấp cao như bao ngôn ngữ khác.

Nhiều người bình luận chỉ ra rằng C thực sự tạo ra một máy ảo không ánh xạ trực tiếp đến khả năng của phần cứng hiện đại. Khi viết mã C, các nhà phát triển đang lập trình cho một máy ảo được mô tả bởi đặc tả C thay vì phần cứng thực tế. Sự trừu tượng này bao gồm các hành vi không tồn tại trong phần cứng vật lý, chẳng hạn như hành vi không xác định xung quanh tràn số có dấu và theo dõi khởi tạo bộ nhớ. Hơn nữa, các nhà phê bình lưu ý rằng C thiếu hỗ trợ tự nhiên cho nhiều tính năng phần cứng đã trở thành tiêu chuẩn trong vài thập kỷ qua, bao gồm thao tác bit thích hợp cho các giá trị dưới byte và các hoạt động SIMD đơn giản.

Tranh luận về an toàn bộ nhớ và tự do đi kèm trách nhiệm

Quan điểm của tác giả rằng C không cố gắng quá nhiều để ngăn bạn mắc lỗi và mang lại tự do đi kèm trách nhiệm đã kích hoạt cuộc thảo luận đáng kể về những tác động thực tế của triết lý này. Mặc dù một số người bình luận đánh giá cao cách tiếp cận này, nhiều người thách thức quan điểm cho rằng các ngôn ngữ không an toàn bộ nhớ là một lựa chọn khả thi cho phát triển phần mềm hiện đại.

Các nhà phê bình lập luận rằng các vấn đề về an toàn bộ nhớ không đơn thuần là vấn đề kỹ năng của lập trình viên mà đại diện cho các lỗ hổng hệ thống tiếp tục tạo ra các lỗ hổng bảo mật bất kể chuyên môn của nhà phát triển. Họ chỉ ra rằng không có kỹ năng lập trình cá nhân nào có thể làm giảm đáng kể tỷ lệ CVE gây ra bởi lỗi an toàn bộ nhớ trong các chương trình C. Cuộc tranh luận mở rộng đến việc liệu tính linh hoạt do C cung cấp có đáng với chi phí bảo mật và bảo trì hay không, đặc biệt khi các ngôn ngữ hiện đại với các cơ chế thoát không an toàn (như Rust) có thể cung cấp cả an toàn và hiệu suất.

Kỹ thuật C thực tế: Thủ thuật thông minh hay mô hình nguy hiểm?

Bản thân cuốn sách trình bày nhiều kỹ thuật lập trình C, một số trong đó đã tạo ra cả sự ngưỡng mộ lẫn lo ngại. Một ví dụ thu hút sự chú ý đặc biệt là việc triển khai coroutine sử dụng macro __LINE__ theo cách sáng tạo:

Các Chủ Đề Chính trong Hacktical C

* Macro
* Số Học Điểm Cố Định
* Danh Sách Liên Kết Đôi Xâm Nhập
* Tác Vụ Đồng Thời Nhẹ
* Bộ Cấp Phát Bộ Nhớ Có Thể Kết Hợp
* Vector
* Ngoại Lệ
* Tập Hợp và Bản Đồ Có Thứ Tự
* Biên Dịch Động
* Luồng Mở Rộng
* Nhật Ký Có Cấu Trúc

Hỗ Trợ Ngôn Ngữ C Theo Trình Biên Dịch

| Trình biên dịch | C17 | C11 | VLAs | C23 |
|-----------------|-----|-----|------|-----|
| GCC             | Có  | Có  | Có   | Có (mặc định) |
| Clang           | Có  | Có  | Có   | Một phần |
| MSVC            | Có (từ 2020) | Có | Không (không có kế hoạch) | Lộ trình không rõ ràng |

#define hc_task_yield(task)   
  do {     
    task->state = __LINE__;   
    return;     
    case __LINE__:;           
  } while (0)

Trong khi một số người bình luận thấy kỹ thuật này vừa quỷ quyệt vừa thông minh, những người khác chỉ ra các cách triển khai thay thế và thảo luận về ưu điểm của việc sử dụng phần mở rộng GNU so với C tiêu chuẩn. Điều này nhấn mạnh trọng tâm của cuốn sách về các phương pháp thực tế, đôi khi không quy ước để giải quyết vấn đề trong C.

Mối quan hệ của Microsoft với C

Tuyên bố của cuốn sách rằng Microsoft đã không may mắn chọn bỏ qua C trong một thời gian dài, các trình biên dịch của họ kém xa so với phần còn lại đã dẫn đến cuộc thảo luận về tình trạng hiện tại của hỗ trợ C của Microsoft. Người bình luận làm rõ rằng mặc dù Microsoft đã ưu tiên C++ hơn C trong lịch sử, nhưng đã có những cải tiến trong những năm gần đây. Vào năm 2020, Microsoft đã thêm hỗ trợ cho các tiêu chuẩn C11 và C17, mặc dù một số tính năng như Variable Length Arrays (VLAs) vẫn không được hỗ trợ và không có kế hoạch triển khai. Cộng đồng vẫn không chắc chắn về lộ trình của Microsoft cho hỗ trợ C23, đặc biệt là khi công ty ngày càng tập trung vào các ngôn ngữ an toàn bộ nhớ như một phần trong các sáng kiến bảo mật của mình.

Trong bối cảnh ngày càng bị chi phối bởi các cuộc thảo luận về an toàn bộ nhớ và các tính năng ngôn ngữ hiện đại, Hacktical C vừa là một nguồn tài nguyên thực tế cho các lập trình viên C vừa là một tuyên bố triết học về lựa chọn ngôn ngữ lập trình. Dù được xem là một bộ sưu tập các kỹ thuật có giá trị hay một sự bảo vệ cho một phương pháp tiếp cận ngày càng bị tranh cãi đối với lập trình hệ thống, cuốn sách chắc chắn đã thành công trong việc tạo ra cuộc thảo luận sâu sắc về vị trí của C trong thế giới lập trình ngày nay.

Tham khảo: Hacktical C