تم إصدار إصدار C++ جديد: ما الذي تغير في لغة البرمجة
قامت اللجنة الدولية لتوحيد معايير C++ (ISO/IEC JTC1/SC22/WG21) بالموافقة رسميًا على الإصدار التالي من المعيار — C++23. يجلب هذا الإصدار تحسينات طال انتظارها تجعل اللغة أكثر أمانًا وتعبيرًا وسهولة في الاستخدام لتطوير كل من البرامج النظامية والتطبيقية. نستعرض أهم المستجدات.
التغييرات الرئيسية في C++23
1. std::print — إخراج منسق دون عناء
من أبرز الميزات ظهور دالة std::print. الآن، للإخراج إلى التدفق القياسي، لا حاجة لكتابة تركيبات ضخمة مع std::cout أو استخدام printf مع خطر أخطاء الأنواع. تعمل std::print استنادًا إلى std::format، مما يضمن أمان الأنواع وسهولة القراءة:
- تنسيق تلقائي للأرقام والسلاسل والأنواع المخصصة.
- دعم الإعدادات المحلية (locales) وUnicode.
- سرعة قريبة من
printf، ولكن دون تسرب للذاكرة.
2. تحسين العمل مع coroutines
حصلت coroutines، التي ظهرت لأول مرة في C++20، على سلسلة من التصحيحات والإضافات. في C++23، تم تبسيط بناء جملة تعريف الدوال غير المتزامنة، كما تمت إضافة دعم std::generator — نوع جديد لإنشاء تسلسلات من القيم بشكل فوري:
- تتيح المولدات كتابة حسابات كسولة (lazy computations) دون إدارة يدوية للحالة.
- انخفض حجم الكود النمطي (boilerplate) للعمل مع coroutines.
3. الوحدات (Modules) — الاستقرار والأداء
على الرغم من إدخال الوحدات في C++20، إلا أن تنفيذها في المترجمات كان بحاجة إلى تحسين. في المعيار الجديد، تم توضيح قواعد التصدير والاستيراد، مما أدى إلى:
- تقليل وقت ترجمة المشاريع الكبيرة بمقدار 2–3 مرات.
- توافق كامل مع ملفات الرؤوس (header files) (الوضع الهجين).
- إمكانية إنشاء وحدات للمكتبة القياسية (بشكل تجريبي).
4. إمكانيات جديدة لـ constexpr و consteval
توسيع سياق التعبيرات الثابتة هو أحد الأهداف الرئيسية لتطوير C++. في C++23، يُسمح باستخدام constexpr من أجل:
- تخصيص الذاكرة الديناميكي (
std::vectorوstd::string). - استدعاء الدوال الافتراضية (virtual functions).
- العمل مع الفاصلة العائمة دون فقدان الدقة.
يسمح هذا بتنفيذ المزيد من العمليات الحسابية في مرحلة الترجمة، مما يسرع وقت التشغيل (runtime).
5. السمة [[assume]] — تلميحات للمحسّن (optimizer)
السمة الجديدة [[assume(تعبير)]] تُخبر المترجم بأن التعبير صحيح في هذه النقطة من الكود. وهذا يعطي:
- تحسينات أكثر عدوانية (إزالة التفرعات، طي الحلقات).
- زيادة الأداء في الأجزاء الحرجة (محركات الألعاب، الأنظمة المضمنة).
6. تبسيط تعدد الخيوط (multithreading)
تمت إضافة أنواع جديدة للمزامنة: std::counting_semaphore مع أداء محسّن و std::latch للحواجز لمرة واحدة. بالإضافة إلى ذلك، ظهر دعم std::mdspan