معيار C ++! = (معظم) المعيار الجديد



غالبًا ما يستخدم مصطلح "الحديث C ++" كمرادف لعبارة "الكود باستخدام معيار C ++ الجديد". هنا ، "جديد" يمكن أن يعني أي شيء من C ++ 11 إلى C ++ 17 ، أو حتى ما هو متاح بالفعل من C ++ 20. أعتقد أن C ++ الحديث هو شيء أكثر ، لا يقتصر على إضافة علامة -std = c ++ 17 .

ماذا يعني الحديث؟


إذا بحثنا عن معنى كلمة "حديث" على شبكة الإنترنت ، فمن أولها نجد تعريفًا من قاموس Merriam-Webster . فيما يلي جزءان يتعلقان بـ C ++:

[...]

2: تشمل التقنيات الحديثة أو الأساليب أو الأفكار: (حديثة) طرق الاتصال الحديثة

3 الكتابة بالأحرف الكبيرة: من أو تتعلق بخصائص الفترة الحالية أو الأخيرة لتطوير اللغة - اللغة الإنجليزية الحديثة

[...]

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

يمكن للمرء أن يجادل بأن القدرات الموجودة منذ C ++ 98 ليست جزءًا من C ++ الحديثة ، لأنها موجودة لفترة طويلة جدًا. ومع ذلك ، يجب أن نتذكر أن الأشخاص الأكثر نشاطًا في المجتمع الذين يتحدثون أو يكتبون عن "C ++ الحديثة" هم في الغالب رواد. معظمهم يستخدمون ويدرسون ويعلمون جيدًا "C مع الفصول" القديمة من التسعينيات ، مما يجعل العديد من الطرق غير المستخدمة هناك جزءًا من C ++ الحديثة.

ما وراء الميزات الجديدة


أي مما هو متاح في C ++ 98 يعتبر أنه ينتمي إلى فئة "C ++ الحديثة"؟ فيما يلي قائمة جزئية ببعض الميزات والأفكار الهامة:

RAII


يشير RAII إلى "الحصول على المورد هو التهيئة" ، أو "الحصول على المسؤولية هو التهيئة". على الرغم من أن الاسم يركز على "التهيئة" ، إلا أن الجزء الرئيسي هنا هو في الواقع المدمر. الإفراج الحتمي عن الموارد هو أحد الخصائص الرئيسية لـ C ++ التي تميزها عن معظم اللغات الأخرى. بالنسبة للكثيرين ، هذه هي الخاصية الأكثر أهمية .

يمكن استخدام RAII لإدارة العديد من الأشياء بشكل موثوق ، مثل الذاكرة (على سبيل المثال ، std :: vector ، std :: string ) ، واصفات الملفات ( std :: fstream ) ، اتصالات الشبكة ، كائنات المزامنة ، اتصالات قاعدة البيانات ، وكذلك الكيانات التي ترتبط بشكل بعيد بالموارد. إذا كنت بحاجة إلى طريقة موثوقة للقيام ببعض الإجراءات ، ثم قم بإلغائها عند الخروج من نطاق معين أو عند تدمير كائن ، فإن RAII هو ما تحتاجه.

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

تقنية RAII هي بالتأكيد جزء من C ++ الحديثة ، على الرغم من أنها كانت متاحة منذ البداية.

كتابة قوية


كانت فكرة الكتابة القوية شائعة جدًا مؤخرًا. في الماضي ، كانت أي معرّفات ، وأحجام ، ورموز بريدية ، وأسعار ، وما إلى ذلك ، ممثلة عبر int أو double ، أو نوع حسابي آخر. حقيقة أنها كانت متوافقة ، ولا علاقة لها تمامًا بقيم بعضها البعض ، والتي كانت بالصدفة من نفس النوع ، مصدرًا للأخطاء ، ولكن ماذا يمكنني أن أفعل؟ على الأقل لا يقوم المترجم بتحويل الأرقام والمصفوفات إلى سلاسل بصمت!

في الواقع ، اتضح أن نظام نوع C ++ وتجريد صفر * التكلفة الذي يوفره لنا المترجم يمكنه القيام بالكثير. ما عليك سوى إنشاء أنواع مختلفة للمعرفات والرموز البريدية والأحجام (لا ، بدون كتابة ، شكرًا) وما إلى ذلك. إذا كنت مهتمًا ، فاطلع على إحدى المحاضرات التي ألقاها Björn Fahller أو Jonathan Boccara أو Jonathan Müller .

* (حتى لو كانت تكلفة التجريد غير صفرية ، أثبت أنها غير مقبولة قبل التخلي عنها)

بصرف النظر عن بعض الإضافات الحديثة ، كانت <algorithm> في المكتبة القياسية منذ البداية. ولكن إذا نظرت إلى الرمز ، فقد تبين أن الناس غالبًا ما يفضلون كتابة الحلقات يدويًا. تتراوح الأسباب من عدم معرفة الخوارزميات القياسية المتاحة للاعتقاد بأن "النماذج بطيئة جدًا" (غالبًا بدون تفسير ، مقارنة بما).

برمجة مرحلة التجميع


تم استخدام أشياء مثل البرمجة التخطيطية باستخدام القوالب منذ C ++ 98. المنطق الذي يتم تنفيذه في وقت الترجمة يمكن أن يقلل بشكل كبير من التعقيد في وقت التشغيل. في الماضي ، كان من غير المناسب استخدامه. يختلف بناء القوالب في اتجاه التعقيد عن القدرات الموجودة في أحدث المعايير. هذا شيء يشبه اللغة المنفصلة التي يجب أن نتعلمها. ومع ذلك ، فإن أشياء مثل إرسال العلامات أو السمات ليست معقدة للغاية للاستخدام والكتابة.

نعم ، ظهرت معظم السمات في المكتبة القياسية مع ظهور C ++ 11 ، لكن كتابتها وفقًا لاحتياجاتك ليست صعبة للغاية ، وكانت بعض السمات الأكثر شيوعًا في Boost قبل C ++ 11. أعتبر استخدام منطق مرحلة التجميع جزءًا من C ++ الحديثة لأنه يفصل C ++ عن "C مع الفئات" في كل مكان.

الخلاصة


لا يتعلق برنامج C ++ الحديث بالمعايير الجديدة ، ولكن بالطريقة التي نكتب بها برامجنا. أولاً ، يمكن كتابة C ++ 98 بأسلوب حديث إلى حد ما. ثانيًا ، "لغة C مع الفئات والمستندة إلى النطاق للحلقات" ليست لغة C ++ حديثة. تساعدنا الميزات الجديدة للغة والمكتبات في الكتابة بأسلوب C ++ الحديث ، لكنها لا تجعل الكود الحديث C ++.

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


All Articles