أهم النقاط
1. لغة C++: لغة للتجريد الأنيق والفعّال
تُعد لغة C++ أداة لتطوير واستخدام التجريدات الأنيقة والفعّالة.
طبيعة مزدوجة. صُممت C++ لتجسر الفجوة بين الوصول المباشر إلى العتاد منخفض المستوى ومجالات المشكلات عالية المستوى. فهي ترث كفاءة لغة C في برمجة الأنظمة، مع إضافة آليات تجريد قوية مستوحاة من Simula. الهدف هو توفير لغة تجمع بين الأداء العالي والتعبير الواضح، مما يمكّن المبرمجين من تمثيل المفاهيم مباشرة في الشيفرة.
- ربط مباشر بالعتاد
- آليات تجريد ميسورة التكلفة
- لغة عامة الاستخدام
- تميل إلى برمجة الأنظمة
عدم وجود تكلفة زائدة. مبدأ أساسي في تصميم C++ هو "مبدأ عدم دفع ثمن ما لا تستخدمه": لا تتحمل تكلفة أي ميزة لغوية أو تجريد أساسي لم تُستخدم. صُممت الميزات لتكون فعّالة كالشيفرة المكتوبة يدويًا، وهو أمر حاسم لتطبيقات الأداء العالي وبرمجيات البنية التحتية.
- الكفاءة هي الأساس
- لا تكاليف ضمنية للميزات غير المستخدمة
- تمكين الاستخدام في بيئات ذات موارد محدودة
تعبير الأفكار. تهدف اللغة إلى مساعدة المبرمجين على التعبير عن أفكارهم بوضوح وبشكل مباشر في الشيفرة. يشمل ذلك تمثيل المفاهيم كأنواع، والعلاقات كهياكل أو معاملات، والأفكار المستقلة بشكل منفصل. يُشجع دمج أنماط برمجة مختلفة لتحقيق أفضل الحلول.
- التعبير المباشر عن الأفكار
- تمثيل العلاقات
- فصل الأفكار المستقلة
- تبسيط الأفكار البسيطة
2. C++ الحديثة (C++11) لغة أفضل
تبدو C++ كلغة جديدة تمامًا.
تطور ملحوظ. شهدت لغة C++ تحسينات جذرية عبر السنوات، وأبرزها معيار C++11. هذه التغييرات جعلت C++ أداة أكثر قوة ورقيًا لكتابة برمجيات عالية الجودة. تتيح C++ الحديثة تعبيرًا أوضح وأبسط وأكثر مباشرة عن الأفكار.
- C++11 مقابل C++98
- تعبيرية محسنة
- أمان وأداء أفضل
الميزات الرئيسية. قدم معيار C++11 مجموعة واسعة من الميزات التي غيرت جوهريًا طريقة كتابة واستخدام C++. تشمل دعمًا أفضل للتزامن، وإدارة الموارد، والبرمجة العامة، بالإضافة إلى تسهيلات نحوية تقلل من الشيفرة المتكررة.
- دعم التزامن (
std::thread,std::mutex) - دلالات النقل (
std::move, مراجع rvalue) - المؤشرات الذكية (
unique_ptr,shared_ptr) - الدوال اللامبادا
autoوconstexpr- قوائم التهيئة
اعتماد الأساليب الحديثة. يُشجع المبرمجون بشدة على تبني ميزات وأنماط C++ الحديثة. التمسك بأساليب C++98 أو C القديمة يؤدي إلى شيفرة أقل جودة، أقل قابلية للصيانة، وربما أقل أداءً. يضمن المعيار التوافق مع الإصدارات السابقة، لكن التقدم مستمر.
3. الفصول: أساس التجريد
الميزة اللغوية المركزية في C++ هي الفصل (class).
أنواع معرفة من قبل المستخدم. تُعد الفصول الآلية الأساسية لإنشاء أنواع مخصصة تمثل مفاهيم من مجال المشكلة مباشرة في الشيفرة. مجموعة مختارة بعناية من الفصول تجعل البرنامج أسهل في الفهم، والتفكير فيه، والتعديل عليه.
- تمثيل المفاهيم كأنواع
- أساس آليات التجريد
- تحسين وضوح الشيفرة وقابليتها للصيانة
التغليف. تسمح الفصول بتمييز الواجهة العامة (ما يراه المستخدمون ويستخدمونه) عن تفاصيل التنفيذ الخاصة (أعضاء البيانات والدوال المساعدة). هذا يفرض إخفاء البيانات، ويضمن استخدامًا متسقًا لها، ويسمح بتغيير التنفيذ دون التأثير على شيفرة المستخدم.
- واجهة عامة
- تنفيذ خاص
- إخفاء البيانات
- فصل المسؤوليات
البناؤون والمدمرون. يحدد البناؤون كيفية تهيئة الكائنات، مما يضمن وجودها في حالة صالحة عند الإنشاء. يحدد المدمرون إجراءات التنظيف عند تدمير الكائن، وهو أمر حاسم لتحرير الموارد. تشكل هذه الثنائية أساس تقنيات إدارة الموارد مثل RAII.
- تهيئة مضمونة
- اكتساب الموارد (البناؤون)
- تحرير الموارد (المدمرون)
- ثوابت الفصل
4. إدارة الموارد: RAII والمؤشرات الذكية
تركيبة البناؤون/المدمر هي أساس العديد من التقنيات الأنيقة.
مبدأ RAII. "اكتساب الموارد هو التهيئة" (RAII) تقنية أساسية في C++ تربط اكتساب الموارد بتهيئة الكائن (البناؤون) وإطلاقها بتدمير الكائن (المدمر). يضمن هذا إدارة صحيحة للموارد حتى عند رمي الاستثناءات أو الخروج المبكر من الدوال.
- اكتساب الموارد في البناؤون
- تحرير الموارد في المدمرون
- تنظيف تلقائي عند خروج النطاق
- أمان الاستثناءات
تجنب التسريبات. يساعد RAII في منع تسريبات الموارد (كالذاكرة) وأخطاء إدارة الموارد الأخرى (الحذف المبكر أو المزدوج). من خلال تغليف ملكية الموارد داخل الكائنات، يتولى المترجم التنظيف تلقائيًا.
- القضاء على استخدام
newوdeleteالعاريين - منع تسريبات الذاكرة
- إدارة الملفات، الأقفال، الخيوط، وغيرها
المؤشرات الذكية. unique_ptr و shared_ptr مؤشرات ذكية في المكتبة القياسية تستخدم RAII لإدارة الذاكرة المخصصة ديناميكيًا. يوفر unique_ptr ملكية حصرية، بينما يتيح shared_ptr ملكية مشتركة عبر عد المرجع. يُفضل استخدامها على المؤشرات الخام لإدارة الكائنات في الذاكرة.
unique_ptr(ملكية حصرية)shared_ptr(ملكية مشتركة)- تحرير تلقائي للذاكرة
- تجنب استدعاءات
deleteاليدوية
5. القوالب: تمكين البرمجة العامة
القالب هو فصل أو دالة نُعطيها مجموعة من الأنواع أو القيم كمعاملات.
المعاملات في وقت الترجمة. تتيح القوالب تعريف فصول، دوال، ومرادفات أنواع بمعاملات من أنواع أو قيم أو قوالب أخرى. هذا يمكّن كتابة شيفرة تعمل مع أنواع متعددة دون التضحية بالأداء.
- المعاملات حسب النوع أو القيمة
- تعدد الأشكال في وقت الترجمة
- توليد الشيفرة
البرمجة العامة. تشكل القوالب أساس البرمجة العامة في C++، التي تركز على تصميم خوارزميات وهياكل بيانات تعمل مع أي نوع يفي بمتطلبات معينة (مفاهيم). يسمح هذا بكتابة شيفرة قابلة لإعادة الاستخدام، آمنة من حيث النوع، وفعالة.
- تصميم خوارزميات عامة
- العمل مع أنواع متنوعة
- المفاهيم (متطلبات المعاملات)
الكفاءة. القوالب آلية في وقت الترجمة، مما يعني أن استخدامها لا يضيف تكلفة تشغيلية مقارنة بالشيفرة المكتوبة يدويًا. يتحقق ذلك عبر تقنيات مثل التضمين والحساب في وقت الترجمة.
- عدم وجود تكلفة تشغيلية
- تمكين التضمين
- الحساب في وقت الترجمة
6. المكتبة القياسية: أدواتك الأساسية
لا يُكتب برنامج مهم بلغة برمجة عارية فقط.
مكونات أساسية. توفر المكتبة القياسية مجموعة شاملة من المكونات الأساسية الضرورية لمعظم برامج C++. تشمل الحاويات، الخوارزميات، مرافق الإدخال/الإخراج، الأدوات، ودعم التزامن.
- الحاويات (vector, list, map, set)
- الخوارزميات (sort, find, copy, unique)
- تدفقات الإدخال/الإخراج (cin, cout, cerr)
- الأدوات (pair, tuple, المؤشرات الذكية، الوقت)
- دعم التزامن
الأساس. المكتبة القياسية مكتوبة بلغة C++ نفسها، مما يبرهن على قوة اللغة ويشكل نموذجًا لتصميم جيد. تعمل كأساس مشترك للمكتبات والتطبيقات الأخرى، مما يعزز قابلية النقل والتشغيل البيني.
- مكتوبة بـ C++
- نموذج للتصميم الجيد
- تعزز قابلية النقل
- تمكّن التشغيل البيني
تفضيل القياسي. يُشجع المبرمجون بشدة على استخدام مكونات المكتبة القياسية متى أمكن بدلاً من إعادة اختراعها. المكونات القياسية مصممة جيدًا، محسنة، متاحة على نطاق واسع، ومعروفة، مما يقلل تكاليف الصيانة ويحسن جودة الشيفرة.
- لا تعيد اختراع العجلة
- مصممة جيدًا ومحسنة
- متاحة ومعروفة على نطاق واسع
7. التزامن: دعم مدمج للتوازي
التزامن – تنفيذ عدة مهام في آن واحد – يُستخدم على نطاق واسع لتحسين الإنتاجية (باستخدام عدة معالجات لحساب واحد) أو لتحسين الاستجابة (بتمكين جزء من البرنامج من التقدم أثناء انتظار جزء آخر).
ميزة حديثة. تتضمن C++ دعمًا قويًا، محمولًا، وآمنًا من حيث النوع للبرمجة المتزامنة، لتلبية احتياجات الأجهزة متعددة النوى الحديثة. هذه إضافة مهمة في C++11.
- دعم مدمج
- محمول وآمن من حيث النوع
- يلبي متطلبات المعالجات متعددة النوى
الخيوط والمهام. توفر المكتبة إدارة منخفضة المستوى للخيوط (std::thread) وتجريدات مهام عالية المستوى (std::future, std::async). تشترك الخيوط في مساحة عنوان واحدة، مما يتطلب تزامنًا دقيقًا لتجنب تعارض البيانات.
std::threadللخيوط النظامية- مساحة عنوان مشتركة
- التزامن القائم على المهام (
std::async)
التزامن. تُوفر آليات مثل الأقفال (std::mutex) ومتغيرات الشرط (std::condition_variable) لإدارة الوصول إلى البيانات المشتركة ومزامنة الخيوط. تقدم العمليات الذرية تزامنًا دقيقًا وخاليًا من الأقفال للأنواع البسيطة.
- الأقفال والقفل
- متغيرات الشرط
- العمليات الذرية
- تجنب تعارض البيانات
8. إتقان الأنواع والمرافق الأساسية
لكل اسم ولكل تعبير نوع مرتبط به.
الأساسيات. فهم الأنواع المدمجة في C++ (int, double, char, bool)، كيفية إعلان المتغيرات، قواعد النطاق، وعبارات التحكم الأساسية (if, switch, for, while) هو أساس لا غنى عنه. هذه العناصر، الموروثة والمحسنة من C، تشكل قاعدة كل برامج C++.
- الأنواع المدمجة
- الإعلانات والنطاق
- عبارات التحكم
- التعبيرات والعوامل
أمان النوع. C++ لغة ذات نوع ثابت، مما يعني فحص الأنواع في وقت الترجمة. يساعد هذا في اكتشاف الأخطاء مبكرًا. ميزات مثل auto لاستنتاج النوع و constexpr للثوابت في وقت الترجمة تعزز الأمان والتعبير.
- فحص النوع الثابت
- اكتشاف الأخطاء مبكرًا
autoلاستنتاج النوعconstexprللثوابت
المؤشرات والمراجع. توفر C++ مؤشرات ومراجع للوصول غير المباشر إلى الذاكرة. رغم قوتها، تتطلب إدارة دقيقة، خاصة عند التعامل مع ملكية الموارد. تُفضل المؤشرات الذكية على المؤشرات الخام لإدارة الذاكرة.
- المؤشرات والمراجع
- الوصول غير المباشر للذاكرة
- المؤشرات الذكية للملكية
9. دمج أنماط البرمجة لحلول فعّالة
أفضل الحلول (الأكثر قابلية للصيانة، الأكثر قراءة، الأصغر، الأسرع، إلخ) لمعظم المشاكل المعقدة تميل إلى أن تكون تلك التي تجمع بين جوانب من هذه الأنماط.
التركيب لا الحصرية. صُممت C++ لدعم أنماط برمجة متعددة: الإجرائية، تجريد البيانات، البرمجة الكائنية، والبرمجة العامة. تتيح ميزات اللغة استخدام هذه الأنماط معًا، وغالبًا ما تجمع الحلول الفعالة تقنيات من عدة أنماط.
- البرمجة الإجرائية
- تجريد البيانات
- البرمجة الكائنية
- البرمجة العامة
تجنب العقائدية. التركيز الحصري على نمط واحد أو اعتبار C++ لغة "هجينة" فقط يغفل قوة تركيبها. توفر اللغة أدوات يمكن استخدامها بأناقة معًا لدعم مجموعة واسعة من التقنيات.
- اللغة تدعم التوليف
- تجنب التفكير الأحادي النمط
تصميم عملي. يتطلب البرمجة الفعالة في C++ اختيار الأدوات المناسبة (ميزات اللغة، مكونات المكتبة القياسية) من المجموعة المتاحة ودمجها بشكل ملائم للمشكلة المطروحة. هذا يتطلب فهم نقاط القوة والضعف لكل نهج وكيفية تفاعلها.
- اختيار الأدوات المناسبة
- دمج الميزات بفعالية
- التركيز على التصميم والتقنيات
10. معالجة الأخطاء: الاستثناءات والضمانات
توفر فكرة الاستثناءات وسيلة لنقل المعلومات من نقطة اكتشاف الخطأ إلى نقطة معالجته.
فصل الاهتمامات. توفر الاستثناءات (throw, catch) آلية لفصل الشيفرة التي تكشف الخطأ عن تلك التي تعالجه. هذا مفيد خصوصًا في البرامج والمكتبات الكبيرة حيث لا يعرف الكاشف كيفية التعافي، ولا يستطيع المعالج اكتشاف الخطأ بسهولة.
throwللإبلاغ عن الأخطاءcatchلمعالجة الأخطاء- فصل الكشف والمعالجة
أمان الاستثناءات. توفر المكتبة القياسية ضمانات حول حالة الكائنات عند رمي الاستثناءات. الضمان الأساسي يضمن الحفاظ على الثوابت وعدم تسرب الموارد. الضمان القوي يضمن نجاح العملية بالكامل أو عدم تأثيرها.
- الضمان الأساسي (لا تسرب، حالة صالحة)
- الضمان القوي (الكل أو لا شيء)
- محدد
noexcept
التكامل مع RAII. ترتبط معالجة الاستثناءات ارتباطًا وثيقًا مع RAII. يضمن هذا تحرير الموارد التي اكتسبتها الكائنات أثناء تفكيك المكدس عند انتشار الاستثناء، مما يمنع التسريبات ويبسط شيفرة التنظيف.
- RAII للتنظيف
- استدعاء المدمرات أثناء تفكيك المكدس
ملخص المراجعات
يُعتبر كتاب "لغة البرمجة C++" المرجع الأهم والأشمل في مجال لغة C++، وهو من تأليف مبتكر اللغة نفسها. يحظى الكتاب بإشادة واسعة لما يحتويه من تغطية شاملة ورؤى قيمة، إلا أن العديد من المراجعين يشيرون إلى أنه غير مناسب للمبتدئين. يوصف الكتاب بأنه كثيف المحتوى، وأحيانًا مطول، ويُفضل استخدامه كمرجع أكثر من كونه أداة تعليمية. يقدّر المبرمجون ذوو الخبرة عمقه وتفاصيله التقنية الدقيقة. بينما ينتقد البعض أسلوب الكتابة وتنظيم المحتوى، يرى آخرون أنه ضروري لإتقان لغة C++. بشكل عام، يُعتبر هذا الكتاب مورداً حيوياً للمحترفين، لكنه يمثل تحديًا لمن يشرعون في تعلم اللغة.
قرأ الآخرون أيضًا