سؤال

في الآونة الأخيرة بدأت القراءة (قليلا فقط) على مشروع المستقبل C++11 القياسية.

هناك الكثير من الميزات الجديدة ، بعض منهم بالفعل متاحة عبر تعزيز يبس.بالطبع أنا سعيدة جدا مع هذا المعيار الجديد و أود أن تلعب مع جميع الميزات الجديدة في أقرب وقت المحتملة.

على كل حال الحديث عن مشروع مع بعض الأصدقاء منذ فترة طويلة C++ المشروعات الإنمائية بعض المخاوف ظهرت.لذا أطلب منك (الإجابة عليها):

1) اللغة نفسها

هذا التحديث ضخمة, ربما ضخمة جدا على معيار وحيد التحديث.ضخمة مترجم البائعين (حتى لو كان معظمهم بدأ بالفعل تنفيذ بعض الميزات) ولكن أيضا من أجل المستخدمين النهائيين.

ولا سيما صديق لي قال لي "هذا هو نوع من لغة جديدة".

  • يمكن أن نعتبر أنه لغة جديدة تماما بعد هذا التحديث ؟
  • هل خطة التحول إلى المعيار الجديد أو مواكبة "القديمة" القياسية(ق) ؟

2) معرفة اللغة

  • كيف منحنى التعلم سوف تتأثر جديدة المعيار ؟
  • تعليم اللغة سوف يكون أكثر صعوبة ؟
  • بعض الميزات ، في حين رهيبة جدا, يبدو قليلا جدا "الأكاديمية" لي (حسب تعريف أعني).هل أنا مخطئ ؟
  • اتقان كل هذه الإضافات الجديدة يمكن أن يكون كابوسا, أليس كذلك ؟
هل كانت مفيدة؟

المحلول

باختصار لا، لا يمكننا أن نعتبر هذه لغة جديدة.إنها نفس اللغة، وميزات جديدة.ولكن بدلاً من تثبيتها باستخدام Boost libs، ستصبح الآن تضمينات قياسية إذا كنت تستخدم مترجمًا يدعم معيار 0x.

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

أما إذا كنت سأفعل "التبديل إلى المعيار الجديد"، إذا كان ذلك يعني أنني سأتعلم المعيار الجديد وأستخدمه حيثما ينطبق ذلك وحيثما يزيد من إنتاجيتي، فنعم، أخطط بالتأكيد لـ يُحوّل.ومع ذلك، إذا كان هذا يعني أنني سأفعل حد أنا شخصياً سأعمل فقط مع الميزات الجديدة لمعيار 0x، إذن لا، نظرًا لأن الكثير من عملي يتضمن تعليمات برمجية مكتوبة قبل المعيار وسيكون الأمر بمثابة مهمة هائلة لإعادة تصميم كل شيء لاستخدام الميزات الجديدة.ليس هذا فحسب، بل قد يؤدي إلى ظهور أخطاء جديدة ومشكلات في الأداء لا أعرفها دون خبرة.

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

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

نصائح أخرى

1) اللغة نفسها

بقدر ما أنا على علم ، وهناك حقا أي كسر التغييرات بين C++'03 و C++'0 x.الوحيد الذي يمكنني التفكير هنا يتعلق باستخدام auto كما فئة تخزين محدد ، ولكن نظرا لأنه قد لا الدلالي يعني أنا لا أرى أن مسألة.

هناك الكثير من الأكاديمية الأخرى إصلاحات قياسي جدا necssary ، على سبيل المثال أفضل أوصاف تخطيط الأعضاء البيانات.أخيرا, مع multi-core/وحدة المعالجة المركزية أبنية أصبحت القاعدة ، تحديد نموذج الذاكرة كان يجب أن.

2) معرفة اللغة

شخصيا أشعر أن 99.9% من C++ المطورين أحدث اللغة سوف يكون أسهل للاستخدام.أنا على وجه التحديد التفكير من الميزات مثل السيارات ، لامدا و constexpr.هذه الميزات حقا أن تجعل من استخدام لغة أكثر متعة.

على مستوى أكثر تقدما ، لديك ميزات أخرى مثل variadic قوالب الخ التي تساعد المستخدمين أكثر تقدما.

ولكن لا يوجد شيء جديد هنا ، ما زلت مندهش من كمية اليومية C++ المطورين التي لم تستخدم (أو حتى سمعت) المحكمة الخاصة بلبنان.

من منظور شخصي, الميزة الوحيدة أنا قلق قليلا عن في المعيار الجديد هو أن المفاهيم.كما يتم مثل هذا التغيير الكبير ، نفس المشاكل التي حدثت مع قوالب (ie.تماما كسر تطبيقات) هو خطر حقيقي.

تحديث بعد الاستثمارات الخروج للتصويت:

كما يحدث مفاهيم' سقط C++ 0x و سوف يكون على C++ 1x.في النهاية هناك بعض التغييرات الأخرى من auto التي يمكن كسر رمز ، لكن عمليا هم على الأرجح سوف تكون نادرة جدا.الاختلافات الرئيسية يمكن العثور عليها في التذييل جيم-2 من الاستثمارات (pdf).

بالنسبة لي، سيكون أحد أهمها:

Unique_ptr + std::move()!

يتصور:

  1. مؤشر ذكي دون أي حمل:

    • لا توجد عمليات العد المرجعية
    • لا توجد مساحة تخزين إضافية لمتغير العداد المرجعي
  2. المؤشر الذكي الذي يمكن أن يكون انتقل, ، أي.لا توجد مكالمات مدمرة/منشئة عند نقلها

ماذا يعطيك هذا؟ استثناء آمن ورخيص (مؤشرات..) حاويات دون أي تكاليف.ستكون الحاوية قادرة على استخدام memcpy() Unique_ptrs فقط، لذلك لن يكون هناك أي فقدان للأداء بسبب لف المؤشر العادي بمؤشر ذكي!لذلك، مرة أخرى:

  1. يمكنك استخدام المؤشرات
  2. سيكون آمنًا (لا يوجد تسرب للذاكرة)
  3. لن يكلفك الأمر شيئا
  4. سوف تكون قادرًا على تخزينها في حاويات، وسيكون بمقدورها القيام بحركات "ضخمة" (مثل memcpy) بتكلفة رخيصة.
  5. سيكون الاستثناء آمنًا

:)

وجهة نظر أخرى:

  1. في الواقع، عند نقل مجموعة من الكائنات باستخدام Copy()، هناك استدعاء منشئ ومدمر لكل مثيل كائن.عند نسخ 1000 كائن بحجم 1 كيلو بايت، سيكون هناك على الأقل memcpy()‎ واحد و2000 استدعاء دالة.
  2. إذا كنت تريد تجنب آلاف المكالمات، فسيتعين عليك استخدام المؤشرات.
  3. لكن المؤشرات هي:خطير، الخ.المؤشرات الذكية الفعلية لن تساعدك، بل تحل مشاكل أخرى.
  4. لا يوجد حل في الوقت الراهن.يجب عليك الدفع مقابل تصميم C++ RAII/pointer/valuevars من وقت لآخر.ولكن مع C++0x، فإن استخدام Unique_ptr سيسمح بإجراء تحركات "ضخمة" للكائنات (نعم، الكائنات عمليًا، لأن المؤشر سيكون ذكيًا) بدون استدعاءات منشئ/مدمر "ضخمة"، ودون المخاطرة باستخدام المؤشرات! بالنسبة لي، هذا مهم حقًا.

إنه مثل تخفيف مفهوم RAII (بسبب استخدام المؤشرات) دون فقدان فوائد RAII.جانب آخر:سوف يتصرف المؤشر المغلف في Unique_ptr() في العديد من الجوانب المشابهة لمتغير الكائن المرجعي لـ Java.الفرق هو أن Unique_ptr() سيكون قادرًا على التواجد في نطاق واحد فقط في المرة الواحدة.

صديقك على حق جزئيًا ولكنه في الغالب مخطئ:انها ال نفس اللغة مع ميزات إضافية.

والشيء الجيد هو أنه ليس عليك إتقان جميع الميزات الجديدة.إحدى التفويضات الأساسية لهيئة المعايير هي عدم كسر التعليمات البرمجية الموجودة، لذلك ستكون قادرًا على الاستمرار في البرمجة بسعادة بأسلوبك القديم (ما زلت في الغالب مبرمجًا بلغة C على الرغم من أنني أقوم بتطبيقات "C++": -).

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

نصيحتي هي أن تتعلم كل الميزات الجديدة على مستوى عالٍ (حتى لو كان ذلك فقط لكي تبدو على دراية في مقابلات العمل) ولكن تعلم التفاصيل ببطء.

في بعض النواحي، يجب أن يكون C++0x كذلك أسهل للتدريس/التعلم من C++ الحالي:

  • حلقات من خلال حاوية - الجديد for بناء الجملة أسهل بكثير من for_each + الدالة أو التكرار يدويًا باستخدام التكرارات
  • تهيئة الحاويات:سنكون قادرين على تهيئة التسلسلات بنفس بناء جملة المصفوفات
  • إدارة الذاكرة:يخرج المراوغة القديمة auto_ptr, ، يأتي محددًا جيدًا unique_ptr و shared_ptr

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

هل تخطط للتبديل إلى المعيار الجديد أو مواكبة المعيار (المعايير) "القديمة"؟

قبل عام، كنت أكتب C89 بشكل صارم، لأن المنتج المعني كان قابلاً للنقل بقوة إلى الأنظمة الأساسية المضمنة، والتي كان لدى بعضها مترجمين بأفكار مختلفة جذريًا عن أجزاء C99 التي تستحق الدعم.لذا، لم يتم بعد استبدال المعيار الذي يبلغ عمره 20 عامًا بشكل كامل بالمعيار الذي يبلغ عمره 10 أعوام.

لذلك لا أتوقع أن أتمكن من الابتعاد عن C++03 في أي وقت قريب.

أتوقع استخدام ميزات C++ 0x عند الاقتضاء.تمامًا كما أستخدم ميزات C99 في كود C، وامتدادات gcc في C وC++ (وسأستخدم امتدادات MSVC، على الرغم من أنني لم أعمل مطلقًا على كود MSVC فقط لأكثر من فترات زمنية تافهة).لكنني أتوقع أن يكون "من الجميل أن يكون لديك" بدلاً من خط الأساس، إلى أجل غير مسمى إلى حد كبير.

لديك وجهة نظر، ولكن كان هذا هو الحال دائما.هناك الكثير من أكواد C++ المتوفرة والتي لا تزال لا تتضمن أي شيء من معيار 98 فقط بسبب التحفظ الفطري لبعض المبرمجين.البعض منا يتذكر وقتًا مظلمًا قبل std:: مساحة الاسم (قبل مساحات الأسماء، في الواقع)، عندما كتب الجميع فئة السلسلة الخاصة بهم، وكانت المؤشرات تتجول عارية طوال الوقت.هناك سبب وراء حديثنا عن "نمط C++ الحديث" - للتمييز عن النمط السابق لأن بعض الأشخاص لا يزال يتعين عليهم الحفاظ على التعليمات البرمجية أو تحديثها بهذا النمط.

يجب أن تتطور أي لغة لتتمكن من البقاء، وأي لغة تتطور سيكون لها قاعدة مستخدمين منقسمة، وذلك فقط بسبب اختلاف الناس في مواقفهم تجاه تقدير تكاليف الفرصة البديلة في تطبيق ميزات اللغة الجديدة على عملهم.

مع ظهور C++0x في مترجمي الشحن، سيتم تكرار هذه المحادثة مرارًا وتكرارًا في فرق التطوير في جميع أنحاء العالم:

الشاب:لقد اكتشفت للتو هذه الأشياء التي تسمى لامدا!وأجد الكثير من الطرق لاستخدامها لجعل الكود الخاص بنا أكثر تعبيرًا!انظر، لقد أعدت كتابة فصلك القديم في لغة Foo، أليس هذا أكثر إتقانًا؟

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

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

أولدستر:لو كان الأمر بيدي لكنا متمسكين بـ PL/1، لكن لا...كان على زوجتي أن تصوت لصالح كارتر والآن نحن عالقون في كل هذه الهراء الموجه نحو الأشياء.لا يوجد شيء يمكنك فعله به std::transform و lambdas التي لا أستطيع فعلها بـ goto واثنين من التسميات.

إلخ.

ستتضمن مهنتك في البرمجة دائمًا التعلم وإعادة التعلم.لا يمكنك أن تتوقع أن تظل لغة c++ كما هي حتى تتقاعد وأن تستخدم نفس الأساليب والممارسات التي كنت تستخدمها منذ 40 عامًا.التكنولوجيا تتقدم، وتتحرك بسرعة.انها عملك لمواكبة ذلك.بالطبع يمكنك تجاهل ذلك، والاستمرار في العمل بنفس الطريقة التي تعمل بها حاليًا، ولكن في غضون 5/10 سنوات ستصبح قديمًا جدًا لدرجة أنك ستضطر إلى تعلم كل شيء عندما تحاول تغيير وظيفتك .وسيكون من الأسهل كثيرًا التعلم أثناء العمل طوال تلك السنوات السابقة :)

قبل بضعة أشهر سمعت بيارن ستروستروب إلقاء محاضرة بعنوان 50 عامًا من لغة C++.من المسلم به أنني لست مبرمجًا بلغة C++، لكن يبدو لي أنه بالتأكيد لا يعتقد أن 0x هي لغة جديدة!

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

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

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

لا يقتصر الأمر على قيام عدد قليل من مصممي اللغات بالجلوس وتبادل الأفكار حول الميزات الجديدة التي يرغبون في تجربتها.

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

هناك الكثير من الأشياء الجيدة في C++0x، لكنها في الغالب عبارة عن تغييرات تطورية تعمل على تحسين الأفكار الحالية أو توسيعها.لا أعتقد أن الأمر مختلف بما يكفي لتبرير تسميتها بـ "اللغة الجديدة".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top