13 คะแนน โดย xguru 2023-07-13 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • มาตรฐาน 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 ความคิดเห็น

 
carnoxen 2023-07-13

ดูเหมือนว่ายังไม่มีข่าวเกี่ยวกับมาตรฐาน networking เลยนะ

 
penza1 2023-07-20

แม้มาตรฐานถัดไปก็คงยังไม่แน่นอนเหมือนกัน;;