لغة سي++
سي++ ) بالإنجليزية: ++C(
التصنيف متعددة النماذج، عمومية، شيئية المنحى،إجرائية، وظيفية
نظام التنميط تنميط سكوني، تنميط غير آمن
ظهرت في 1983
صممها بيارن ستروستروب
التطوير
:- المطور بيارن ستروستروب، مختبرات بل، ISO/IEC JTC1/SC22/WG21
آخر إصدارISO/IEC 14882:2011 )عام 2011(
التأثير
متأثرة بـ سي، سيميولا
أثرت في جافا، سي#، بي إتش بي، دي، بيرل، C99
سي++)تنطق:سي بلس بلس( ) بالإنجليزية: ++C( هي لغة برمجة كائنية ،متعددة الاستخدام، مصرفة، سكونية الأنماط. وتضم العديد من ميزات لغات البرمجة عالية المستوى ومنخفصة المستوى. بدأ تطوير هذه اللغة كامتداد للغة سي تحت اسم)سي مع الصفوف( من قبل بيارن ستروستروب في مختبرات بل عام 1979 وتم إضافة العديد من الميزات الأخرى وتغير الاسم عام 1983 ليصبح ++C من باب الدعابة عبر استخدام معامل الزيادة لجانب اسم لغة سي للتأكيد على أنها "التالي للغة سي".
تعتبر ++C إحدى اللغات الأكثر شيوعاً وقد استخدمت على نطاق واسع في بناء أنظمة التشغيل والتعامل مع البنية الصلبة للحاسوب ابتداءً من الأنظمة البرمجية وبرامج المستخدم، مروراً بمشغلات الأجهزة والأنظمة المضمنة وانتهاءً بالمخدمات عالية الأداء وبرامج التسلية كالألعاب الفيديوية نظراً لقدرة تصريفها إلى كود لغة تجميع شديد الفعالية. أحد أكثر استخدامات سي++
إثارةً للإعجاب حسب رأي ستروستروب هو في كتابة قسم كبير من أنظمة مركبة مارس روفر التي تجولت على كوكب المريخ عام 2008 يوجد العديد من المصرفات التجارية والمفتوحة المصدر لـ++C، من هذه المصرفات مشروع جنو، مصرفات إنتل، مصرفات مايكروسوفت، مصرفات استديو أوراكل سولاريس، مصرفات ديجيتال مارس، ومصرفات إيمباركاديرو تكنولوجيز. لقد أثرت لغة ++C بالعديد من لغات البرمجة الشائعة مثل سي شارب وجافا. في حين تستخدم لغات أخرى كلغة سي-الكائنية نحواًشديد الاختلاف ومقاربة مختلفة في إضافة الصفوف إلى سي.
بدأت ++C كتحسين للغة سي، أولاً عبر إضافة الصنوف، ومن ثم التوابع الظاهرية، تحميل المعاملات الحسابية، الوراثة المتعددة، القوالب، ومعالجة الاستئناءات بالإضافة إلى مجموعة من الميزات الأخرى. بعد سنوات من التطوير تم تصديق ++C عام 1998 كمعيار آيزوذو الاسم ISO/IEC 14882:1998. وفي عام 2003 تم تعديل المعيار وفقاً لوثيقةالتصحيح التقنية ISO/IEC 14882:2003. يتضمن المعيار الحالي ISO/IEC 14882:2011 مجموعة من الميزات التي تم الاتفاق عليها ونشرها كمعيار جديد من المنظمة الدولية للمعاييرفي أيلول 2011 والذي عُرف سابقاً باسم C++11.
التاريخ
بدأ بيارن ستروستروب العمل علىمشروعهC مع الصفوف)C with Classes( عام 1979، وقد استلهم فكرة هذا المشروع أثناء عمله على أطروحة الدكتوراه حيث قضى وقتاً طويلاً بالبرمجة. لقد اكتشف ستروستروب أن العديد من ميزات لغة Simulaملائمة في الحقيقة لتطوير برمجيات ضخمة إلا أن بطء أداء التطبيقات المكتوبة بهذه اللغة كان يحول دون استخدامها بشكل عملي، وفي الوقت نفسه كانت تتمتع اللغة BCPLبأداء جيد إلا أنها منخفضة المستوى وبالتالي يصعب استخدامها في تطوير برمجيات ضخمة، قاد هذا الاكتشاف ستروستروب إلى فكرة تطوير لغة برمجة جديدة تجمع المزايا الحسنة من هاتين اللغتين.
واجه ستروستروب لاحقاً مشكلة تحليل نواةنظام Unixفيما يتعلق بالحوسبة الموزعة خلال عمله في مختبرات بل وتذكر المعضلات التي واجته خلال عمله على أطروحته فعقد العزم على تحسين لغة Cبإضافة ميزات شبيهة بتلك الموجودة في لغة Simula. اختار ستروستروب لغة C لكونها لغة عمومية، سريعة، محمولة، وشائعةالاستخدام. لقد ألهمت ستروستروب-بالإضافة إلى C وSimula- عدد من اللغات الأخرى وهي ِALGOL68 وML وCLU وAda.
عمل ستروستروب على تطوير مصرف اسمه Cfront يقوم بتصريف كود++C إلى كود C مكافئ،وقد قام من خلاله بإضافة بعض الميزات الجديدة إلى لغة C متل الصنوف، الصنوف المشتقة، التنميط القوي ) بالإنجليزية: strong typing(، التضمين ) بالإنجليزية: inlining(، والقيم الافتراضية. تم طرح أول إصدار تجاري من ++C في 14 تشرين الأول 1985 ]3[.
في عام 1983 تم تغيير اسم اللغة من C with Classes إلى ++C )حيث أن ++ هو معامل الزيادة بلغة C( كما تم إضافة مجموعة من الميزات مثل التوابع الظاهرية، التحميل الزائد للمعاملات والتوابع، المراجع) بالإنجليزية: references(، الثوابت، التحكم بالذاكرة المدار من قبل المستخدم، تحقق محسن من الأنماط، والتعليقات السطرية باستخدام خطين مائلين )//( على نمط لغة BCPL. في عام 1985 نُشر الإصدار الأول من كتاب لغة البرمجة ++Cليزود المبرمجين بأحد أهم المراجع عن هذه اللغة في وقت لم توصّف فيه اللغة بعد كمعيار رسمي. عام 1989 نُشر الإصدار 2.0 من الكتاب وعام 1991 نٌشر الإصدار الثاني المحدث منه. اشتملت الميزات الجديدة على الوراثة المتعددة، الصنوف المجردة ) بالإنجليزية: abstract classes(، التوابع الأعضاء السكونية ) بالإنجليزية: static member functions(، التوابع الأعضاء الساكنة ) بالإنجليزية: const member functions(، والأعضاء المحمية. عام 1990 نُشردليل ++C المرجعي التفصيلي)The Annotated C++ Reference Manual( وكان حجر الأساس لمعيار اللغة المستقبلي. اشتملت الميزات اللاحقة على القوالب) بالإنجليزية: templates(، الاستثناءات، فضاءات الأسماء، تحويلات جديدة بين الأنماط، والنمط البولياني. المعايير
/معيار ++Cالاسم الشائع
2011ISO/IEC 14882:2011C++11
2007ISO/IEC TR 19768:2007C++TR1
2003ISO/IEC 14882:2003 C++03
1998ISO/IEC 14882:1998C++98
>قامت لجنة تعيير ++C )مجموعة عمل ISO/ IECJTC1/SC22/WG21( عام1998 بتعيير لغة ++C ونشرت المعيار ISO/IEC 14882:1998 )المعروف بشكل غير رسمي باسم C98(. بعد نشر المعيار ببعض السنوات تفحصت اللجنة تقارير عن أخطاء ومشاكل المعيار السابق ونشرت عام 2003 إصداراً مصححاً من معيار ++C اسمه ISO/IEC 14882:2003. نُشر تقرير تقني عام2005 اسمه )التقرير التقني 1 ) بالإنجليزية: Technical Report 1(، أواختصاراً TR1( . وصّف التقرير مجموعة من الامتدادات للمكتبة المعيارية -على الرغم من أنه ليس جزءاً من معيار اللغة- بحيث يتم اعتماد هذه الامتدادات في الإصدار التالي من ++C.
C++11 هو المراجعة الأحدث لمعيار ++C وقد عرف سابقاً باسم C++0x وتمت المصادقة عليه من قبل ISO/ IECفي 12 آب 2011 ]4[ونشر باسم 14882:2011 ]5[. وهنالك خطط لمراجعة طفيفة )C++14( وأخرى رئيسية )C++17( في المستقبل
فلسفة اللغة
في كتاب "تصميم وتطوير لغة ++C")ستروستروب، 1994( يصف بيارن ستروستروب بعض القواعد التي استلهم منها تصميم ++C:
*.صُممت ++C كلغة عمومية، سكونية التنميط وتتمتع بفعالية ومحمولية لغة C
*.صُممت ++C لتدعم بشكل مباشر وغني عدة أنماط برمجية )برمجةإجرائية، تجريد البيانات، البرمجة الكائنية والبرمجة العامة(
*.صُممت ++C لتتيح للمبرمج حرية الخيار حتى وإن كان اختيار المبرمج غير صحيح
*.صُممت ++C بحيث تتوافق مع لغة C قدر الإمكان لتوفر بالتالي انتقالاً سلساً إليها لدى الحاجة
*.تتجنب ++C الميزات الخاصة بمنصة محددة فقط وغير عمومية
*.لا تحمّل ++C البرمجيات المكتوبة أعباء ميزات اللغة في حال عدم استخدامها )مبدأ العبء المعدوم(
*.صممت لغة ++C كي تعمل بدون وجود بيئات تطوير معقدة
في كتاب "النموذج الكائني للغة ++C" )ليبمان، 1996( يشرح الكاتب إمكانية تحويل مصرفات++C العبارات البرمجية إلى توضعات داخل الذاكرة. إلا أن هذا لا يمنع بالطبع مصممي المصرفات من اعتماد طرقهم الخاصة في كتابة مصرفات متوافقة مع المعيار المرجعي ++C. الجديد في اللغة
الإضافة الأهم التي أتت بها السي++عن السي هي بشكل أساسي البرمجة بالكائنات)POO(، حيث تعتمدالسي على البرمجة الإجرائية والتي كانت كافية في وقتها. إلا أن ظهورأنظمة التشغيل ذات الواجهة الرسومية، وزيادة التعقيد والأخطاء وخاصة مع تداخل الوظائف البرمجيةوكبر حجم الملف المصدري،نقل العديد من المبرمجين إلى البرمجة بالكائنات. كما أن أحد أهم خصائصها دعمهاللبرمجة العامة.
بما أن السي++ تطوير للسي، فالبرمجة فيها تبدو قريبة إلى السي إذا لم تستخدم فيها البرمجةالكائنية. وبطبيعة الحال، شمل تطوير السي++ بعض التعديلات على كتابة البرنامج. فمثلاً هذا برنامج يطبع عبارة "Hello World"، ومن ثم يغلق.
#include<iostream>usingnamespace std;int main(){cout<<"Hello World!"<< endl;return0;}
فنلاحظ أن لم يعد يلحق بعد المكتبةالامتداد.h، كما أنها ضمت مكتبات أخرى عدة. فمكتبةiostreamلم تكن موجود في السي، كما يظهر بوضوح تقنيةالحقل المصرح) بالإنكليزية:Declarative Region) باستخدام الـnamespace، حيث يجعل المتغيرات والوظائف موجودة في مكان مخصص من الملفات المصدرية، وليست مصرحًا بشكل عام داخل الملف المصدري، مما يقلل عدد الأخطاء ويسمح بتسمية المتغيرات والوظائف والكائنات بنفس الاسم، واستخدامها حسب الحاجة عن طريق الكلمة المفتاحيةusing. مع أن بعض المصرفات تتجاهلها، إلا أن سي++ المعياري يوجب جعل وظيفة الـmainترجع متغيرًا من نوع عدد صحيح، ولذلك يتوجب إرجاعreturn 0إليها. كماأن التطوير يتضمن العديد من التعديلات الطفيفة على خصائص السي الموروثة، لكن التطويرات الأهم، يظل الجديد الذي جاءت به السي++.
مضاعفة الوظائف
جاءت السي++ بهذه الميزة التي تسمح بكتابة وظيفتين تحملان الاسم نفسه تسهيلاً للمبرمج وتقليلاً لعدد الأخطاء. فمثلاً، إن كان المبرمج قد كتب وظيفة تعمل على ضرب عددين صحيحين وترجع الناتج، فإنه يستطيع أن يكتب وظيفة أخرى تحمل الاسم نفسه ولكنها تستقبل نوعًا آخر من البيانات. هذه الميزة تسهل على المبرمج العمل وتقلل الأخطاء، فهولا يحتاج لتسمية ثلاث وظائف عملها واحد لكنها تستقبل نوعًا مختلفًا من البيانات، بل يسمي ثلاثتها بفس الاسم، والمصرف بعدها يختار المناسبة طبقًا لنوع البيانات المدخلة. يجدر بالذكر أنه يمكن أن تضعف وظيفة إذا كانت تستقبل بيانات مختلفة، أو تستقبل عددًا مختلفًا من المتغيرات، والمثال التالي يوضح مضاعفة الوظائف.
#include <iostream>usingnamespace std;int multiply(int x, int y){// الوظيفة الأولىreturn x*y;}double multiply(double x, double y){// الوظيفة الأخرىreturn x*y;}int main(){int A =10, B =2;double Y =11.5, Z =2.5;cout<<multiply(A,B)<<"
";// سيستخدم تلقيائيا الوظيفة الأولى لأن المتغيرات المدخلة من نوع عدد صحيح وتكون النتيجة 10*2 = 20cout<<multiply(Y,Z)<<"
";//وتكون النتيجة 11.5*2.5 = 28.75double سيستخدم تلقيائيا الوظيفة الأخرى لأن المتغيرات المدخلة أعداد من نوعreturn0;}
العمليات في السي++
السي++ يوفر أكثر من 35 عملية، وتغطي العمليات الحسابية الأساسية، والمقارنات، والعمليات المنطقية وغيرها. يمكن أن تكون متزايدة لمحددات نوع البيانات، مع استثناءات قليلة مثل ). و*.( فضلا عن الرمز الثلاثي وهذه الرموز أيضا جزءا أساسيا من العديد من تقنيات البرمجة السي++ ، مثل مؤشرات الذكية.التزايد لا يغيير أسبقية العمليات الحسابية التي تنطوي على الرموز، ولا يغير من عدد المعاملات التي تستخدم الرموز )أي المعامل ولكن قد لا يمكن تجاهلها من قبل الرمز، على الرغم من أنه سيتم تقييمها قبل التنفيذ(. الرموز المتزايدة "& &"و "| |" تفقد خاصية التقييم قصير المدى.
الحقل المصرح
هذه الخاصية تسمح بوضع مجموعة من الأكواد تحت اسم معين لا يمكن استعمالها إلا إذا ما صرحت ظاهرًا. ولكن أحد الانتقادات لهذه الخاصية، مع أنها ساعدت ترتيب الأكواد وتحكما أفضل مما كان عليه في السي، إلا أن أحد الانتقادات الموجهة لها أنه ليس من كلمة محجوزة توقف عمل الـusing، كما يظهر في المثال التالي.
#include <iostream>usingnamespace std;namespace Square {height =1;width =1;}namespace Rectangular {height =1;width =2;}int returnArea(int x, int y){return x*y;}int main(){cout<<"Square area is: ";usingnamespace Square;cout<<returnArea(height, width)<<".";cout<<"
Rectangular area is:";usingnamespace Rectangular;cout<<returnArea(height, width)<<".";return0;}
السي والسي++
*.وفقاً لمواصفات سي++، فإنها تدعم لغة سي بشكل كامل )دعم رجعي(. وتقنيًا يمكن لمعظم الملفات المصدرية السي أن تُصرف بمصرفات سي++، ولهذا تسمى هذه المصرفات بمصرفات سي/سي++. إلا أن الأمر لا يخلو من بعض المشاكل غير المتوقعة.
*.استخدام الرمز // لتضمين الملاحظات بطول سطر واحد والتي يتم تجاهلها من قبل المترجم عند القيام بعملية الترجمة.
سبب صعوبتها
:ربما تعود أسباب صعوبة لغتي السي والسي++ لأسباب تاريخية أكثر منها واقعية وهو ما يردده المبرمجين المعتادين على استخدام السي++ وهذا يعود بنا إلى أصل لغة السي وهي لغة السي بي ال CPL والتي اشتهرت بشدة تعقيدها مما تسبب في ابتعاد المبرمجين عنها فتم تطويرها وتبسيطها إلى لغة سميت BCPL ولم تلقى الكثير من النجاح ولكنها تطورت إلى لغةالبى B وعندما أرادو تطويرها سموها سي)وهذا هو أصل تسمية السي(، وبالطبع ورثت السي++ خصائص لغة سي.
إلا أنه لا يمكن إنكار أن مفاهيم مثل المؤشراتpointers، والإشارات هي مفاهيم مربكة للمبرمج المبتدئ، بالإضافة إلى مفاهيم التوارثInheritanceوتعدد الشكلpolymorphismوالقوالبTemplates التي تربك حتى المبرمجين المحترفين. وكذلك لا تقدم سي++ الحماية الكافية للمبرمج كي لا يقع في أخطاء التشغيل التي قد تتسبب في توقف الحاسوب عن العمل. كيف؟
في لغة الفيجوال بيسك مثلا عندما تحدد مصفوفة بحجم 20 عنصرا مثلا كالأتي :
Dim A)20( As Integer
ثم تحاول معالجة العنصر رقم 21 مثلا فسوف يبادرك محرك الفيجوال بيسك برسالة خطأ ويتوقف برنامجك.
أما في السي والسي ++ فاذا عرفت مصفوفة بنفس الحجم : int a]20[ // integer a from 0-19 not from 0-20
وعندما تحاول الوصول إلى العنصررقم واحد وعشرين مثلا تكون قد تعديت حدود المصفوفة إلى جزء من الذاكرة ربما تكون مخصصة لبرنامج أخر أو معلومات حساسة لنظام التشغيل وهذا يؤدي إلى إعطائك قيمة لم تكن لتحصل عليها. و المشكلة الأخرى التي تربك الكثيرين أن أول عنصر بالمصفوفة هو 0 وليس 1 وحجمها 20 أى أن العنصر الأخير هو 19 وليس 20 مثل البيسك والباسكال.
التطور المستقبلي
لا تزال لغة سي++ تواصل تطورها. فهناك نسخة جديدة من سي++ قيد التطوير سميت مبدئيًا بـ C++0x )تنطق سي بلس بلس أُوْهْ إكس( ، وقد صدرت في مارس 2009، يشير العمل الحالي بأنّ سي++ سيواصل الاستفادة من طبيعته متعددة المثال. boostمجموعة تعمل للاستفادة إلى أبعد الحدود من سي++ في شكله الحالي. هم يتوسّعون كثيرا في سي++ من حيث الوظيفية والقدرات وينصحون أيضا لجنة معايير سي++ التي تعمل فيها الميزّات حسنا والتي تحتاج التحسين.
عدد الزوار Users On: http://URL SITUSMU">Online: 1 1ec2-3-138-135-4.us-east-2.compute.amazonaws.comMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) موقع علي هاشم الثاني