The New C Standard - nói dối e blog

The New C Standard

Tiêu chuẩn C mới

Cuốn sách “Tiêu chuẩn C mới”
Vào cuối tuần, tôi bắt đầu đọc một cuốn sách thú vị mang tên “The New C Standard”. Dù chưa được xuất bản chính thức, bản điện tử của nó đã có thể tải về miễn phí. Những cuốn sách viết bởi các chuyên gia hàng đầu trong ngành máy tính thường có hai dạng đối lập: một là những bộ sách đồ sộ như “The Art of Computer Programming” của Donald Knuth, dày hàng nghìn trang và vẫn đang tiếp tục cập nhật; hai là những cuốn sách gọn nhẹ như “The C Programming Language” của Kernighan & Ritchie, chỉ cần nằm trên giường cũng có thể đọc xong chỉ trong một buổi.

Ban đầu, tôi chưa từng nghĩ rằng một cuốn sách về ngôn ngữ C lại có thể dày đến mức trở thành một khối nặng trịch. Với độ dày hơn 1600 trang, nếu in hai mặt trên giấy 80g, nó sẽ có độ dày đến 9.2cm (theo lời tác giả). Tuy nhiên, khi đọc phụ đề “An Economic and Cultural Commentary”, tôi phần nào hiểu ra ý đồ của tác giả. Hóa ra cuốn sách không chỉ bàn về kỹ thuật thuần túy mà còn nâng tầm vấn đề lên khía cạnh kinh tế và văn hóa. Người dám sử dụng thuật ngữ này hẳn phải là bậc cao nhân.

Tôi đọc say sưa đến mức không ngờ đã đến 5 giờ sáng hôm sau, nhưng phần Giới thiệu (Introduction) vẫn chưa vượt qua được quá nửa :( , nghĩa là 100 trang đầu tiên thậm chí chưa bắt đầu phân tích chi tiết về ngôn ngữ C. Phiên bản gốc bằng tiếng Anh khiến tôi gặp nhiều khó khăn do tốc độ đọc bị hạn chế, hàng loạt từ vựng mới và câu văn dài khó hiểu buộc tôi phải tra từ điển liên tục. Dù vậy, tôi vẫn cố gắng đọc tiếp – đó hẳn là một cuốn sách hay và hấp dẫn.

Tóm gọn lại, đây là cuốn sách phân tích sâu rộng mọi khía cạnh liên quan đến tiêu chuẩn C và các vấn đề xoay quanh. Với từng điểm cụ thể, tác giả trình bày theo nhiều góc độ: so sánh với C++ và các ngôn ngữ khác, mô tả phương pháp triển khai phổ biến, đưa ra nhận định chuyên gia và cung cấp các nguyên tắc lập trình cơ bản (Coding Guidelines).

Trong phần giới thiệu, có đoạn thảo luận thú vị về mối quan hệ giữa C và C++:

C++
Nhiều lập trình viên coi C++ là một tập hợp con của C và kỳ vọng có thể di chuyển mã nguồn C sang môi trường C++ một cách dễ dàng. Dù cuốn sách này không muốn đi sâu vào tranh luận về những thay đổi lớn trong tiêu chuẩn C nhằm tối ưu hóa cho C++, nó vẫn nỗ lực bác bỏ quan niệm sai lầm rằng C là một tập hợp con của C++. Hai ngôn ngữ này tồn tại trên cơ sở ngang bằng, nhưng những chương phân tích đặc biệt chú trọng đến các vấn đề cần lưu ý khi sử dụng bộ dịch (translator) của C++ để xử lý mã C.

Khi so sánh tiêu chuẩn C++ ISO/IEC 14882:1998(E) với các khái niệm trong C99, có năm trường hợp chính được đề cập:

  1. Diễn đạt giống hệt nhau – Không cần bình luận gì thêm.
  2. Diễn đạt gần giống – Chỉ khác biệt nhỏ về ngữ pháp hoặc thuật ngữ, thường được chỉ ra cụ thể.
  3. Diễn đạt khác biệt nhưng ý nghĩa tương đồng – Dù cấu trúc câu hoàn toàn khác, ý nghĩa vẫn không thay đổi. Nếu không đặt mình vào góc nhìn của C++, khó có thể nhận ra sự khác biệt này từ góc độ C.
  4. Diễn đạt và ý nghĩa đều khác biệt – Trong trường hợp này, tác giả trích dẫn phiên bản C++ và phân tích kỹ điểm khác biệt.
  5. C++ không có tương đương với một điều khoản trong C99 – Tình huống này thường xuyên xảy ra vì một số tính năng của C99 không tồn tại trong C++.

Cuốn sách áp dụng một phong cách chú thích mã nguồn đặc biệt, kết hợp linh hoạt giữa cú pháp /* kiểu C */ và // kiểu C++. C++ ban đầu có tên gọi “C with Classes” (C với các lớp). Trong giai đoạn phát triển đầu tiên, C++ tồn tại trong môi trường có đông đảo chuyên gia C và lượng mã nguồn C đồ sộ. Một số cải tiến do Bjarne Stroustrup đề xướng từng bị phản đối dữ dội từ cộng đồng người dùng vì vi phạm tính tương thích với C [1310].

Mối quan hệ phức tạp giữa C và C++ thể hiện rõ qua nhận thức của lập trình viên, qua việc các nhà cung cấp phần mềm chỉ cung cấp một bộ dịch duy nhất với tùy chọn chuyển đổi ngôn ngữ, và qua việc xây dựng chương trình bằng các mô-đun được dịch từ cả hai ngôn ngữ. Điều này cho thấy sự cần thiết phải làm rõ mọi điểm khác biệt giữa chúng.

Tại cuộc họp WG14 của ISO vào tháng 4/1989, hai câu hỏi được đặt ra:

  1. Có nên chuẩn hóa ngôn ngữ C++ không?
  2. Ủy ban WG14 có phải là tổ chức phù hợp để thực hiện việc này?

Quyết định về câu hỏi thứ nhất rất sít sao – một số ý kiến cho rằng C++ chưa đủ trưởng thành để chuẩn hóa, trong khi số khác cho rằng việc chuẩn hóa sẽ giúp ổn định ngôn ngữ và hỗ trợ các ứng dụng quan trọng. Cuối cùng, việc xây dựng tiêu chuẩn C++ được giao cho một ủy ban riêng biệt (WG21), và đến tháng 4/1991, ủy ban tiêu chuẩn C++ ISO ra đời, với phiên họp đầu tiên diễn ra hai tháng sau đó.

Các ngôn ngữ lập trình khác
Tại sao cuốn sách lại đề cập đến các ngôn ngữ khác? Vì không ai muốn dành cả sự nghiệp chỉ với một ngôn ngữ lập trình duy nhất (dù một số lập trình viên Fortran hoặc COBOL có thể làm như vậy). C không phải là ngôn ngữ duy nhất trên thế giới, và việc so sánh với các ngôn ngữ khác giúp người đọc hiểu sâu hơn về triết lý thiết kế và đặc trưng của C.

Chẳng hạn, các hàm trong C ảnh hưởng trực tiếp đến cách viết thuật toán – trong C bạn buộc phải làm theo một cách nhất định, nhưng cùng một bài toán có thể được giải quyết theo nhiều cách khác nhau trên các ngôn ngữ khác, với hiệu năng chạy chương trình khác biệt [1119]. Đối với lập trình viên, việc nhận ra tác động từ đặc điểm riêng của C lên mã nguồn không hề dễ dàng – giống như việc yêu cầu một con cá mô tả cảm giác khi ở trên cạn và dưới nước.

Về văn hóa lập trình
Mỗi ngôn ngữ lập

0%