الجافا السي والباسكال
الموضوع مأخوذ عن موقع ماركو كانتيو وهو بالانجليزية بامكانك قراءة المصدر الانجليزي من الرابط التالي
http://www.marcocantu.com/papers/ooplang.htm
اتمنى أن تعذروني على الأخطاء اللغوية ان صادفتموها لا تترددوا بالتنقيح
كما اود الاشارة لأني لا اتقن سوى الدلفي من بين هذه اللغات الثلاثة فاذا وقعت في الفهم الخاطئ فاني على امل ان تصححوا لي هذا الفهم
واخيرا على طول المقال غلا انه مختصر جدأ. و اتوسم بكم الخير باضافة المزيد من التوضيح على هذه النقاط الكثيرة لتصبح هذه المشاركة مرجع لكل راغب بالتعرف على هذه اللغات.
جافا هي لغة البرمجة العامة للانترنت بينما السي ++ عرفت كاللغة الاكثر شيوعا في مجال البرمجة الشيئية وباسكال الكائناتية هي اللغة التي استخدمتها بورلاند في بيئة الدلفي.
على الرغم من أن هذا ليس واضحا بشكل مبدئي,فان هذا اللغات الثلاث لديها الكثير من الأمور المشتركة, الهدف من هذا المقال هو البحث في الجوانب التقنية لهذه اللغات الثلاثة, والمقارنة بينها. أنا لست بصدد تحديد أيها الأفضل لأن هذا يعتمد بشكل أساسي على ما الذي تريده منها.
في هذا المقال ستحتاج لمعرفة سطحية عن احد لغات البرمجة الشيئية التي نحن بصددها أو المعرفة الاولية بمبادئ البرمجة الشيئية عموماً.
كل ما سأحاول القيام به هو وصف سبب كون المزايا الخاصة بكل منها ذات أهمية خاصة. ثم سنقارن بين مقابلاتها في الغات الاخرى. أنا لا أسعى لتعليمك عن استخدام هذه المزايا في الحياة العملية, كما لا اهدف لتعليمك البرمجة الشيئية, فالهدف فقط هو المقارنة فيما بينها.
المزايا الأساسية للبرمجة الشيئية:
لا تعتبر البرمجة الشيئية تقنية برمجية جديدة, فجذورها تعودإلى Simula-67, بالرغم من ان التمثيل الكامل لها هو Smalltalk-80.
أصبحت البرمجة الشيئية شائعة الاستخدام في النصف الثاني من عقد الثمانينات, وظهرت واضحة في لغات مثل
C++,Object-c,Object and turbo Pascal,CLOS (an OOP of Lisp),Eiffel,Ada(on last incarnations),most recent Java
المزايا الرئيسة للبرمجة الشيئية كالتالي:
اولا : تعريف الاصناف :نمط بياني خالص يقوم على تغليف تمثيل البيانات وبعض العمليات المتعلقة بها(المناهج).الأصناف عادة هي التمثيل البسيط للتنميط(modularity) و التغليف(encapsulation).
ثانيا: الوراثة:وهس وسيلة لتعريف نمط بياني يرث عناصر صنف معرف مسبقا مع امكانية التعديل او الاضافة على ذلك التعريف. -عناصر الصنف هي الخصائص والمناهج-
والفائدة في التخصيص والتعميم في آن واحد.
ثالثا: ما يعرف بتعدد الاوجه (Polymorphism) وتتيح هذه الخاصية الاشارة إلى صنف على أنه صنف آخر يكون بالعادة في نفس فرع شجرة الوراثة كالاشارة للصنف الابن على أنه أحد الآباء. مما يتيح اعادة الاستخدام للاصناف و جعل البرامج أكثر قابلية للتطور والصيانة.
هذه المزايا الثلاث (الاصناف,الوراثة,تعدد الاوجه) لازمة في أي لغة برمجة موصوفة بأنها لغة برمجة شيئية.
والآن إلى المقارنة
1.الفحص في وقت الترجمة مقابل الفحص في وقت التنفيذ:
ممكن تقييم لغات البرمجة من خلال تصنيف قوة تعريف الانماط البيانية فيها. فحص الصنف المتعلق بالمنهج الذي يتم استدعاؤه, كذلك فحص الوسائط, وفحص مجال المصفوفات, وهكذا ..
في لغة باسكال الشيئية (Object Pascal) جل وقت الترجمة يذهب في فحص الانواع في حين يكون التركيز على فحص الأنواع أقل بكثير في C++ في حين أن الجافا تركز على فحص الأنواع أكثر من الاثنتين.
السبب أن C++ تسعى للتوافق مع سي التقليدية, التي تقوم بالقليل جدا في فحص الأنواع وقت الترجمة.كمثال على كلامنا فإن لغة البرمجة سي أو C++ أن كل التعابير الرقمية متوافقة كاسناد قيمة حقيقية لرقم صحيح او حتى قيمة صحيحة لحرف لكن في الباسكال والجافا هذا يولد خطأ عند الترجمة.
2.لغات البرمجة الشيئية الصرفة مقابل المتعددة:
فرق آخر بين لغات البرمجة التي تدعم البرمجة الشيئية هو مدى دعمها لتقنيات البرمجة التركيبية التقليدية, واللغات الصرفة هي تلك التي تدعم النموذج الشيئي فقط, فتستطيع التعامل مع الاصناف والمناهج فقط ولا تستطيع تعريف دوال وبرامج فرعية تقليدية أو تعرف متغيرات عامة (global).
ومن بين اللغات الثلاث التي نتحدث عنها يمكن اعتبار الجافا فقط على أنها لغة شيئية صرفة (مثله مثل Eiffel و Smalltalk). يبدو للوهلة الاولى ان هذه الميزة سلبية لا سيما وأنك تستخدم العديد من المناهج الثابتة والتي لا تختلف كثيرا عن الدوال والبرامج الفرعية في اللغات الهيكلية, وكل ما نجنيه هو زيادة تعقيد الكود اللازم لتمثيل هذه الاجراءات.
في رأيي الخاص أن اللغات الشيئية الصرفة تقدم الكثير للمبرمجين المستجدين حيث أنها تجبرهم على استخدام تقنيات البرمجة الشيئية وتعلم هذا النمط من البرمجة.
في المقابل فإن باسكال الشيئية ولغة C++ يمثلان نموذج من اللغات المدمجة (hybird languages), فكلتاهما تتيح للمبرمج أن يستخدم نموذج الباسكال والسي التقليدي.
3.التمثيل البسيط للكائنات مقابل المؤشرات:
الفرق الثالث امميز للغات البرمجة الشيئية هو طريقة تمثيلها للكائنات في الذاكرة. فالبعض يستخدم المكدس أو الكومة أو يمثل الكائنات بطرق استاتيكية. في هذه اللغات فان الكائن (متغير من النوع صنف) يمثل جزءا من الذاكرة كما هي حال لغة C++.
مؤخرا ظهر اتجاه لاستخدام نموذج آخر يدعى (Object Reference model) في هذا النموذج يتم حجز الذاكرة الخاصة لكل صنف بطريقة ديناميكية في الكومة (heap) و الكائنات هي بالحقيقة مؤشرات لهذا المكان بالذاكرة.
-لقد ميز المؤلف بين هذه المؤشرات باستخدام References بينما تحدث عن المؤشرات التقليدية باستخدام Pointers فهما غير متطابقين تماما كما يقول لذا ساستخدم كلمة مرجع للاشارة الى الاولى-
لغة الجافا والباسكال تعتمد هذا الاسلوب لهذا على المبرمج أن يتذكر حجز الذاكرة لكل كائن قبل استخدامه.
4.الأصناف والكائنات والمراجع:
لنميز باختصار بين الكائنات (Object) والاصناف (Classes) فالاصناف يمكن اعتبارها الانواع البيانية بينما الكائنات هي المتغيرات التي تمثل تلك الاصناف في الذاكرة.
والآن سنتحدث عن كيفية استخدام هذه الكائنات في كل من لغات البرمجة الثلاث
السي C++: اذا كان لدينا صنف يدعى MyClass وله منهج يدعى MyMethod فبالامكان كتابة السطرين التاليين
فالسطر الاول قام بتعريف كائن من النوع MyClass وسماه Obj. والذاكرة المحجوزة لهذا الكائن في محجوزة في المكدس, وفي السطر الثاني استدعاء لاحد مناهج هذا الكائن.
الجافا: في الجافا هناك تعليمة مماثلة لتعريف لتعريف مقبض (handle) للكائن وليس لكل الحجم المطلوب للكائن وقبل استخدام هذا الكائن عليك ان تحجز ذاكرة كافية له كالتالي
بالطبع ممكن احتصار السطرين الأوليين بسطر واحد كالتالي
الباسكال الشيئية: ويستخدم طريقة مشابهة لكنها تستخدم جملة مختلفة للتعريف وحجز الذاكرة كالتالي
ملاحظة:اذا كان نموذج تمثيل الكائنات باستخدام المراجع (object reference model) يستدعي عملا اضافيا من المبرمج فتذكر ان في لغة C++ عادة ما تستخدم المؤشرات والمراجع للتعامل مع الكائنات وبهذا تحصل على خاصية تعدد الاوجه في حين أن نموذج تمثيل الكائنات بالمراجع يستخدم المؤشرات بشكل افتراضي ويقوم بعمل جيد لاخفاء التفاصيل عن المبرمج. في لغة الجافا استثنائياً لا يوجد مؤشرات لكنها موجودة في كل مكان ولا يستطيع المبرمجون التعامل مباشرة معها لذلك فانها لا تشير إلى أماكن عشوائية في الذاكرة لاسباب أمنية.
5.سلة المحذوفات:
والمقصود آلية استعادة الذاكرة التي تم تخصيصها لكائن ما بعد الانتهاء منه.
C++:قي لغة سي استعادة المساحة من المكدس بسيطة جدا, بالمقابل عادة ما يكون استرجاع المساحات المحجوزة بشكل ديناميكي معقد نوعا ما.
كاستخدام عدد المراجع أو المؤشرات الذكية لكنه ليس بالامر السهل, وان الانطباع الاولي عن ال C++ هو أن استخدام نموذج الكائنات باستخدام المراجع سيجعل العملية أكثر صعوبة.
الجافا: ليس هناك الكثير ليقال في هذا الموضوع في الجافا حيث أنها تستخدم خوارزمية خاصة لاسترجاع الذاكرة بعد الانتهاء من استخدامها من خلال ما يسمى (virtual machin) وهذا بدون أدنى تدخل من المبرمج لكن لكل شيئ ثمن فقد تحصل على بعض الاخطاء المنطقية بسببها.
الباسكال الشيئية:باسكال لا تملك طريقة لتفريغ الذاكرة كتلك الموجودة في الجافا. لكن عناصر الدلفي تدعم فكرة العنصر الأب الذي يكون مسؤولا عن استرجاع الذاكرة التي كانت مستخدمة من قبل كل الكائنات الأبناء. مما يجعل الموضوع بالدلفي اكثر بساطة.
6.تعريف أصناف جديدة:
بعد أن تعرفنا على كيفية انشاء واستخدام كائنات لاصناف مسبقة التعريف فإننا سنتعرض لكيفية تعريف أصناف جديدة, وبشكل بسيط سنعرف الصنف على أنه مجموعة من المناهج, والعمليات, والبيانات الخاصة به.
C++:هذا مثال عن تعريف صنف جديد في السي
وها هنا الشفرة الخاصة بتعريف هذا المنهج الوحيد
الجافا: التركيب اللغوي للجافا يشبه إلى حد كبير ذلك الخاص ب C++
الفرق الكبير هو أن الشفرة الخاصة بالمناهج تكتب مباشرة بعد تعريفها وبهذا فانك تستطيع وضع القيم الابتدائية لبيانات الصنف مع تعريفة.
في حقيقة الامر ان انت لم تفعا ذلك فان الجافا تقوم به بدلا عنك, باستخدام القيم الافتراضية.
الباسكال الشيئية: والتركيب اللغوي هنا مختلف قليلا وأقرب الى ال C++ منه إلى الجافا:
كما تلاحظ هناك فرق واضح في التركيب اللغوي فالمناهج يتم تعريفها بالكلمات المفتاحية Procedure, Function و المناهج التي بدون وسائط لا تحتاج لأقواس, كما يتم تعريف المنهج في تعريف الصنف ثم تكتب الشفرة الخاصة به فيما بعد كما هي الخال مع ال C++ , وأخيرا فالباسكال تستخدم النقطة في حين أن C++ تستخدم النقطتين العموديتين. (هذا الحرف غير مسموح به فس الجافا أو الباسكال).
الموضوع مأخوذ عن موقع ماركو كانتيو وهو بالانجليزية بامكانك قراءة المصدر الانجليزي من الرابط التالي
http://www.marcocantu.com/papers/ooplang.htm
اتمنى أن تعذروني على الأخطاء اللغوية ان صادفتموها لا تترددوا بالتنقيح
كما اود الاشارة لأني لا اتقن سوى الدلفي من بين هذه اللغات الثلاثة فاذا وقعت في الفهم الخاطئ فاني على امل ان تصححوا لي هذا الفهم
واخيرا على طول المقال غلا انه مختصر جدأ. و اتوسم بكم الخير باضافة المزيد من التوضيح على هذه النقاط الكثيرة لتصبح هذه المشاركة مرجع لكل راغب بالتعرف على هذه اللغات.
جافا هي لغة البرمجة العامة للانترنت بينما السي ++ عرفت كاللغة الاكثر شيوعا في مجال البرمجة الشيئية وباسكال الكائناتية هي اللغة التي استخدمتها بورلاند في بيئة الدلفي.
على الرغم من أن هذا ليس واضحا بشكل مبدئي,فان هذا اللغات الثلاث لديها الكثير من الأمور المشتركة, الهدف من هذا المقال هو البحث في الجوانب التقنية لهذه اللغات الثلاثة, والمقارنة بينها. أنا لست بصدد تحديد أيها الأفضل لأن هذا يعتمد بشكل أساسي على ما الذي تريده منها.
في هذا المقال ستحتاج لمعرفة سطحية عن احد لغات البرمجة الشيئية التي نحن بصددها أو المعرفة الاولية بمبادئ البرمجة الشيئية عموماً.
كل ما سأحاول القيام به هو وصف سبب كون المزايا الخاصة بكل منها ذات أهمية خاصة. ثم سنقارن بين مقابلاتها في الغات الاخرى. أنا لا أسعى لتعليمك عن استخدام هذه المزايا في الحياة العملية, كما لا اهدف لتعليمك البرمجة الشيئية, فالهدف فقط هو المقارنة فيما بينها.
المزايا الأساسية للبرمجة الشيئية:
لا تعتبر البرمجة الشيئية تقنية برمجية جديدة, فجذورها تعودإلى Simula-67, بالرغم من ان التمثيل الكامل لها هو Smalltalk-80.
أصبحت البرمجة الشيئية شائعة الاستخدام في النصف الثاني من عقد الثمانينات, وظهرت واضحة في لغات مثل
C++,Object-c,Object and turbo Pascal,CLOS (an OOP of Lisp),Eiffel,Ada(on last incarnations),most recent Java
المزايا الرئيسة للبرمجة الشيئية كالتالي:
اولا : تعريف الاصناف :نمط بياني خالص يقوم على تغليف تمثيل البيانات وبعض العمليات المتعلقة بها(المناهج).الأصناف عادة هي التمثيل البسيط للتنميط(modularity) و التغليف(encapsulation).
ثانيا: الوراثة:وهس وسيلة لتعريف نمط بياني يرث عناصر صنف معرف مسبقا مع امكانية التعديل او الاضافة على ذلك التعريف. -عناصر الصنف هي الخصائص والمناهج-
والفائدة في التخصيص والتعميم في آن واحد.
ثالثا: ما يعرف بتعدد الاوجه (Polymorphism) وتتيح هذه الخاصية الاشارة إلى صنف على أنه صنف آخر يكون بالعادة في نفس فرع شجرة الوراثة كالاشارة للصنف الابن على أنه أحد الآباء. مما يتيح اعادة الاستخدام للاصناف و جعل البرامج أكثر قابلية للتطور والصيانة.
هذه المزايا الثلاث (الاصناف,الوراثة,تعدد الاوجه) لازمة في أي لغة برمجة موصوفة بأنها لغة برمجة شيئية.
والآن إلى المقارنة
1.الفحص في وقت الترجمة مقابل الفحص في وقت التنفيذ:
ممكن تقييم لغات البرمجة من خلال تصنيف قوة تعريف الانماط البيانية فيها. فحص الصنف المتعلق بالمنهج الذي يتم استدعاؤه, كذلك فحص الوسائط, وفحص مجال المصفوفات, وهكذا ..
في لغة باسكال الشيئية (Object Pascal) جل وقت الترجمة يذهب في فحص الانواع في حين يكون التركيز على فحص الأنواع أقل بكثير في C++ في حين أن الجافا تركز على فحص الأنواع أكثر من الاثنتين.
السبب أن C++ تسعى للتوافق مع سي التقليدية, التي تقوم بالقليل جدا في فحص الأنواع وقت الترجمة.كمثال على كلامنا فإن لغة البرمجة سي أو C++ أن كل التعابير الرقمية متوافقة كاسناد قيمة حقيقية لرقم صحيح او حتى قيمة صحيحة لحرف لكن في الباسكال والجافا هذا يولد خطأ عند الترجمة.
2.لغات البرمجة الشيئية الصرفة مقابل المتعددة:
فرق آخر بين لغات البرمجة التي تدعم البرمجة الشيئية هو مدى دعمها لتقنيات البرمجة التركيبية التقليدية, واللغات الصرفة هي تلك التي تدعم النموذج الشيئي فقط, فتستطيع التعامل مع الاصناف والمناهج فقط ولا تستطيع تعريف دوال وبرامج فرعية تقليدية أو تعرف متغيرات عامة (global).
ومن بين اللغات الثلاث التي نتحدث عنها يمكن اعتبار الجافا فقط على أنها لغة شيئية صرفة (مثله مثل Eiffel و Smalltalk). يبدو للوهلة الاولى ان هذه الميزة سلبية لا سيما وأنك تستخدم العديد من المناهج الثابتة والتي لا تختلف كثيرا عن الدوال والبرامج الفرعية في اللغات الهيكلية, وكل ما نجنيه هو زيادة تعقيد الكود اللازم لتمثيل هذه الاجراءات.
في رأيي الخاص أن اللغات الشيئية الصرفة تقدم الكثير للمبرمجين المستجدين حيث أنها تجبرهم على استخدام تقنيات البرمجة الشيئية وتعلم هذا النمط من البرمجة.
في المقابل فإن باسكال الشيئية ولغة C++ يمثلان نموذج من اللغات المدمجة (hybird languages), فكلتاهما تتيح للمبرمج أن يستخدم نموذج الباسكال والسي التقليدي.
3.التمثيل البسيط للكائنات مقابل المؤشرات:
الفرق الثالث امميز للغات البرمجة الشيئية هو طريقة تمثيلها للكائنات في الذاكرة. فالبعض يستخدم المكدس أو الكومة أو يمثل الكائنات بطرق استاتيكية. في هذه اللغات فان الكائن (متغير من النوع صنف) يمثل جزءا من الذاكرة كما هي حال لغة C++.
مؤخرا ظهر اتجاه لاستخدام نموذج آخر يدعى (Object Reference model) في هذا النموذج يتم حجز الذاكرة الخاصة لكل صنف بطريقة ديناميكية في الكومة (heap) و الكائنات هي بالحقيقة مؤشرات لهذا المكان بالذاكرة.
-لقد ميز المؤلف بين هذه المؤشرات باستخدام References بينما تحدث عن المؤشرات التقليدية باستخدام Pointers فهما غير متطابقين تماما كما يقول لذا ساستخدم كلمة مرجع للاشارة الى الاولى-
لغة الجافا والباسكال تعتمد هذا الاسلوب لهذا على المبرمج أن يتذكر حجز الذاكرة لكل كائن قبل استخدامه.
4.الأصناف والكائنات والمراجع:
لنميز باختصار بين الكائنات (Object) والاصناف (Classes) فالاصناف يمكن اعتبارها الانواع البيانية بينما الكائنات هي المتغيرات التي تمثل تلك الاصناف في الذاكرة.
والآن سنتحدث عن كيفية استخدام هذه الكائنات في كل من لغات البرمجة الثلاث
السي C++: اذا كان لدينا صنف يدعى MyClass وله منهج يدعى MyMethod فبالامكان كتابة السطرين التاليين
MyClass Obj;
Obj.MyMethod();
فالسطر الاول قام بتعريف كائن من النوع MyClass وسماه Obj. والذاكرة المحجوزة لهذا الكائن في محجوزة في المكدس, وفي السطر الثاني استدعاء لاحد مناهج هذا الكائن.
الجافا: في الجافا هناك تعليمة مماثلة لتعريف لتعريف مقبض (handle) للكائن وليس لكل الحجم المطلوب للكائن وقبل استخدام هذا الكائن عليك ان تحجز ذاكرة كافية له كالتالي
MyClass Obj;
Obj = new MyClass();
Obj.MyMethod();
بالطبع ممكن احتصار السطرين الأوليين بسطر واحد كالتالي
MyClass Obj = new MyClass();
الباسكال الشيئية: ويستخدم طريقة مشابهة لكنها تستخدم جملة مختلفة للتعريف وحجز الذاكرة كالتالي
var
Obj: MyClass;
begin
Obj := MyClass.Create;
Obj.MyMethod;
ملاحظة:اذا كان نموذج تمثيل الكائنات باستخدام المراجع (object reference model) يستدعي عملا اضافيا من المبرمج فتذكر ان في لغة C++ عادة ما تستخدم المؤشرات والمراجع للتعامل مع الكائنات وبهذا تحصل على خاصية تعدد الاوجه في حين أن نموذج تمثيل الكائنات بالمراجع يستخدم المؤشرات بشكل افتراضي ويقوم بعمل جيد لاخفاء التفاصيل عن المبرمج. في لغة الجافا استثنائياً لا يوجد مؤشرات لكنها موجودة في كل مكان ولا يستطيع المبرمجون التعامل مباشرة معها لذلك فانها لا تشير إلى أماكن عشوائية في الذاكرة لاسباب أمنية.
5.سلة المحذوفات:
والمقصود آلية استعادة الذاكرة التي تم تخصيصها لكائن ما بعد الانتهاء منه.
C++:قي لغة سي استعادة المساحة من المكدس بسيطة جدا, بالمقابل عادة ما يكون استرجاع المساحات المحجوزة بشكل ديناميكي معقد نوعا ما.
كاستخدام عدد المراجع أو المؤشرات الذكية لكنه ليس بالامر السهل, وان الانطباع الاولي عن ال C++ هو أن استخدام نموذج الكائنات باستخدام المراجع سيجعل العملية أكثر صعوبة.
الجافا: ليس هناك الكثير ليقال في هذا الموضوع في الجافا حيث أنها تستخدم خوارزمية خاصة لاسترجاع الذاكرة بعد الانتهاء من استخدامها من خلال ما يسمى (virtual machin) وهذا بدون أدنى تدخل من المبرمج لكن لكل شيئ ثمن فقد تحصل على بعض الاخطاء المنطقية بسببها.
الباسكال الشيئية:باسكال لا تملك طريقة لتفريغ الذاكرة كتلك الموجودة في الجافا. لكن عناصر الدلفي تدعم فكرة العنصر الأب الذي يكون مسؤولا عن استرجاع الذاكرة التي كانت مستخدمة من قبل كل الكائنات الأبناء. مما يجعل الموضوع بالدلفي اكثر بساطة.
6.تعريف أصناف جديدة:
بعد أن تعرفنا على كيفية انشاء واستخدام كائنات لاصناف مسبقة التعريف فإننا سنتعرض لكيفية تعريف أصناف جديدة, وبشكل بسيط سنعرف الصنف على أنه مجموعة من المناهج, والعمليات, والبيانات الخاصة به.
C++:هذا مثال عن تعريف صنف جديد في السي
class Date {
private:
int dd;
int mm;
intyy;
public:
voind Init (int d, int m, int y);
int Day();
int Month();
int Year();
};
وها هنا الشفرة الخاصة بتعريف هذا المنهج الوحيد
void Date::Init (int d, int m, int y)
{
dd = d;
mm = m;
yy = y;
}
الجافا: التركيب اللغوي للجافا يشبه إلى حد كبير ذلك الخاص ب C++
class Date {
int dd = 1;
int mm = 1;
int yy = 1;
public void Init (int d, int m, int y) {
dd = d; mm = m; yy = y; }
public int Day () { return dd; }
public int Month () { return mm; }
public int Year () { return yy; }
}
الفرق الكبير هو أن الشفرة الخاصة بالمناهج تكتب مباشرة بعد تعريفها وبهذا فانك تستطيع وضع القيم الابتدائية لبيانات الصنف مع تعريفة.
في حقيقة الامر ان انت لم تفعا ذلك فان الجافا تقوم به بدلا عنك, باستخدام القيم الافتراضية.
الباسكال الشيئية: والتركيب اللغوي هنا مختلف قليلا وأقرب الى ال C++ منه إلى الجافا:
type
Date = class
private
dd, mm, yy: Integer;
public
procedure Init (d, m, y: Integer);
function Month: Integer;
function Day: Integer;
function Year: Integer;
end;
procedure Date.Init (d, m, y: Integer);
begin
dd := d;
mm := m;
yy := y;
end;
function Date.Day: Integer;
begin
Result := dd;
end;
كما تلاحظ هناك فرق واضح في التركيب اللغوي فالمناهج يتم تعريفها بالكلمات المفتاحية Procedure, Function و المناهج التي بدون وسائط لا تحتاج لأقواس, كما يتم تعريف المنهج في تعريف الصنف ثم تكتب الشفرة الخاصة به فيما بعد كما هي الخال مع ال C++ , وأخيرا فالباسكال تستخدم النقطة في حين أن C++ تستخدم النقطتين العموديتين. (هذا الحرف غير مسموح به فس الجافا أو الباسكال).
المنتديات
التعليقات
Re: السي والجافا والباسكال (مقارنة) - تتمة -
import where.myclass; import where.* //لكل الاصناف
11.بيانات ومناهج خاصة بالاصناف: لفات البرمجة الشيئية عادةً تسمح بتعريف بعض المناهج والبيانات الخاصة بالصنف بشكل عام, وليس لكائن بعينه. ويمكن استدعاء هذه المناهج من خلال الصنف أو الكائن الواحد. أما البيانات الخاصة بالصنف فهي تلك البيانات التي تتشارك بها كل كائنات الصنف. C++:يتم تمييز هذه البيانات والكائنات بالكلمة المححجوزة Static. والبيانات الخاصة يجب أن تسند لها قيم ابتدائية بطرق خاصة. الباسكال الشيئية: وتملك فقط مناهج خاصة بالصنف ولا يوجد أي بيانات خاصة به لكن هناك طريقة خلفية للالتفاف عليها وذلك بتعريف متغيرات عامة على مستوى الوحدة التي تحتوي تعريف الصنف. الجافا: وتستخدم نفس مميز السي static وتستخدم بكثرة. و من الممكن اسناد القيم الابتدائية مباشرة عند التعريف. 12.الأصناف والوراثة: الورائة بين الأصناف هي احدى المزايا الرئيسية للبرمجة الشيئية وتستخدم في مجالات التخصيص والتعميم. والفكرة ببساطة هي أن بمقدورك أن تعرف نوعا بيانيا جديدا يوسع أو يعدل على نمط بياني موجود مسبقا. بكلمات أخرى الاصناف المشتقة تملك كل بيانات ومناهج الاصناف المورروثة, بالاضافة إلى خصائص و مناهج جديدة, ومن الممكن التعديل على منهج موجود مسبقاً.وللغات الشيئية المختلفة طرقا مختلفة لتمثيل هذه الميزة ويسمونها بأحد الأسماء التالية (derivation,inheritance,subclassing) , والاصناف التي نرث عنا تدعى(base class,parent clas,super clas) في حين أن الاصناف المشتقة الجديدة تدعى (derived class,child class,subclass) . C++:وتستخدم الكلمات (public,protected,private) لتعريف غالب أصنافها واخفاء المناهج الموروثة وتحويلها إلى مناهج محمية أو خاصة علما أن الوراثة العامة (public inheritance) هي الأكثر شيوعا, بينما الوراثة الافتراضية هل الخاصة (private inheritance). ولغة C++ هي الوحيدة بين اللغات الثلاثة التي تدعم الوراثة المتعددة وفيما يلي مثال حول الصياغة اللغويةclass Dog: public Animal { ... };
الباسكال الشيئية: وهذه لا تستخدم أي كلمة للتعبير عن الوراثة لكنها تستخدم تركيب لغوي خاص باضافة الاقواس حول الصنف الأب. والاشتقاق هنا هو ما يدعى بالاشتقاق العام في لغة C++ وهذا مثالtype Dog = class (Animal) ... end;
الجافا: وتستخدم الكلمة المحجوزة extends للتعبير عن النوع الوحيد من الاشتقاق والذي يقابل الوراثة العامة في السي أيضا.ولا تدعم الوراثة المتعددة وهذه مثالclass Dog extends Animal { ... }
13.المنهج الأب لكل الأصناف: في بعض لغات البرمجة الشيئية لكل صنف هناك على الأقل أب واحد افتراضي له بعض المزايا المشتركة لكل الأصناف الأخرى, هذا الصنف الرئيسي هو في الحقيقة صنف بمثابة الجد الأول لكل باقي الأصناف وهذه الميزة مأخوذة عن Smalltalk. C++:بالرغم من أن هذه اللغة لا تملك مثل هذه الميزة, فإن العديد من بيئات العمل المشتقة عنها تعرف صنفا على أنه الجد الأول. ومن الأمثلة الجديرة بالملاحظة ال MFC ولديه الصنف CObject. الباسكال الشيئية: وهنا جميع الأصناف مشتقة من الصنف TObject بشكل تلقائي وهو آخر شجرة ورائية ضخمة ويستطيع هذا الصنف التعامل مع RTTI وله بعض المزايا الأخرى. الجافا:وجميع أصنافها مشتقة عن الصنف Object داخليا. والشائع في الجافا أن للصنف الأساس مزايا محدودة جدا. 14.الوصول لمناهج الصنف الأب : عندما تكتب منهجا لصنف ما, أو تتجاوز (override) عن منهج ما, فإنك عادة ما تحتاج للاشارة إلى مناهج الصنف الأب. إذا كان المنهج معرفا في الصنف الجديد فإن الاشارة غلى اسمه ستوصلك إلى الاصدار الجديد منه. ولهذا فإن لغات البرمجة الشيئية تستخدم تقنيات مختلفة لحل هذا الاشكال. C++:وهنا بإمكانك استخدام ( :: ) للاشارة إلى صنف بعينه. لذلك فإنك تستطيع استدعاء منهج لأي من آباء الصنف الجديد. باسكال الشيئية:لدينا كلمة محجوزة خاصة لذلك inherited. يليها اسم المنهج المطلوب استدعاؤه, أو (بظروف خاصة جدا) استخدم هذه الكلمة لوحدها للوصول إلى المنهج المطابق لذلك الذي وردت هذه الكلمة بداخله. الجافا: وتستخدم كلمة super لتقوم بالشيء ذاته, في هذه اللغة وكذلك بلغات البرمجة الشيئية لا يوجد أي طريقة للإشارة لأب محدد (كالأب الثالث مثلاً) هذا يبدو للوهلة الأولى قصورا لكنه يسمح بتوسيع الشجرة الوراثية بإضافة أصناف وسيطة. وفي الوقت ذاتهإذا لم تكن بحاجة لوظيفة من وظائف الأب فليس عليك أن ترثها ! 15.التوافق مع الأصناف الجزئية (Subtype Compatibility) ليست كل لغات البرمجة الشيئية تتقييد بالأنواع البيانية بشدة لكن اللغات الثلاثة التي نحن بصددها تتشلرك بهذه الميزة. هذا ببساطة يعني أن الكائنات من أصناف مختلفة غير متوافقة. وهناك استثناء لهذه القاعدة وهو أن الأصناف المشتقة متوافقة مع آبائها (وليس العكس). C++:في هذه اللغة الاصناف الجزئية متاحة فقط عند التعامل مع المؤشرات و المراجع (references) وليس للكائنات التقليدية. بالحقيقة للكائنات المختلفة أحجام مختلفة لذا لا تستطيع تكييفها بنفس الحيز. الباسكال الشيئية: التوافق مع الاصناف الجزئية متاح لكل الكائنات و شكرا لنموذج الأصناف المشيرة. علاوة على ذلك كل الأصناف متوافقة مع الصنف الجد TObject . الجافا:وتستخدم نفس النموذج المتبع مع الباسكال.Re: السي والجافا والباسكال (مقارنة) - تتمة -
public interface CanFly { public void Fly(); } public class Bat extends Animal implements CanFly { public void Fly( ) { // the bat flies... } }
الباسكال الشيئية: في الاصدار الثالث من دلفي تم تعريف مفهوم مشابه لمفهوم الواجهات في الجافا لكن هذه الواجهات تقابل نموذج ال COM بقوة (مع امكانية استخدامها في برامج لا علاقة لها بالCOM) والواجهات تمثل شجرة وراثية منفصلة عن شجرة الأصناف, لكن كما في الجافا فان الاصناف من الممكن ان تشتق عن صنف رئيسي وأكثر من واجهة وان مقابلة المناهج الخاصة بهذا الصنف وهذه الواجهات من أكثر الأمور المعقدة في الباسكال. 19.معلومات الأصناف في وقت التشغيل: RTTI Runtime Type Identification/Information في اللغات الشيئية التي تدعم فحص الأنواع بشدة فإن المترجم يقوم بكل مهام فحص الانواع لذلك هناك حاجة قليلة لحفظ معلومات النوع او الصنف غلى وقت التشغيل من ناحية ثانية هناك بعض الحالات التي تستدعي حفظ هذه المعلومات مثل (downcast) لهذا السبب فإن اللغات الثلاث التي نناقشها تدعم RTTI بشكل متفاوت. C++:في الاصل إن لغة السي لا تدعم RTTI وقد أضيفت في وقت متاخر بشكل downcast واتاحت بعض معلومات الصنف فتستطيع ان تقارن غذا ما كان صنفين من نفس النوع . الباسكال:الباسكال الشيئية وبيئة العمل المرئية تدعم وتتطلب RTTI. ليس فقط فحص النوع و downcast (باستخدام is و as) بل إن الأصناف تولد RTTI بشكل كبير للجزء المنشور (published). في الواقع هذه الكلمة تتحكم بجزء من RTTI. كل الفكرة من خلف الصفات وبيئة الدلفي وملفات النماذج كلها تعتمد على RTTL . تذكر أن الجد الأول TObject لديه منهجين هما ClassName و ClassType . الجافا: وهي مشابهة للباسكال, فلدينا هنا أيضا أب واحد لجميع الاصناف يساعد على تتبع معلومات الصنف كما ان التحويل الآمن بين الأصناف هو التحويل الافتراضي ولكل صنف منهج يدعى GetClass الذي يعيد بعض المعلومات لوصف الصنف. الاصدار 1.0 من الجافا لا يحوي على الكثير من RTTI للاصناف المتنوعة لكن هذا سيتغير في الاصدارات القادمة وخاصة عند التوجه لبناء java beans. مثال:// C++ Dog* MyDog = dynamic_cast (myAnimal); // Java Dog MyDog = (Dog) myAnimal; // Object Pascal Dog myDog := myAnimal as Dog;
20.معالجة الاخطاء : (exceptions handling) الفكرة هي تبسيط معالجة الأخطاء اثناء تنفيذ البرنامج وتزويد آبية داخلية لذلك لجعل البرامج أكثر تماسكا. C++: ويستخدمون كلمة throw لتوليد خطأ والكلمة try لتعليم مقطع محروس والكلمة ctach لكتابة الجزء الخاص بمعالحة الخطأ والخطأ عادة هو كائن من صنف خاص. ومعلوم أن السي تستخدم المكدس في حل و تدمير الكائنات. الباسكال: ونستخدم كلمات مشابهة (Raise,try,except) ولها مميزات مشابهة و الفرق الواضح الوحيد أنه لا يوجد استخدام للمكدس عند معالجة الاخطاء ببساطة أن جميع كائناتنا خارج المكدس وبدلا عن ذلك فالباسكال تستخدم كلمة finally للاشارة إلى الشفرة التي يجب أن تنفذ دوما وعادة وا تكون لاسترجاع الذاكرة و الصنف الخاص بالخطأ هنا هو مشتق عن Exception. الجافا: تستخدم كلمات السي لكن لتقوم بعمل مشابه لما قامت به الباسكال بضمن ذلك كلمة finally الاضافي. هذا شائع بين كل لغات البرمجة التي تحتوي نموذج الكائنات المرجعية لكن في الجافا هناك آلية لجمع المهملات تققل بشكل كبير من استخدام finally . الجافا صارمة في هذا المنحى فكل دالة قد تولد خطأ يجب أن يكون لديها جزء خاص للاشارة إلى أي نوع من الأخطاء بإمكانه ان يولد. وهذا يفحص من قبل المترجم وهذه تقنية قوية بالرغم من انها تضيف عبئا إضافيا على المبرمج. الصنف الخاص بالخطأ يجب أن يكون مشتق من Throwable. 21.القوالب والبرمجة الجينية : (Generic Programming) البرمجة الجينية هي تقنية لكتابة الدوال والأصناف مع ترك بعض الأنواع البيانية بدون تحديد. يتم تأجيل ذلك إلى وقت استخدام هذه الدوال والأصناف في الشفرة المصدرية. كل شيء يترك يحدد بإشراف المترجم, ولا يؤجل أي شيء لوقت التنفيذ وأفضل مثال على هذا الأسلوب هو الأصناف الحاوية (container classes). C++:وهي اللغة الوحيدة بين اللغات التي ناقشها التي تدعم هذه الخاصية ويشار إلى هذه الأصناف بالكلمة Template . الC++ القياسية تحتوي على مكتبة ضخمة من قوالب الأصناف تدعى STL التي تدعم أسلوب مميز وقوي بالبرمجة . الباسكال: لا يوجد لديها أي قوالب والأصناف الحاوية يتم بناءها لتحوي الكائنات من النوع TObject. الجافا:لا تحتوي قوالب أيضا يمكنك استخدام الحاويات (containers) من الصنف Object . بعض المزايا الأخرى: سنتكلم عن بعض المميزات الأخرى التي لم نذكرها بعد لأنها ذات علاقة بلغة واحدة فقط. C++:لقد أشرت إلى الوراثة المتعددة,و الأصناف الوهمية الرئيسة,و القوالب. لكن يوجد في هذه اللغة ما يسمى تجاهل العمليات (operator overloading) و تسمح السي لمبرمجيها بتجاهل الدوال العامة (global function overloading) بل وأكثر من ذلك انها تتيح تجاهل معاملات قلب الانواع لتجعل التحويل من نوع صنف إلى آخر عملية على مقاس برنامجك. نموذج الكائنات المتبع في هذه اللغة يتطلب نسخ المناهج البناءة وتجاهل معامل الاسناد وهذا ما لا تحتاجه اللغات الأخرى لأنها تقوم على نموذج الأصناف المشيرة. الجافا:ولديه ميزة فريدة بالبرمجة المتوازية فالكائنات والمناهج تدعم آلية التزامن باستخدام الكلمة synchonized . منهجين متزامنين لا يمكن أن ينفذا في آن واحد لبناء عملية (thread) أخرى يمكنك ببساطة أن تشتق من الصنف Thread وتتجاهل المنهج run . كبديل آخر بالامكان بناء واجهة قابلة للتشغيل (وهذا ما يحدث عند برمجة ال java applets ) . من المزايا الأخرى للجافا هو فكرة شفرة البايت المتنقلة (portable byte-code) لكنها لا ترتبط كثيرا باللغة نفسها. الباسكال الشيئية:من المزايا الخاصة بالباسكال هو نموذج الأصناف المشيرة أو الأصناف المرجعية أو سمها ما شئت (class references). والاستخدتم البسيط لمؤشرات المناهج وهي الفكرة وراء الأحداث , والفكرة المميزة للخصائص على أنها طريقة الوصول لبيانات الصنف فقد يكون وصولا مباشرا إلى البيانات او عبر اجراءات محددة وبناءاً عليه فإن أي تغيير في طريقة الوصول لا يتطلب تغييرا مقابلا بالاستدعاء. مما جعل الخصائص نموذجا قوي للتغليف والجافا مدعوة لدعم هذه الفكرة بالاصدار 1.1 مع java beans . القياسية: كل لغة تحتاج لشخص يقف وراء التقييس للتأكد من أن كل شيء تم تمثيله بشكل قياسي وفق أسس. C++: لقد استنفذت ANSI/ISO وقتها لكتابة المقاييس الخاصة بالسي ويبدو ان معظم المترجمات تنحى نحو تطبيق هذه المقاييس, بالرغم من وجود بعض الخصوصية. بشكل نظري فإن التطوير للغات شاذة قد توقف , ان مبادرات مثل مبادرة بورلاند لبناء C++ Builder بالتأكيد لم تضف شيئا جيدا لهذا الوضع, لكن العديد يعتقون ان السي بشكل سيء تحتاج لبيئة تطوير مرئية . في الوقت نفسه فان visual C++ الشائعة قد حشرت اللغة بمجالات أخرى, كمثال بسيط التمثيل السيئ لجملة الماكرو. رأيي الخاص أن لكل لغة لها نموذجا الخاص بالتطوير ومن السيء محاولة استخدام لغة في مجال لم تصمم من أجله . الباسكال الشيئية: وهذه لغة مملوكة, لذلك لا يوجد لها مقاييس لكن بورلاند تقوم بتطوير هذه اللغة مع كل اصدار جديد منها. الجافا : وهي أيضا لغة مملوكة ولديه أيضا علامة تجارية للاسم ومع ذلك فإن شركة Sun أكثر من راغبة بتسجيلها لمترجمات أخرى. Sun تحتفظ بالتحكم الكامل باللغة ويبدو أنها غير راغبة أبدا بجسم يقوم على رعاية المقاييس لها , على الأقل في هذا الوقت. Sun تتفادى استخدام الماكينات الوهمية virtual machines الغير متوافقة مع المعايير.Re: السي والجافا والباسكال (مقارنة) - تتمة -
Re: السي والجافا والباسكال
إضافة تعليق جديد