ميزة تجميد C ++ 20. Coroutines ، وحدات وأكثر من ذلك

في اليوم الآخر ، كان هناك اجتماع للجنة التقييس الدولية C ++ في مدينة كونا الأمريكية. لم يكن مجرد اجتماع ، ولكن تجميد الميزة! لا توجد أفكار جديدة جادة يمكن أن تتسرب إلى المعيار بعد الآن ، لا يتبقى سوى بضع اجتماعات لإضافة أشياء تمت الموافقة عليها مسبقًا ، وتصحيح أوجه القصور والقضاء على الخشونة.

في حالة توقع ظهور الوحدات النمطية و Corutins في C ++ 20 ، هل ستكون هناك مكتبة سريعة لتنسيق الإخراج ، هل ستكون قادرة على العمل مع التقاويم ، هل ستضيف std :: stacktrace ، وسيبدأ المحول البرمجي الاتصال std :: حرك نفسه في بعض الحالات ، هل سيقبلون :: flat_map ؟ كل هذا وأكثر من ذلك بكثير ينتظرك تحت الخفض.



Coroutines TS


اندلع النقاش الأكثر سخونة حول coroutines. كان على اللجنة أن تفكر في ثلاثة أساليب مختلفة للكوروتينات وأن تقرر ما إذا كانت ستقبل كوروتس تي أس الحالي كمعيار ، أو أن تتخذ مسارًا مختلفًا.

لم يكن الخيار سهلاً ، فكل نهج له عيوبه ومزاياه:

  • N4775 :
    • + لا توجد قيود على حقيقة أنه ينبغي وصف coroutines في ملف الرأس
    • - لا توجد ضمانات صارمة بأنه لن يكون هناك تخصيص ديناميكي
    • ± ليست أسهل واجهة ( يعمل P1477R0 على إصلاح هذا)
    • - الكلمات القبيحة co_await و co_yield (الجملة P1485R0 من WP21 تعمل على إصلاح هذا)
    • + 3 سنوات تطبق في الممارسة

  • P1063R2 :
    • + لا تخصيصات ديناميكية
    • - يجب وصف coroutines في ملف الرأس أو تحتاج إلى خداع نفسك بنوع محو نفسك
    • - المزيد من مشغلي المفاتيح المخيفة [<-] و [->]
    • - لا يوجد نموذج العمل
    • - ليست أسهل واجهة لإنشاء أشياء غير متزامنة

  • P1430R0 :
    • + لا تخصيصات ديناميكية
    • - يجب أن يوصف coroutines في ملف الرأس أو تحتاج إلى الخروج مع كتابة محو نفسك
    • + لا كلمات مخيفة ، كل شيء على نحو سلس
    • + لا يرى مستخدمو Corutin الدواخل المخيفة للكوروتيني (حتى لا يروا نظائرهم المشتركة ، كل شيء يعمل خارج الصندوق)
    • - الاقتراح الأول ، الذي لم يناقش قط ، يتطلب مجموعة من التحسينات
    • - من المستحيل تنفيذها على التقنيات الحالية (تتطلب دعمًا للهياكل ذات الحجم الديناميكي) ، تتطلب تكاليف العمالة الهائلة لتنفيذها
    • like قليلا مثل الشعرية رد الاتصال


بعد الكثير من النقاش ، تم اعتماد coroutines في C ++ 20 كما كانت في Coroutines TS (مع بادئات co_ * ونقاط التخصيص القديمة).

وحدات


تأثرت مناقشة الوحدات النمطية بوثيقة واحدة مثيرة للاهتمام مع مقاييس الأداء:
P1441R0 . يمكن تفسير النتائج بطرق مختلفة: من "أنظمة التجميع الحالية وتنفيذ الوحدات النمطية لم يتم تحسينها بشكل كافٍ بعد" إلى "الوحدات لا تتناسب مع التعقيد المتزايد للمشروع."

بالإضافة إلى هذه الوثيقة ، ناقشت اللجنة عددًا من التغييرات الطفيفة على الوحدات الحالية. نتيجة لذلك ، بعد 15 عامًا من المناقشة والنماذج الأولية والتجريب مع التطبيقات ، تم اعتماد الوحدات النمطية في C ++ 20.

تنسيق


اخبار جيدة للجميع! إذا لم تجد أي عيوب قاتلة في المجموعة الفرعية Library ، فسيكون من الممكن في C ++ 20 تنسيق السلاسل بأمان وبسرعة كبيرة. نقول وداعا للأمراض المنقولة جنسيا :: دائرة الرقابة الداخلية ، الأمراض المنقولة جنسيا :: لغة وغيرها من أهوال 90s! لدى Python الآن بناء جملة مماثل للتنسيق خارج الصندوق في C ++: P0645R5 .

علاوة على ذلك ، تم قبول اقتراح دمج التنسيق الجديد وأوقات التقويم P1361R0 . إذا سارت الأمور وفقًا للخطة ، يمكن عرض التواريخ بطريقة إنسانية!

الشبكات ، منفذي ، وخصائص


يعد المنفذون لبنة مهمة لدعم الشبكات في الإصدار C ++. يحتاج المنفذون إلى خصائص - القدرة على تعديل نوع البيانات ، اعتمادًا على المعلمة التي تم تمريرها في مرحلة الترجمة ، دون تغيير مفهوم النوع.

الخصائص موصوفة في P1393R0 . على الرغم من أن النص المراد إدراجه في المعيار ليس سوى صفحتين ، تسبب الاقتراح في مناقشات ساخنة. يسمح لك الاقتراح بإنشاء نقاط تخصيص كلي القدرة ، وتغيير سلوك أي وظائف باستخدام الخصائص.

نتيجة لذلك ، تقرر تضمين الخصائص باللغة فقط في C ++ 23 ، وبالتالي ، لن يظهر Executors and Networking في C ++ 20.

أخرى


تم إجراء التغييرات التالية بالفعل على مشروع C ++ 20:

  • يمكن الآن تهيئة الهياكل التي لا تحتوي على مُنشئات (مجاميع) باستخدام أقواس P0960 . في الممارسة العملية ، هذا يعني أن std :: make_shared ، std :: make_unique ، std :: * :: emplace * الآن ستعمل بشكل صحيح مع المجاميع دون أخطاء ترجمة
  • تمت إضافة وظائف Lerp للاستيفاء الخطي P0811
  • إضافة القدرة على توجيه خوارزميات المكتبة القياسية P1001
  • تُرجع أساليب std :: span الآن أنواعًا غير موقعة (على غرار المكتبة القياسية بأكملها) + تمت إضافة وظيفة std :: ssize للحصول على حجم الحاوية كرقم موقَّع P1227
  • تعلمت الحاويات غير المرتبة كيفية البحث عن القيم باستخدام تجزئة محسوبة مسبقًا P0920

هناك العديد من الأشياء الأخرى التي تنتظر المراجعة النهائية في المجموعتين الفرعيتين Library و Core لإدراجها في الإصدار C ++ 20:

  • الانتظار الفعال على الأمراض المنقولة جنسيا :: الذرية ؛ فئات الإشارة والحاجز P1135
  • الأمراض المنقولة جنسيا :: flat_map P0429
  • الأمراض المنقولة جنسيا :: flat_set P1222
  • الأمراض المنقولة جنسيا :: function_ref P0792
  • constexpr لـ <cmath> و <cstdlib> P0533
  • std :: rangees :: to <any-container> لتخزين مجموعة من القيم في حاوية P1206
  • القدرة على استخراج سلاسل من std :: * stringstream ونقل سلاسل مخصصة P0408 بكفاءة
  • تعديلات متعددة للمشغل <=> ، النطاقات ، constexpr

مزايا RG21


في اليوم الأول تمامًا ، تناولت مجموعة فرعية Core اقتراح Yandex.Taxi المحبّب بشدة على Stacktrace P0881R3 . تمت مناقشة تعليقات التصميم بشكل أكبر في المجموعة الفرعية لـ LEWG ، والتي تم إعدادها مرة أخرى في Core. ونتيجة لذلك ، أجريت تصويبات على مدار الأسبوع وعقدت مناقشات. لم يتم تضمين الاقتراح بعد في مشروع المعيار ، ولكن يجب أن يكون في C ++ 20 (إذا وجدوا فجأة بعض العيوب القاتلة).

قبل مناقشة فكرتنا عن P1485R0 لإحضار الكلمات الأساسية لـ coroutine ، لم يصل الأمر إلى نتيجة.

في SG1 أيضًا ، ناقش التزامن فكرة وجود خريطة متزامنة غير مرتبة P0652R2 . لقد طُلب منا التحقق من أن واجهة برمجة التطبيقات المقترحة تتجنب تنافس القارئ. قالوا أيضًا للتحقيق في حاويات غير منظمة متزامنة لا تحتوي على وظيفة المسح ولا تحمي قيمة الحاوية من التعديل التنافسي.

إن العرض الذي قدمته ZaMaZaN4iK لتخصيص std :: hash لفئات مختلفة من المكتبة القياسية P1406R0 تقرر تقليصه بشدة. أوصت اللجنة بترك التخصصات فقط للأمراض المنقولة جنسياً :: الزوج ، الأمراض المنقولة جنسياً :: الأمراض المنقولة جنسياً ، الأمراض المنقولة جنسياً :: المصفوفة و الأمراض المنقولة جنسياً :: basic_string من مُخصصات المستخدم

في مجموعة فرعية من الأرقام ، ناقشت لجنة الدراسات 6 آلية للتفاعل بين مختلف فئات الأعداد الجديدة P0880R2 . يتيح لك الاقتراح تخصيص نموذجين ، والحصول على مجموعة كاملة من العمليات الرياضية والمقارنات لجميع الأنواع الجديدة. بعد المناقشة ، قرروا محاولة توسيع الآلية بحيث يمكن استخدامها ليس فقط لاحتياجات المكتبة القياسية ، ولكن أيضًا يمكن للمستخدمين استخدام هذه العوامل لأنواعها.

ناقشنا أيضًا اقتراحاتنا الثانوية ، بما في ذلك اختبار الميزات الماكرو P1424R0 والسياسات لإضافتها إلى المعيار.

ناقشنا بسرعة فكرتنا عن السماح لبرنامج التحويل البرمجي بإزالة النسخ غير الضرورية من R0889R1 . قيل لنا مواصلة العمل في هذا الاتجاه وألقوا أمثلة لا ينبغي أن تتعارض مع القواعد الجديدة.

بدلا من المجاميع


سيكون C ++ 20 مختلفًا تمامًا عن C ++ 17 كما سيكون C ++ 11 مختلفًا عن C ++ 03. عدد كبير من التقنيات الجديدة والنماذج الجديدة: المفاهيم ، العقود ، النطاقات ، الوحدات النمطية ، Coroutines ، حاويات constexpr وتعدد الأشكال constexpr الديناميكي ، "nibloids" ، إلخ.

قريبًا ، سنقوم ، مجموعة العمل 21 ، بنشر تعليقات على مشروع C ++ 20. لذلك ، إذا كنت تعاني من أي ألم أو لا توافق على أي ابتكار ، فيرجى ترك أفكارك في هذه الصفحة .

سيكون الاجتماع القادم للجنة الدولية في فصل الصيف ، حيث يمكن النظر في ابتكارات C ++ 23. إذا كنت تريد تغيير شيء ما في C ++ أو اقتراح فكرتك ، فيمكنك دائمًا الكتابة على https://stdcpp.ru/ ، حيث سيساعدك الأشخاص من WP21 على نقل رغباتك إلى اللجنة.

هل ترغب في التحدث إلينا مباشرة؟ سيتم عقد اجتماع مفتوح لـ RG21 قريبًا ، ترقبوا الإعلانات في events.yandex.ru . انظر أيضًا إلى مؤتمر C ++ لروسيا في أبريل في موسكو.

Source: https://habr.com/ru/post/ar438864/


All Articles