Programming in C++ · دروس في لغات البرمجة

الفرق بين لغة سي ولغة سي بلس بلس


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

c-plus-plus-shares-most-of-c

بداية لا بد من ذكر الحقيقة التاريخية وهي ان لغة سي (C) هي الاصل وهي اللغة الاقدم والتي اشتقت منها لغة سي بلس بلس (C++) بعد مدة والتي كانت تسمى (C with additions) اي انها لغة سي مع الاضافات ثم تغير الاسم الى (C++) وكما هو معروف فأن (++)=(additions) 🙂 .

الفرق الرئيسي بين اللغتين هو ان لغة سي لغة اجرائية (procedural) لا تدعم الكلاسات (classes) ولا الكائنات (objects) بينما لغة سي بلس بلس هي تركيب من لغة برمجة اجرائية ولغة برمجة موجهة نحو الهدف (او كائنية التوجه كما يحلو للبعض ان يسميها) (procedural and object oriented programming language) ولذا يمكن تسمية لغة سي بلس بلس بأنها لغة هجينة (hybrid) والجدول التالي يبين الفروقات بين اللغتين بالتفصيل:

ملاحظة: هذه الفروقات فقط مما يعني ان كل شيء اخر متشابه ومن هنا شاعت الدورات والكورسات التي تتعامل مع اللغتين كأنهما شيء واحد (C/C++):

لغة سي لغة سي بلس بلس
تم تطويرها من قبل دينس ريتشي بين عامي 1969-1973 في مختبرات بيل في شركة (AT&T bell labs). تم تطويرها من قبل بيرني ستروسترب عام 1979 بأسم سي مع الكلاسات (C with classes).
لغة سي هي جزء من لغة سي بلس بلس اي ان كل امكانياتها موجودة في لغة سي بلس بلس ولكن العكس ليس صحيح لغة سي بلس بلس هي المجموعة الكبيرة (superset) التي تحتوي لغة سي كجزء منها.
لغة سي تدعم البرمجة الاجرائية (procedural programming) في تطوير الكودات البرمجية. لغة سي بلس بلس تدعم كل من البرمجة الاجرائية والبرمجة الموجهة نحو الهدف (object oriented programming) ولذلك تسمى لغة هجينة كما ذكرنا سابقاً.
لغة سي لا تدعم البرمجة الموجهة نحو الهدف ولذلك فهي لا تدعم بالنتيجة كل من تعدد الاشكال (polymorphism) والوراثة (inheritance) والكبسلة (encapsulation) لغة سي بلس بلس تدعم كل هذه الامور 🙂

 

في لغة سي فأن البيانات والدوال تكون منفصلة ومستقلة عن بعضها البعض في لغة سي بلس بلس فأن البيانات والدوال تكون مجموعة (Encapsulated) في كائنات (objects) والتي لتوليدها نحتاج الى كلاسات لتعريفها وتوفير هيكلها (blueprint).
البيانات في لغة سي هي عبارة عن وحدات مستقلة يمكن التعديل عليها من قبل اي كود خارجي لأن هذه اللغة لا تدعم اخفاء البيانات (information hiding) في لغة سي بلس بلس فأن الكبسلة تخفي البيانات مما يضمن ان هياكل البيانات والعمليات يتم استخدامها كما هو مطلوب فقط (دون السماح لكودات خارجية بأستخدام البيانات المخفية).
من مواصفات لغة سي انها تركز على الدوال (function driven) من مواصفات هذه اللغة (C++) انها تركز على الكائنات اي انها (object driven).
لا تدعم هذه اللغة ما يسمى التحميل المضاعف (overloading) لكل من الدوال والعمليات. تدعم التحميل المضاعف للدوال والعمليات.
لا تسمح هذه اللغة بتعريف الدوال داخل الهياكل (structures). تسمح لغة سي بلس بلس بتعريف واستخدام الدوال داخل الهياكل.
لا تدعم لغة سي خاصية حيز الاسماء* (namespace feature) تستخدم لغة سي بلس بلس حيز الاسماء لتجنب التضارب في الاسماء.
تستخدم لغة سي دوال مثل (printf, scanf) للأدخال والاخراج وتستدعي المكتبة الرأسية (stdio.h) التي تحتوي هذه الدوال. تستخدم لغة سي بلس بلس كائنات (objects) للأدخال والاخراج مثل (cin, cout) والموجودة ضمن المكتبة الرأسية (iostream).
لا تدعم هذه اللغة المتغيرات المرجعية (reference variables). تدعم لغة سي بلس بلس المتغيرات المرجعية.
لا تدعم لغة سي الدوال الافتراضية (virtual functions) والدوال الصديقة (friend functions) تدعم لغة سي بلس بلس كل من الدوال الافتراضية والدوال الصديقة.
توفر لغة سي دوال (malloc (), calloc()) لتخصيص الذاكرة ديناميكياً ودالة (free()) لأعادة تخصيص (تحرير) الذاكرة . توفر لغة سي بلس بلس عملية (new) لتخصيص الذاكرة وعملية (delete) لأعادة تخصيص الذاكرة (تحريرها).
لا توفر دعم مباشر للتعامل مع الاخطاء او ما يسمى ادارة الاستثناءات (exception handling). توفر هذه اللغة دعم لأدارة الاستثناءت. والاستثناءات في هذه اللغة تستخدم للأخطاء الصعبة التي تجعل الكود وتنفيذه غير صحيح.

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

1

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

2 thoughts on “الفرق بين لغة سي ولغة سي بلس بلس

  1. السلام عليكم ..اتمنى تعطوني افكار بسيطه مثل منظومة أسئله ومنظومة مدرسه ..لأن الدكتور طلب منا أفكار انطبقوهم وانا نبي أي فكرة باش انحاول فيها

    إعجاب

    1. وعليكم السلام
      في هذا الموقع تبويب كامل للغة برمجة سي بلس بلس وفيه اكثر من 50 منشور تحتوي كلها على افكار وان شاء الله تفيدكم

      إعجاب

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s