13 điểm bởi xguru 2023-07-13 | 2 bình luận | Chia sẻ qua WhatsApp
  • Tiêu chuẩn C++ thế hệ tiếp theo sau C++20
  • Không phải là một bước ngoặt lớn như C++98, C++11 hay C++20, mà là những thay đổi nhỏ ở mức C++17

Tìm hiểu những thay đổi của tiêu chuẩn C++ (trong 40 năm)

C++98

  • Vào cuối thập niên 80, Bjarne Stroustrup và Margaret A. Ellis đã viết cuốn sách nổi tiếng Annotated C++ Reference Manual (ARM)
  • Cuốn sách này có hai mục đích
    • Vì có quá nhiều bản triển khai C++ độc lập nên ARM đã định nghĩa các tính năng của C++
    • Trở thành nền tảng của tiêu chuẩn C++ là C++98 (ISO/IEC 14882)
  • C++98 bao gồm một số tính năng quan trọng
    • Templates
    • STL(Standard Template Library): bao gồm container, thuật toán, string và IO Stream

C++03

  • Trong C++03 (14882:2003), chỉ có những chỉnh sửa kỹ thuật rất nhỏ
  • Trong cộng đồng, C++03 bao gồm cả C++98 được gọi là "C++ legacy"

TR1

  • Năm 2005 đã xảy ra một điều thú vị: TR1(Technical Report 1) được phát hành
  • TR1 là một bước tiến lớn hướng tới C++11 và cũng là bước đầu tiên đến với Modern C++
  • Dựa trên dự án Boost của các thành viên ủy ban tiêu chuẩn C++
  • Bao gồm 13 thư viện sẽ đi vào tiêu chuẩn C++ thế hệ tiếp theo (biểu thức chính quy, số ngẫu nhiên, smart pointer như std::shard_ptr, hash table, v.v.)

C++11

  • Đây là tiêu chuẩn C++ tiếp theo, nhưng chúng ta gọi nó là Modern C++. Tên gọi này cũng bao gồm C++14 và C++17
  • C++11 đã thay đổi hoàn toàn cách chúng ta phát triển bằng C++
    • Không chỉ mang các thành phần của TR1 mà còn đưa vào move semantics, perfect forwarding, variadic templates, constexpr, v.v.
    • Bao gồm mô hình bộ nhớ dựa trên luồng và Threading API

C++14

  • Một tiêu chuẩn C++ nhỏ. Giới thiệu read-writer locks, lambdas được tổng quát hóa và hàm constexpr

C++17

  • Không quá lớn cũng không quá nhỏ
  • Bao gồm 2 tính năng nổi bật: Parallel STL và filesystem được chuẩn hóa
    • Khoảng 80 thuật toán STL có thể được thực thi thông qua execution policy (song song, tuần tự, vector)
  • Chịu ảnh hưởng nhiều từ Boost. Bao gồm filesystem và 3 kiểu dữ liệu (std::optional, std::variant, std::any)

C++20

  • Cũng giống như C++11, C++20 đã thay đổi cách chúng ta lập trình C++
  • Đặc biệt là 4 điểm lớn
    • Ranges: với thư viện Ranges, có thể biểu đạt thuật toán trực tiếp trên container và kết hợp thuật toán bằng ký hiệu pipe để áp dụng lên các luồng dữ liệu vô hạn
    • Coroutines: giúp lập trình bất đồng bộ trong C++ trở thành xu hướng chính. Đây là nền tảng cho cooperative task, event loop, luồng dữ liệu vô hạn và pipeline
    • Concepts: thay đổi cách suy nghĩ và lập trình với template. Cho phép đặt ràng buộc lên tham số template hoặc kiểm tra kiểu, và có thể xác minh ngay tại thời điểm biên dịch
    • Modules: giúp vượt qua những giới hạn của header file. Hứa hẹn nhiều điều, ví dụ không còn cần preprocessor, từ đó cuối cùng có thể rút ngắn thời gian build và giúp build package dễ hơn

C++23

  • Tính đến tháng 7 năm 2023, C++23 đang chờ vòng bỏ phiếu cuối cùng
  • Bổ sung "Deducing this", một tính năng nhỏ nhưng có ảnh hưởng rất lớn đến chính ngôn ngữ
    • Tương tự Python, con trỏ this được truyền ngầm vào member function có thể được biểu thị một cách tường minh
    • Nhờ đó, việc triển khai các kỹ thuật phức tạp như CRTP(Curiously Recurring Template Pattern) hoặc mẫu Overload trở nên đơn giản hơn
  • Thư viện C++23 cũng có những bổ sung quan trọng
    • Có thể import trực tiếp standard library bằng import std;, hoặc áp dụng format string của C++20 trong std:printstd:println
    • std::flat_map, một lựa chọn thay thế std::map tốt hơn về hiệu năng
    • Giao diện std::optional được mở rộng thành giao diện monadic để tăng composability
    • Kiểu dữ liệu mới std::expected
    • std::mdspan, span đa chiều
    • std::generator, coroutine để tạo luồng các con số

2 bình luận

 
carnoxen 2023-07-13

Có vẻ vẫn chưa có tin gì về tiêu chuẩn networking nhỉ

 
penza1 2023-07-20

Ngay cả ở tiêu chuẩn tiếp theo thì có lẽ vẫn sẽ không chắc chắn đâu;;