السي والجافا والباسكال (مقارنة)

الجافا السي والباسكال
الموضوع مأخوذ عن موقع ماركو كانتيو وهو بالانجليزية بامكانك قراءة المصدر الانجليزي من الرابط التالي

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++ تستخدم النقطتين العموديتين. (هذا الحرف غير مسموح به فس الجافا أو الباسكال).
المنتديات

التعليقات

Raed Filfel

7.المناهج البناءة: (Constructors) الصنف الذي عرفناه في الفقرة السابقة يعتبر بسيطا جدا ولتطويره فإن أول ما يتبادر للذهن هو اضافة منهج بناء, وهو طريقة جيدة لحل مشكلة القيم الابتدائية لبيانات أي صنف. C++:في هذه اللغة كما هو الحال في الجافا المنهج البناء يحمل نفس اسم الصنف واذا لم تعرف أب منهج بناء فإن المترجم يضيف منهجا بناء افتراضي وفي كلا اللغتين بالامكان اضافة أكثر من منهج بناء. الجافا:كل شيئ مشابه لما هو الحال في الC++ إلا أن اسم المنهج هنا Initializer بدل من Constructor والاسم يدل أن هذا المنهج لا يقوم حقيقة ببناء الصنف وانما باسناد القيم المبدئية حيث أن آلة الجافا (virtual machine) هي التي تقوم بهذا العمل. الباسكال الشيئية: هنا نحن نستخدم كلمة محجوزة لتمييز المناهج البناءة Constructor. وبالتالي نستطيع تسمية المناهج أسماء مختلفة كما أنه لا يجوز أن يكون لكلا المنهجين البنائيين نفس الاسم وهذا ما يسمونه بالتحميل الاضافي (Overload) الذي كان مسموح به في اللغتين السابقتين, من الممكن أن نضيف هنا أن لكل صنف في الباسكال يملك منهج بناء افتراضي اسمه Create طالما لم تعرف منهجا آخر بنفس الاسم ووسائط مختلفة. 8.المناهج الهدامة (Destructors): للمنهج الهدام دور معاكس تماما لدور المنهج البناءويستدعى عادة عند هدم الكائن. في حين أن كل الاصناف تحتاج لمناهج بناءة فإن القليل منها يحتاج لمناهج هدامة. وببساطة على هذا المنهج تحرير الموارد المخصصة للكائن وهذا يضمن الذاكرة والملفات وقواعد البيانات ومقابض النوافذ ... C++: يتم استدعاء المناهج الهدامة تلقائيا عند خروج الكائن عن مجال الرؤية (Scope) أو عند حذف كائن مخصص ديناميكيا ولكل صنف منهج هدام واحد فقط. الباسكال الشيئية: وهي مشابهة ل C++ ولدينا منهج وهمي قياسي لكل الاصناف يدعى Destroy. يتم استدعاؤه بواسطة المنهج Free. وكل الكائناد تخصص ديناميكيا, لذلك يفترض على المبرمج استدعاء Free لكل كائن تقوم ببناءه باستخدام Create إلا اذا كان له أب فمسؤولية تحريرة تعود لأبيه, وتستطيع تعريف أكثر من منهج هدام للصنف الواحد حيث أنك المسؤول عن استدعائها. الجافا :لا يوجد بالجافا أي مناهج هدامة ويتم تحرير الذاكرة بواسطة ما يسمة (garbage collector) الذي يعمل بالخلفية ويقوم باستدعاء المنهج finalize() قبل التحرير, مع العلم أنه لا يوجد أي ضمان لهذا الاستدعاء ولضمان ذلك عليك القيام به بنفسك من خلال تعريف مناهجك الخاصة والتأكد من استدعائها. 9.تغليف الأصناف (Class Encapsulation): من المزايا الشائعة للغات الثلاث وجود ثلاث مستويات مختلفة للوصول إلى بيانات ومناهج الصنف وهي (public,protected,private) الجزء العام (public) قابل للوصول من أي صنف آخر, والجزء المحمي (protected) يمكن الوصول إليه فقط من الاصناف المشتقة,في حين أن الجزء الخاص (private) يعني أن لا مجال للرؤية الخارجية والمقصود من خارج الوحدة التي تحتوي تعريف الصنف والتفاصيل قادمة فيما يلي: C++:لديهم ما يسمى بالاصناف الصديقة وتعرف باستخدام الكلمة المحجوزة friend لتجاوز قوانين التغليف المعروفة ومجال الرؤية الافتراضي هو المجال الخاص وللتراكيب (struct) فالمجال الافتراضي هو العام. الباسكال:يظهر الفرق بين الجزء المحمي والجزء الخاص في تعريف الصنف فقط في الوحدات المختلفة, فالصنف صديق لكل الاصناف المعرفة في نفس الوحدة. ويجدر التنويه أنه في الدلفي هناك جزئيين اضافيين في تعريف الصنف هما (published) و (automated) الأول لتوليد معلومات النمط البياني وقت التشغيل (RTTI) والثانية تستخدم للاصناف من نوع OLE من أجل Automation Classes كما هي حال الاصناف في برامج أوفيس. الجافا:مهناك فرق لغوي واضح يكمن في تكرار تعريف مدى الرؤية في كل صنف موروث عن أبيه. فرق آخر هو ان المجال الافتراضي هو الصنف الصديق أي ان كل الأصناف في الحزمة الواحدة (Package) هي أصناف صديقة و بشكل مشابه فان الجزء المحمي يدل على الجزء المرئي للأصناف المشتقة لكنه قابل للوصول في نفس الحزمة أيضا , ويبقى الجزء الخاص فهو مماثل للحزء الخاص بلغة C++. 10.الملفات والوحدات والحزم: من الفروق الهامة بين هذه اللغات الثلاثة هو طريقة ترتيب الكود المصدري للمشروع أو البرنامج في ملفات متعددة. مع أنها تتشابه في استخدام طريقة قياسية وهي تخزين الكود المصدري في مجموعة ملفات (وهذا يختلف عن لغات أخرى مثل Smalltalk), ففي حين أن مترجم ال C++ لا يفهم الملفات فإن مترجم الجافا يعرفها جيدا. C++:يهتم مبرمجي السي بوضع تعريف الصنف بملف تقديمي (header file) و الشفرة الخاصة باجسام المناهج في ملف آخر ولهذين الملفين نفس الاسم بامتدادات مختلفة وفي البرنامج يتم تضمين الملف التقديمي, وكل هذا عادات برمجية ممكن تجاهلها. مما يعني أن برنامج الرابط (linker) لديه الكثير من العمل لان المترجم (compiler) لا يغنيه ما هي الملفات اللازمة للتطبيق ابدا. باسكال الشيئية:في الباسكال كل ملف للشفرة المصدرية يدعى وحدة (unit) وتنقسم الوحدة والواحدة إلى قسمين الاول هو جزء الاتصال الخارجي (interface) وجسم الوحدة (implementation) يحتوي الجزء الأول على تعريف الاصناف ويجب أن يحتوي الجزء الثاني على اجسام المناهج او البرامج الفرعية المعرفة في الأول, ويعتبر غير مسموح أبداً أن تكتب تعليمات برمجية فعلية في جزء الاتصال الخارجي. ويمكن الاشارة إلى التعريفات في وحدة إخرى باستخدام الكلمة المحجوزة (uses) وهذا يقوم بتضمين جزء الاتصال الخارجي فقط من كل وحدة نظهر في جملة (uses) uses Windows, Form, MyFile; الجافا:وهنا تتم ترجمة كل ملف مصدري على حدة بعد ذلك تستطيع أن تسجل كل محموعة ملفات على أنها حزمة واحدة بشكل مختلف عما هو عليه الخال في اللغتين الأخريين فأنت تكتب جسم المنهج بداخل تعريف الصنف وعند تضمين ملف ما باستخدام جملة (import) فان المترجم يقرأ فقط الجزء العام منه وليس كل الشفرة. 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 . الجافا:وتستخدم نفس النموذج المتبع مع الباسكال.
Raed Filfel

16.الاستدعاء المتأخر (وتعدد الأوجه) :Late Binding and Polymorphism اذا أعاد صنف ما تعريف منهج تابع لأبيه سيكون جميلا جدا إذا علمت لغة البرمجة أي من المنهجين عليها أن تنفذ في الحالات المختلفة, لتمكين ذلك يجب أن يدعم المترجم عملية الاستدعاء البعيد (late binding) فجملة الاستدعاء في الشفرة المصدرية لا تقوم باستدعاء المنهج وقت الترجمة والوقت لكنها تنتظر إلى وقت التنفيذ لتعرف أي منهج ستنفذ. C++:في هذه اللغة فإن الاستدعاء المتأخر متاح فقط للمناهج الوهمية (virtual methods) مما يسبب البطؤ عند التنفيذ. المنهج الذي يعرف على أنه وهمي في الصنف الأب يحتفظ بهذه الميزة عند اعادة تعريفه. في المقابل فإن المناهج الغير وهمية لا تدعم الاستدعاء المتأخر كما في الباسكال. الباسكال الشيئية:يمكن الحصول على هذه الميزة للمناهج الوهمية والديناميكية لكن علينا اعادة تعريفها بالكلمة override . هذه ميزة فريدة للباسكال الشيئية. الجافا:وهنا جميع المناهج تستخدم الاستدعاء المتأخر, إلا إذا قمت يدويا بتمييزها على أنها مناهج نهائية (final methods) والمناهج النهائية لا يمكن اعادة تعريفها وأسرع للاستدعاء. والفرق بين الجافا و السي في هذه الميزة فالسي تستخدم الاستدعاء المبكر افتراضيا على عكس الجافا انما مرده لأن السي صممت للحصول على أكفأ ما يمكن من البرمجة الشيئية. ملاحظة:الاستدعاء المتأخر للمناهج البناءة والهدامة: فالباسكال على النقيض من اللغتين الأخريين في هذه الناحية فهي تسمح بتعريف منهج بناء أو هدام وهمي . 17.المناهج والاصناف المجردة (abstract methods and classes) عند بناء شجرة وراثية تتصف بالتعقيد او الضخامة, كثيرا ما يحاول المبرمجون انتاج مناهج في الأصناف الأولى, للحصول على تعدد للأوجه, حتى لو لم يتم اعادة تعريف هذه المناهج في الأصناف المشتقة فيما بعد. بالاضافة إلى ترك جسم المنهج فارغا, فإن لغات البرمجة الشيئية تستخدم طرقا خاصة لتمثيل هذه الميزة, وعليه فالاصناف المجرة هي تلك التي تحتوي على منهج مجرد واحد على الأقل (استخدمت اللفظ مجرد للدلالة على abstract) C++:وتدعى بالمناهج المجردة أو الوهمية الخالصة ويستخدمون الواصفة (=o) لتعريف هذه المناهج. والاصناف المجردة هي التي تحتوي على منهج او اكثر من هذا النوع او انها أسلاف لاصناف مجرة. لا يمكن بناء كائنات تابعة لأصناف مجردة. الباسكال الشيئية: وتستخدم الكلمة abstract لتمييز هذه المناهج, وهنا انت تستطيع بناء كائنات من هذه الاصناف لكن المترجم سيعطيك تحذيرا من ذلك تاركا المخاطرة باستدعاء هذه المناهج والحصول على خطأ في وقت التنفيذ وتوقف البرنامج عن العمل على عاتق المبرمج. الجافا: وهنا كلا الأصناف والمناهج المجردة يجب تمييزها بالكلمة abstract (بشكل إلزامي). وكذلك فإن الأصناف الأسلاف لأصناف مجردة يجب تمييزها بنفس الكلمة وإن لم تعرف كل المناهج المجردة السابقة. و الأمر مشابه للسي فلا يمكن تعريف كائنات من هذه الأصناف. 18.الوراثة المتعددة والواجهات (Mutiple Inheretance and Interfaces) بعض لغات البرمجة الشيئية تسمح بان تشتق صنفا جديدا من اكثر من أب و البعض الآخر لا يسمح إلا بصنف أب واحد, لكن بدلا عن ذلك فإنها تسمح بالوراثة من اكثر من واجهة أو أصناف مجردة خالصة. C++:وهي الوحيدة بين اللغات الثلاثة التي تسمح بالوراثة المتعددة وينظر لهذا على أنه صورة ايجابية من قبل بعض المبرمجين, وعيب من وجهة نظر الآخرين. ولكن الشيء الأكيد أن الوراثة المتعددة والمتكررة ستستحضر العديد من الأفكار الأخرى .. كالأصناف الوهمية والتي ليس من السهل السيطرة عليها, مع ذلك فهي قوية جدا, C++ لا تستخدم هذا المفهوم مع الواجهات علما بأنه من الممكن نقل الصورة بالوراثة المتعددة عن أصناف مجردة خالصة. الجافا:وحالها حال الباسكال لا تعرف الوراثة المتعددة لكن لديها دعم كامل للواجهات ومناهج الواجهات تسمح بتعدد الأوجه, وتستطيع استخدام كائنات عن هذه الواجهات, فالصنف ممكن ان يشتق من صنف آخر وحيد او من اكثر من واجهة. على الرغم من ان هذا لم يكن مخططا له بصورة متقدمة والواجهات بالجافا ممكن مقابلتها مع نموذج ال COM بشكل جيد ,مثال: 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 الغير متوافقة مع المعايير.
Raed Filfel

الخاتمة:اللغات وبيئات التطوير: كما أشرت منذ البداية على الرغم من اني حاولت فقط المقارنة بين هذه اللغات فمن المهم وضع كل منها في سياقها الطبيعي. هذه الللغات موجهة لحاجات مختلفة, ووجدت لتحل مشكلات مختلفة بطرق مختلفة, وتستخدم في بيئات برمجية مختلفة جدا. بالرغم أن كلا من اللغة و بيئة البرمجة تنسخ كل منها ميزات الأخرى, إلا أنها بنيت لحاجات مختلفة بالعقل, وممكن الوصول إلى ذلك بمقارنة ميزات كل منها. C++: الهدف هو القوة والتحكم, والكثير من التعقيد الدلفي:والهدف هو السهولة, البرمجة المرئية,بدون كبير اهتمام بالقوة, وارتباط كبير بنظام الويندوز الجافا تسعى لقابلية النقل بدون كبير اهتمام بالسرعة, وتهتم بالبرامج الموزعة (أو تطبيقات الانترنت) يمكننا ان نقرر أن نجاح كل من هذه اللغات الثلاثة لا يعود إلى المميزات التي ذكرناها. الوضع المالي لشركة بورلاند, تحكم شركة مايكروسوفت بنظام التشغيل ويندوز, شيوع الجافا في عالم الانترنت (والذي ينظر له على أنه عداء لمايكروسوفت), مستقبل واجهات البرمجة بالويندوز Win32 Api ,دور الاكتف اكس, كلها متغيرات ممكن أن تحكم اختيارك للغة أكثر من المميزات الفنية . كمثال: ان لغة جميلة جدا مثل Eiffel التي اخذت عنها الباسكال والدلفي الكثير والكثير , لم تظهر ابدا في الأسواق العالمية , علما بأنها شاعت في الجامعات والمدارس.
orwa

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

إضافة تعليق جديد

لا يسمح باستخدام الأحرف الانكليزية في اسم المستخدم. استخدم اسم مستخدم بالعربية

Restricted HTML

  • وسوم إتش.تي.إم.إل المسموح بها: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • تفصل السطور و الفقرات تلقائيا.
  • Web page addresses and email addresses turn into links automatically.

دعوة للمشاركة

موقع الأيهم صالح يرحب بالمشاركات والتعليقات ويدعو القراء الراغبين بالمشاركة إلى فتح حساب في الموقع أو تسجيل الدخول إلى حسابهم. المزيد من المعلومات متاح في صفحة المجتمع.