علوم البرمجة

مدخل إلى لغة سي بلس بلس C++ Intro

مدخل: لماذا سي بلس بلس؟

يوجد ضمن عالم البرمجة العديد من اللغات المستخدمة لأغراضٍ متنوعة، مثل إنشاء صفحات الويب، إدارة قواعد البيانات، إدارة مخدمات البيانات، تطوير تطبيقات الهواتف الذكية، تحليل البيانات وتطوير برمجيات الذكاء الاصطناعي. عند العودة لمعظم هذه التطبيقات، سنُلاحظ أنها تعتمد على لغاتٍ مثل PHP أو جافا أو بايثون أو SQL، وهنا قد يطرح أحدهم السؤال: لماذا إذاً لا زلنا نسمع بلغة سي بلس بلس؟ من يقوم باستخدامها؟

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

ما هي سي بلس بلس؟

سي بلس بلس عبارة عن لغة برمجة عامة التوجه General Purpose وقابلة للاستخدام على منصاتٍ حاسوبية مختلفة Cross-Platform كما أنها من لغات البرمجة متعددة النماذج Multi-Paradigm وذلك بسبب اشتمالها على خصائص وميزات تجعلها قادرة على دعم العديد من نماذج البرمجة، مثل نموذج البرمجة الإجرائية ونموذج البرمجة كائنية التوجه ونموذج البرمجة الوظيفية.

سي بلس بلس لغة مترجمة؛ هذا يعني أن هنالك مُترجم Compiler يقوم بمسح النص البرمجيّ بالكامل والتأكد من خلوه من أي أخطاء قواعدية أو منطقية، ومن ثم يتم توليد الملفات الكائنية Object-Files التي يستخدمها الواصل Linker ويربطها مع ملفاتٍ أخرى (مثل المكتبة المعيارية) من أجل توليد الملف التنفيذيّ Executable File الذي يستخدمه المعالج من أجل تنفيذ البرنامج المطلوب.

تطور سي بلس بلس: لغة سي، ولكن بميزات إضافية

ظهرت لغة سي بلس بلس في بداية الأمر كتوسعة على لغة سي على يد المُطوّر السويدي بيارن ستروستروب Bjarne Stroustrup وذلك في بداية ثمانينات القرن الماضي، وحملت في البداية اسم “سي مع الصفوف C with Classes” إذ أن الاختلاف الجوهريّ بين سي بلس بلس وسي هو دعم سي بلس بلس نموذج البرمجة كائنية التوجه، والذي يعني إمكانية إنشاء “كائنات Objects” عبر استخدام نمط مُعطيات جديد هو “الصفوف Classes“.

بيارني ستروستروب، مطوّر لغة سي بلس بلس. حقوق ملكية الصورة: جامعة كولومبيا

تُشبه الصفوف في سي بلس بلس البُنى Structures في سي، والفرق الأساسيّ هو إمكانية إنشاء توابع كأعضاء تنتمي للصفوف بخلاف البنى التي لا يمكنها أن تشتمل على توابع كأعضاء. بالإضافة إلى ذلك، تُتيح الصفوف إمكانية تحديد قابلية الوصول لأعضائها؛ يمكن أن تكون الأعضاء عامة Public بحيث يمكن استخدامها في البرنامج من قبل الإجرائيات الأخرى بدون قيود، ويمكن أن تكون الأعضاء خاصة Private بحيث لا يمكن الوصول لها إلا من قبل أعضاء تنتمي لنفس الصف، ويمكن لها أن تكون محمية Protected بحيث يمكن الوصول لها من صفٍ آخر يُدعى الصف المشتق، وهذا النوع من العلاقات يُدعى بالوراثة Inheritance الذي يعتبر من السمات الأساسية للبرمجة كائنية التوجه. أخيراً، تتيح الصفوف – والبرمجة كائنية التوجه بشكلٍ عام – ميزاتٍ أخرى مثل تعدد الأشكال Polymorphism وأشهر الأمثلة عليها هو التحميل الزائد للعمليات، بمعنى إمكانية إعادة تعريف معامل رياضي ما (مثل عملية الجمع) ليصبح قادراً على إنجاز عملياتٍ معينة ليس فقط على الأرقام والمعطيات العددية، وإنما أيضاً على الكائنات والأعضاء التابعة لها.

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

إصدارات سي بلس بلس C++ Versions

تُعتبر لغة سي بلس بلس لغةً معيارية Standarized؛ هذا يعني أنها تمتلك مرجعاً موثقاً يتم تنظيمه والإشراف عليه من قبل المنظمة العالمية للمعايير ISO، وكل إصدار من إصدارات لغة سي بلس بلس يمتلك رقماً مرجعياً من إصدارات ISO. من الإصدارات الكلاسيكية للغة سي بلس بلس المعيار C++98، ومن الإصدارات الشهيرة جداً C++11 الذي جلب معه العديد من الميزات وأنماط المعطيات الجديدة، مثل المعامل “auto” ودعم تعدد مسارات المعالجة Multithreading وتوابع لامبدا والمؤشر الصفري nullptr وغيرها من الخصائص. أحدث إصدارات اللغة هو المعيار C++17، ومن المنتظر أن يتم الكشف هذا العام عن معيار C++20.

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

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

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

مثال بسيط: حساب مربع الأعداد

من أجل فهم آلية عمل سي بلس بلس على نحوٍ أفضل، سيكون من الجيد أخذ مثال بسيط حول برنامج يقوم بحساب مربع الأعداد من 1 وحتى 10 وطباعتها على الشاشة. من أجل هكذا تطبيق سنحتاج إلى تضمين البرنامج بمكتبة الإدخال والإخراج الأساسية في لغة سي بلس بلس وهي iostream ومن ثم يمكن تعريف حلقة تكرارية بسيطة، بحيث يكون مجال متحول الحلقة من 1 وحتى 10، وضمن الحلقة التكرارية نقوم بضرب متحول الحلقة بنفسه، وعند التنفيذ التالي للحلقة يتم زيادة قيمة المتحول بمقدار 1. البرنامج المطلوب يأخذ الشكل التالي:

#include <iostream> 

int main()
{
for (unsigned int index = 1; index <= 10; index = index +1)
{
std::cout << "the square value of " << index << "is : " << index*index << std::endl; 
}

return 0;
}

عند تنفيذ الكود السابق سنحصل على الخرج التالي:

The square value of 1 is : 1
 The square value of 2 is : 4
 The square value of 3 is : 9
 The square value of 4 is : 16
 The square value of 5 is : 25
 The square value of 6 is : 36
 The square value of 7 is : 49
 The square value of 8 is : 64
 The square value of 9 is : 81
 The square value of 10 is : 100

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

#include <iostream>
 class CCalculator
 {
     private: 
         unsigned int m_uiMyNumber; 
     public: 
         CCalculator(); 
         void CalculateSquareNumber(); 
         ~CCalculator(); 
 };
 CCalculator::CCalculator()
 {
     this->m_uiMyNumber = 1; 
 }
 void CCalculator::CalculateSquareNumber()
 {
     for (unsigned int index = 0; index < 10; index = index + 1)      {         std::cout << "The square value of " << this->m_uiMyNumber << " is : " << this->m_uiMyNumber * this->m_uiMyNumber; 
         std::cout << std::endl;          this->m_uiMyNumber = this->m_uiMyNumber + 1; 
     }
 return; 
 }
 CCalculator::~CCalculator()
 {
     return;
 }
 int main()
 {
     CCalculator objMyCalculator;
     objMyCalculator.CalculateSquareNumber();
 return 0;
 }

عند تنفيذ البرنامج السابق (باستخدام بيئة تطوير مثل Eclipse أو مباشرةً من محرر الأوامر cmd عبر استدعاء المترجم) سيؤدي للحصول على نفس الخرج السابق. كملاحظات سريعة، سنجد أن البرنامج أصبح أطول وأعقد بعض الشيء بالمقارنة مع البرنامج الأول، ولكنه يعطينا أيضاً ميزات أفضل: إذا أردنا إضافة تابع يقوم حساب مكعب الأعداد، كل ما علينا القيام به هو التصريح عن عضو جديد للصف CCalculator. في الواقع، يمكن تنفيذ أي عملية حسابية تخطر على البال عبر إضافة عضو جديد للصف CCalculator يقوم بهذه العملية الحسابية.

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

استخدامات سي بلس بلس

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

تستخدم سي بلس بلس أيضاً في مجال برمجة الأنظمة المضمنة والعتاد حيث يمكن برمجة المتحكمات الصغرية باستخدام سي بلس بلس، كما أنها – إلى جانب سي – من اللغات المستخدمة بكثرة في مجال إنترنت الأشياء، وهي وبسبب الخصائص التي تمتكلها من ناحية إدارة الذواكر فإنها تعتبر اليوم من اللغات “منخفضة المستوى” ولذلك فإن مترجمات العديد من لغات البرمجة الأخرى مكتوبة باستخدام سي بلس بلس.

بالإضافة للمجالات السابقة، تعتبر سي بلس بلس من اللغات الهامة أيضاً في مجال معالجة الصورة وبرمجيات الإبصار الحاسوبي Computer Vision ولذلك فهي تُستخدم أيضاً في مجال برمجة الألعاب وبرمجيات الذكاء الاصطناعيّ وتعلم الآلة.

يُوّفر بيارن ستروستروب (مطوّر سي بلس بلس) على موقعه الشخصيّ قائمةً طويلة للخدمات والتطبيقات التي تعتمد كلياً أو جزئياً على لغة سي بلس بلس، (ذكر بيارن ستروستروب بشكلٍ صريح أنه لم يتحقق من هذه التطبيقات بشكلٍ كامل ولم يقم بالاطلاع الشيفرة المصدرية الخاصة بها). للاطلاع على القائمة: اضغط هنا.

ملخص Summary

  • سي بلس بلس إحدى أشهر لغات البرمجة في وقتنا الحاليّ، وهي لغة عامة، كائنية التوجه، متعددة النماذج
  • سي بلس بلس متوافقة مع لغة سي في العديد من الخصائص والأمور؛ الاختلاف الأساسيّ هو بقدرة سي بلس بلس على دعم نموذج البرمجة كائنية التوجه الذي لا تدعمه سي
  • تعتبر سي بلس بلس لغةً منخفضة المستوى، بمعنى أنها توّفر قدرات تحكم مباشر بالعتاد والذواكر، ولذلك فهي من اللغات المستخدمة بشكلٍ مكثف في برمجة أنظمة التشغيل وبرامجها، مترجمات لغات البرمجة الأخرى، برمجة الأنظمة المضمنة وإنترنت الأشياء

مقالات ذات صلة

زر الذهاب إلى الأعلى