مقارنة بين لغة C ولغة ++C
- التفاصيل
- الزيارات: 23930
يوجد اختلاف ليس بكبير بين اللغتين , مثلا :
1- في الحجز الديناميكي , في لغة سي نستخدم الدوال malloc and free , اما في سي ++ نستخدم new and delete
2- في تعريف المتغيرات , في سي كنا نعرف المتغيرات في بداية البرنامج , اما في سي ++ نقوم بتعريف المتغيرات متى مااحتجنا لها في اي مكان بالبرنامج .
3- عند التصريح عن المتغيرات من نوع struct او enum , كنا نعيد كتابة الكلمة في السي قبل تعريف المتغيرات
مثل
struct STRUCT_NAME a,b;
أما فى ال++C نكتفي ب
STRUCT_NAME a,b;
4- Reference , في سي ++ int &Ref=Vir , ايضا السماح بتعديل المتغيرات , في سي بواسطة المؤشرات
5- اوامر الادخال والاخراج ,في سي printf & scanf في سي ++ cout & cin
6- دوال التعامل مع الملفات .
7- التعليقات في سي كنا نستخدم /* */ في سي ++ نستخدم //
بالاضافة طبعا لـ Classes
إضافة لذلك, فاللغتان لغتان مختلفتان, و الشبه بينهما يرجع لأسباب تاريخية, و السبب الرئيسي هو تأثر لغة ++C بلغة C, كما تأثرت عشرات اللغات المستخدمة حالياً في عالم البرمجة و التطوير, لكن ما يميز لغة ++C هو أنها لم تكتفي باتباع نهج لغة C في الـ Syntax و لكنها أكملت مسيرة و مفهوم لغة C, هناك فروق عديدة, فمن ناحية لغة ++C تعتبر ذات أنواع قوية يتم التحقق من العمليات فيما بينها وقت الترجمة كمعظم اللغات الأخرى كـ Java بينما لغة C هي لغة حرة, أي أنها تسمح بكل شيء, و ما يكتبه المبرمج هو ما يحصل بعبارة أخرى, إضافة إلى ذلك, فإن لغة C هي لغة Procedural أو لغة إجرائية, و هذا النوع هو السهل الممتنع في عالم البرمجة, بينما لغة ++C لا تتبع منهجاً معيناً و لكنها توفر للمبرمج أدوات عدة مناهج يمكن اتباعها, فمثلاً يمكنك اتباع طريقة الـ C و هذا ما يحصل مع المبرمجين الجدد في العادة, إضافة إلى ذلك فإنها توفر البرمجة الكائنية, و الـ Generic Programming و كل منهج له أدواته و عدته في ++C و اختر ما يحلو لك, لغة ++C ليست لغة كائنية المنحى OOP و لكنها توفر امكانية تطبيق هذا المنهج,
إضافة إلى ذلك و هو الأهم, ما الهدف الذي أنشأت لأجله اللغتان ؟
مثلاً لغة Java هي لغة موجهة في الغالب للـ Portable Applications و لذلك تشتهر في عالم الشبكات كما أعتقد,
لغة C تعتبر لغة برمجة عامة جداً أي أنها ليست موجهة نحو تطبيق معين في عالم البرمجة و لكنها لغة Very General و في منتصف الطريق بين اللغات عالية المستوى و اللغات منخفضة المستوى,
لغة ++C ليست عامة جداً كما هو الحال في لغة C, و لكنا صممت لحل مدى واسع من المسائل البرمجية, بالطبع هناك غمار لا تخوضها ++C و تستخدم C في برمجتها في الغالب,
فالفرق في كيفية حجز الذاكرة بين اللغتين يمكن أن يوضح هذا المفهوم, في C ليس هناك في اللغة نفسها ما لا يمكن تطبيقه دون وجود مكتبات أو وظائف عالية المستوى, أي أن ما تحتاجه لتشغيل برامج لغة C هو معالج و ذاكرة فقط و بالنسبة لـ ++C فيمكن تطبيق هذا الأمر إذا لم نستخدم بعض الطرق التي توفرها اللغة في لبها, أن ننتج برنامجاً يعمل كما تعمل برامج لغة C, و مثال ذلك هو الاستغناء عن طريقة حجز الذاكرة في ++C الذي يعتبر من أصل اللغة و لكنه يعتمد على مكتبات خارجية,
بالطبع معظم المقارنات بين اللغتين على الويب, هي غالباً حول الفرق في أداء اللغتين لأداء نفس المهمة,
بالطبع هذه المقارنات ليست صحيحة دائماً لأنها لم تبنى على أساس علمي في بعضها,
لغة C بطبعها لغة متوسطة المستوى (أو فى بعض الاحيان تصنف لغة منخفضة المستوي ), و بالتالي فهي قريبة من المعالج و الذاكرة و سريعة جداً,
و لكن في لغة ++C زيادة الأداء يكون بطرق أكثر أماناً و تعطي تلك الطرق كفاءة تفوق كفاءة C في أحيان عدة,
كـ Inlining و الـ MetaProgramming و الـ Templates و اللذان يعتبران أدوات الـ Generic Programming في لغة ++C,
لن يسعني طبعا الحديث عن هذه الميزات كلها , أعتقد أن Google كفيل بذلك,
عموماً الناحية الوحيدة, التي ينتقدها مناصرو C هي الكائنات في لغة ++C, بالطبع لا تنسى أن برامج عملاقة كتبت بـ ++C كـ Office و غيره, و باستخدام البرمجة الكائنية على ما أعتقد.
الآن لماذا يحدث هذا البطئ المنشود عند استخدام OOP في لغة ++C هذا يمكن أن يكون مقالاً بحاله, رأيت اجابة بعض الاخوة عن المقارنة بين C و++C وجذبني بعض الردود وحبيت انقلها واعلق عليها :
1- بتقدر تقول نفس اللغة إلا أن سي لا تدعم ما يسمّى بالفئات Classes والكائنات objects في حين تدعمها السي++... وسي++ تحوي كل أوامر سي ومضاف اليها أشياء جديدة..
الرد :
معذرة اخى الكريم صاحب الرد السابق المقتبس ولكن السى تختلف تماماً عن السى بلس بلس, ولغة السى بلس بلس لا تحتوى السى, كل لغة منفصلة بذاتها ولا علاقة لها باللغة الاخرى.
لاحظ انه بنفس المنطق استطيع ان ادعي ان لغة السى هى تطوير للغة الاسمبلى لانك بمترجم لغة السى تستطيع ان تقوم تقريباً بكل ما تقوم به بلغة الاسمبلي, السؤال هو هل لغة السى هى لغة اسمبلي معى بعض الاضافات؟ بالتاكيد لا.
كذلك لغة السى بلس بلس لا تعتبر هى لغة السى معى بعض الاضافات..
لغة السى بلس بلس لها فلسفة مختلفة تماماً عن لغة السى فى تعتمد بشل كامل على الclasses والTemplets والoverload والinharitens الخ ..
بينما لغة السى فهى لغة تسمى procedural language وتعتمد على إنشاء الدوال ..
وكما انك تستطيع دمج لغة الاسمبلى معى لغة السى او السى بلس بلس, ايضاً تستطيع دمج لغة السى بلس بلس معى لغة السى, مثل بسيط:
فى لغة السى نستخدم الدالة printf للطباعة, نفس الدالة تستطيع ان تستخدمها معى لغة السى بلس بلس, ولكنك بذلك تكسر قاعدة من قواعد اللغة لان الدالة printf لا تستطيع عمل overload لها,ولذلك يجب عليك ان تستخدم الدالة cout لانها جزء من لغة السى بلس بلس.
ايضاً لغة السى بلس بلس تستخدم فى المشاريع الضخمة لانها لغة ذات مستوى اعلى من لغة السى ويمكن عمل هيكلة لمشروع بشكل افضل ينقلك من التعامل معى الهاردوير إلى مرحلة تتعامل فيها معى اشياء نظرية سهلة