- มาตรฐาน C++ ยุคถัดไปที่สืบต่อจาก C++20
- ไม่ได้เป็นตัวพลิกเกมแบบ C++98, C++11 หรือ C++20 แต่เป็นการเปลี่ยนแปลงเล็ก ๆ ระดับเดียวกับ C++17
มาดูการเปลี่ยนแปลงของมาตรฐาน C++ (ตลอด 40 ปี)
C++98
- ช่วงปลายยุค 80 Bjarne Stroustrup และ Margaret A. Ellis ได้ร่วมกันเขียนหนังสือชื่อดัง Annotated C++ Reference Manual (ARM)
- หนังสือเล่มนี้มีจุดประสงค์อยู่ 2 อย่าง
- เนื่องจากมี implementation ของ C++ ที่เป็นอิสระต่อกันมากเกินไป ARM จึงทำหน้าที่นิยามความสามารถของ C++
- กลายเป็นรากฐานของมาตรฐาน C++98 (ISO/IEC 14882)
- C++98 มีฟีเจอร์สำคัญหลายอย่าง
- Templates
- STL(Standard Template Library) : รวมถึงคอนเทนเนอร์ อัลกอริทึม สตริง และ IO Stream
C++03
- C++03 (14882:2003) มีเพียงการแก้ไขทางเทคนิคเล็กน้อยมาก
- ในชุมชนมักเรียก C++03 ที่รวม C++98 อยู่ด้วยว่า "Legacy C++"
TR1
- ในปี 2005 มีเรื่องน่าสนใจเกิดขึ้น เมื่อมีการเผยแพร่ TR1(Technical Report 1)
- TR1 เป็นก้าวใหญ่สู่ C++11 และเป็นก้าวแรกของ Modern C++
- มีพื้นฐานมาจาก Boost project ของสมาชิกคณะกรรมการมาตรฐาน C++
- รวม 13 ไลบรารีที่จะเข้าไปอยู่ในมาตรฐาน C++ รุ่นถัดไป (เช่น regular expression, random number, smart pointer อย่าง
std::shard_ptr, hash table เป็นต้น)
C++11
- แม้จะเป็นมาตรฐาน C++ รุ่นถัดไป แต่เรามักเรียกมันว่า Modern C++ ซึ่งชื่อนี้ยังรวม C++14 และ C++17 ด้วย
- C++11 เปลี่ยนวิธีที่เราพัฒนา C++ ไปอย่างสิ้นเชิง
- นอกจากคอมโพเนนต์จาก TR1 แล้ว ยังนำ move semantics, perfect forwarding, variadic templates, constexpr และอื่น ๆ เข้ามาด้วย
- มี memory model ที่อิงการทำงานแบบ threading และมี Threading API รวมอยู่ด้วย
C++14
- เป็นมาตรฐาน C++ ขนาดเล็ก เพิ่ม read-writer locks, generalized lambdas และ constexpr functions
C++17
- ไม่ได้ใหญ่แต่ก็ไม่เล็ก
- มี 2 ฟีเจอร์เด่นมากคือ Parallel STL และ filesystem ที่ถูกทำให้เป็นมาตรฐาน
- อัลกอริทึม STL ราว 80 รายการสามารถรันผ่าน execution policy ได้ (parallel, sequential, vectorized)
- ได้อิทธิพลจาก Boost มาก ทั้ง filesystem และ data type 3 ตัว (
std::optional, std::variant, std::any)
C++20
- C++20 เช่นเดียวกับ C++11 ได้เปลี่ยนวิธีที่เราเขียนโปรแกรม C++ ไปอีกครั้ง
- โดยเฉพาะ 4 เรื่องใหญ่
- Ranges : เมื่อใช้ไลบรารี Ranges เราสามารถแสดงอัลกอริทึมบนคอนเทนเนอร์ได้โดยตรง และประกอบอัลกอริทึมด้วยสัญลักษณ์ pipe เพื่อนำไปใช้กับสตรีมข้อมูลแบบไม่สิ้นสุดได้
- Coroutines: ทำให้การเขียนโปรแกรมแบบ asynchronous ใน C++ กลายเป็นกระแสหลัก เป็นพื้นฐานของ cooperative tasks, event loops, infinite data streams และ pipelines
- Concepts: เปลี่ยนวิธีคิดและเขียนโปรแกรมด้วยเทมเพลต ทำให้สามารถกำหนดข้อจำกัดให้ template arguments หรือทำ type checking ได้ และตรวจสอบได้ตั้งแต่คอมไพล์ไทม์
- Modules: ช่วยก้าวข้ามข้อจำกัดของ header files และสัญญาว่าจะทำได้หลายอย่าง เช่น ไม่ต้องพึ่ง preprocessor อีกต่อไป ช่วยลดเวลา build และทำให้สร้างแพ็กเกจได้ง่ายขึ้นในที่สุด
C++23
- ณ เดือนกรกฎาคม 2023 C++23 กำลังรอการลงมติขั้นสุดท้าย
- เพิ่มฟีเจอร์เล็กแต่ส่งผลต่อภาษามากอย่าง "Deducing this"
- คล้ายกับ Python โดยสามารถทำให้ this pointer ที่ถูกส่งเข้า member function แบบ implicit กลายเป็น explicit ได้
- ทำให้เทคนิคที่ซับซ้อนอย่าง CRTP(Curiously Recurring Template Pattern) หรือการทำ Overload pattern เขียนได้ง่ายขึ้น
- ในไลบรารีของ C++23 ก็มีของเพิ่มที่สำคัญเช่นกัน
- สามารถ import standard library ได้โดยตรงด้วย
import std; และใช้ format string ของ C++20 กับ std:print และ std:println ได้
std::flat_map ที่มาแทน std::map ในด้านประสิทธิภาพ
- อินเทอร์เฟซของ
std::optional ถูกขยายเป็น Monadic interface เพื่อรองรับ Composability
- data type ใหม่
std::expected
std::mdspan สำหรับ span แบบหลายมิติ
std::generator ซึ่งเป็น coroutine สำหรับสร้างสตรีมของตัวเลข
2 ความคิดเห็น
ดูเหมือนว่ายังไม่มีข่าวเกี่ยวกับมาตรฐาน networking เลยนะ
แม้มาตรฐานถัดไปก็คงยังไม่แน่นอนเหมือนกัน;;