2. :: :: بسم ال الرحمن الرحيم
:: :: تم اعداد الكتاب باستخدام برنامج
رخصة الكتابCreative Commons
http://creativecommons.org/licenses/by-nc-sa/3.0/us/
مرفق في النهاية مستند الترخيص
http://arabicplg.sourceforge.net/
Version 1.0 final release
4. :: مدخـــل ::
• بسم ال الرحمن الرحيم و الصلة و السلم علــى ســيد المرســلين محمــد و
اله الطاهرين ، اللهم صل على محمد و ال محمد كما صليت على ابراهيم و
ال ابراهيــم اللهــم و صــل و ســلم و ترحــم و بــارك علــى محمــد و ال محمــد
كأفضل ما صليت و باركت و ترحمت على احد من خلقك انك سميع مجيد.
• جائتني فكرة هذا الكتاب اللكتروني بعد ان قــرات كتــاب "حــرب البرامــج"
للكاتب الرائع كيث كرتس، و على الرغم من ان عملي هــذا لــم و لــن يصــل
الى مستوى عمل شخص في مستوى هذا المبرمج ، ل مــن حيــث الكــم "
003 صــفحة" و ل مــن حيــث المســتوى "خــبرة ســنين فــي البرمجــة مــع
ميكروسوفت و غير ذلك.
• ال ان هذا لم يمنعني من ان اشرع في كتيب يكون بمثابة دليل مختصــر الــى
لغات البرمجة متجنبا الطالة المملة و التفاصيل التقنية الدقيقــة او التوغــل
في شرح الكواد البرمجية التي من شأنها ان تبعد كل من ليــس لــه اهتمــام
بالبرمجة.
• عملي اذا في هــذا المختصــر هــو التعريــف بــالخطوط العريضــة بــاهم لغــات
البرمجة في عالمهـا الواسـع. مـع اضـافة تعريـف بـأهم المصـطلحات الـتي
يجب ان تعرف كي نستطيع من خللها قراءة تلك الخطوط العريضة.
• و هذه النسخة النهائية الولى اطرحها في منتداي المفضــل مجتمــع لينكــس
العربي ليماني بان الذي جعل المصادر الحرة عظيمة هو مبدا المشــاركة ،
لهذا انا اطمح في ان ارى القتراحات و النقد لهذه الصدارة كي نستمر في
مسلسل تطور هذا الكتاب من مسودة ابتدائيــة كمــا كــان قبــل ســنة و بضــع
شهور الى كتاب غني و مفيد خلل الشهور القادمة.
/http://arabicplg.sourceforge.net
Version 1.0 final release
5. • عليــه اشــكر كــل مــن ســاعدني و اخــذ بيــدي ســواء: بعبــارات شــكر و
استحســان ، نقــد بنــاء او اقــتراح مفيــد و اطمــح للمزيــد مــن المشــاركة و
المعونة.
• يوجد الكثير من المصطلحات البرمجيــة البحتــة طبعــا لــم اســتطع تفاديهــا و
ايضا لم يكن باستطاعتي اضافة تعريفهــا كلهــا خــوف الطالــة و لكــن قمــت
باضافة مقالة اضافية تعنــى بشــرح اهــم تلــك المصــطلحات مــع اســتعراض
سريع لهم نمــاذج البرمجــة و ذلــك نــزول عنــد رغبــة الكــثير مــن اخــواني
العضاء. و ايضا ارفقت في نهاية الكتاب مقالة تعنى بكيفية انشاء برنامج
بالقليل من الجهد و دراسة بعض جوانب التطوير و المــور الــتي يجــب ان
تأخذ في الحسبان في هذه العملية.
• تخصصــي فــي علــوم الحاســب اللــي طبعــا ل يعطينــي الخــبرة الكافيــة فــي
استعراض كل لغات البرمجة ، بل في حقيقة المر اللغات التي تعاملت معها
هي فقط بيرل كلغة اساسية و سي++ و جافا و سمول تولك و بي اتش بي
و قليل جدا من بايثون فكان هناك حاجة كبيرة للترجمة الصرفة في اللغــات
الباقية فارجو الشارة الى مواطن الخلل فــي اي مكــان مــن هــذه المقــالت
كي اقوم بتصحيحه ان وجد في الصدارات القادمة.
/http://arabicplg.sourceforge.net
Version 1.0 final release
6. :: مقدمة ::
• ل اريد ان امثل دور المبرمج المحنك هنا ، فأنا واقعا لست اهل لذلك، و لكـن
بحكم تخصصي في هذا المجال و اهتمــامي بالجــانب النظــري منــه خاصـة ،
احببــت ان اكتــب بعــض الســطر لمــن لــديهم اهتمــام بالبرمجــة و لكنهــم لــم
يقدموا بعد :
• هناك نقــاط كــثيرة يجــب ان تاخــذ فــي الحســبان قبــل الشــروع فــي تعلــم لغــة
برمجة، و لكن لحظــت ان المشــكلة الساســية عنــدنا هــي ليســت فــي عــدم
القدرة على اختيار لغة معينة بل في عدم العزم على التعلم ابتداء. من منا ل
يحب ان يقال عنــه مبرمــج ؟ خاصــة ان البرمجــة مثــل الرياضــيات يوصــف
اصحابها بالذكاء و العبقرية . الكثير منا يقــول و يتمنــى و يخطــط ان يكــون
مبرمجا عندما يقرا عن المبرمجين و المخترقين و قصص نجاح البرامج و
المواقع و لكن عندما يبدا اول خطــوة فــي الدراســة يعــرف ان هنــاك الكــثير
ليتعلمه و ان المادة ليست ممتعة كما كان يتصور و يبدا بالشعور بالممــل و
من ثم يترك ما شرع فــي قراتــه مــن كتــاب او دورة تعليميــة . هنــاك حكمــة
يابانية تقول " الطموح بدون عمل مجرد حلم يقظة ". شخصيا كنت اعاني
من هذه المشكلة و هي تكديس الكتــب و الــدورات و المحاضــرات و غيرهــا
على امل اني ساقراها و اشرع في تعلمها في وقت ما ! و الن لهــا ســنوات
و لم اقرا منها شي ! اذا هذه المشكلة الولى التي يجب ان نجتازها ! و هي
ان ندرك ان مجرد تحميل الكتب و الدورات التعليمية سواء في البرمجــة او
غيرها من الفنون لن يجعل منا شيئا ! بل هو البدء و الصرار في تعلم هذه
الشياء المملــة و المــواد الثقيلــة و اكمــال الكتــب و الــدورات الــى نهاياتهــا
بالضــافة الــى الممارســة و التفكيــر هــو مــا يضــيف الــى حصــيلتنا الشــيء
المفيد.
/http://arabicplg.sourceforge.net
Version 1.0 final release
7. • حسنا الن ، انت عازم على المواصلة و الجد في تعلم لغــة برمجــة معينــة و
لكنك ل تســتطيع ان تختــار اي لغــة تناســبك؟ هــذه المشــكلة الثانيــة و نــرى
الكثير من المواضيع من هذه الشاكلة ماذا اتعلم ؟ مــا هــي افضــل لغــة ؟ مــا
هي اقوى لغة ؟ ايهما القوى بيرل او بــايثون ؟ جافــا او ســي شــارب ! فــي
حقيقة المر ل يوجد شيء اسمه اللغة القوى و كل مــن يقــول هنــاك شــيء
من هذا القبيل فهو في حقيقة المر واهم ، فكل لغة قوية في جانب معيــن و
عادة ما يكون هو الجانب الذي انشئت من اجلــه اساســا، طبعــا يوجــد لغــات
تصلح لكل شيء تقريبا و لكن يبقى انها ل تقدم كفائة و انتاجيــة عاليــة فــي
كــل شـيء فمثل لغـة مخصصـة للـويب مثــل بـي اتـش بــي و ان كــان هنــاك
امكانيــة عمــل برامــج ســطح مكتــب بهــا فهــي لــن تكــون بقــوة و ســهولة و
انتاجية لغات البرمجة المخصصة لهذا الجانب و العكس صحيح . علــى هــذا
فسيكون الجواب على سؤالك هو: ما هو احتياجك؟ ماذا تريــد ان تبرمــج؟
هل تريد ان تتعلم لنفسك ام لسوق العمل ؟ و منه تختار لغة البرمجــة الــتي
تريدها، لهذا هذا الكتيب ربما يكـون جيـدا فـي اختيـار لغـة برمجتـك الولـى
فهــو يعرفــك بالهــداف الساســية الــتي انشــئت لهــا لغــات البرمجــة و اهــم
التطبيقات التي تستخدم فيها هذه اللغات. و النقطة الجديرة بالذكر ايضا هي
اطلعك على امثلة مــن طريقـة كتابـة الكـواد فـي لغــات مختلفـة باعتقــادي
الشخصي سيؤثر على اهتمامك و اســتمتاعك بلغــة البرمجــة الــتي تختارهــا
فهناك الكثير من المبرمجين يستخدمون لغات معينة لنهم يحبــون اســلوبها
فــي الكتابــة و ايضــا طريقــة معالجتهــا للمشـاكل البرمجيـة . مثل : اذا كنـت
تحب ان يكون كل شيء واضح في اسماء المتغيــرات و الكلمــات المفتاحيــة
و غيرهــا و تكــره اســتخدام الكــثير مــن الختصــارات و الرمــوز كــالقواس
الكثيرة في ليسب و القواس المعقوفة و ما الــى ذلــك فــذلك بــالطبع ســيؤثر
علــى اختيــارك. مثــاله : قــولهم عــن اقــواس لغــة البرمجــة ليســب ) جهنــم
القواس ( ، و لكن يقول الخر ) عندما وصلت الى مرحلة التنــوير ارتفعــت
القواس !( .
•
/http://arabicplg.sourceforge.net
Version 1.0 final release
8. ربما يستصغر البعض هذه النقطة و لكن في حقيقة المر هذه امور فطريــة
ل يمكــن تجاهلهــا! أل يمكــن ان تكــره قــراءة كتــاب لن خطــه لــم ترتــح لــه
عينك ؟ و ان كان هذا الكتاب الكثر مبيعا و غني بالمحتوى!
الشيء الهم هو:
• ان تعلم ان تعلمك لي لغة برمجـة سـيفيدك كـثيرا حــتى لــو انتقلـت الـى لغـة
اخرى .
• ان تعلم ان لغــات البرمجــة مبــاديء ان فهمتهــا ســهل عليــك النتقــال حســب
الحاجة الى لغة اخرى.
• لهذا نرى ان اغلب المبرمجين يعرفون اكثر من لغة و يســهل عليهــم التــأقلم
مع اي لغة جديدة يفرضها عليهم سوق العمل ، و كمثــال فــي بيــرل لــم اكــن
اعرف كيف اقوم بعمل برنامج ذو واجهة رسومية لننــي كنــت معتــاد علــى
عمل برامجي على الويب او سطر الوامر و لكن بعد تعلمــي مكتبــة Tkو
فهمي لكيفية عمــل الواجهــات الرســومية اســتطعت بكــل بســاطة و يســر ان
انقل برنامجي الى مكتبة wxperlو ايضا واجهة .. GTK
• لــذلك شخصــيا ارى الهميــة المطلقــة الــتي يغفــل عنهــا الكــثيرون للجــانب
النظري و المنطقي للبرمجة بدل التركيز على حفــظ الــدوال و الكــواد فهــذه
اشياء بسيطة جدا حتى يمكن الرجوع اليها بسرعة من خلل كتيب الــدليل ،
بل يجب ان نعرف كيف يعمل البرنامج ل كيف يكتب البرنامج .
/http://arabicplg.sourceforge.net
Version 1.0 final release
9. • شيء اخر يجب الشارة اليه هو عدم الهتمام كثيرا بمـا يشـاع عـن افضـلية
طريقة معينة في البرمجة ، مثل هناك اشارة دائمــة مــن خلل دراســتي فــي
الجامعة الى افضــلية البرمجــة الكائنيــة و لكــن يجــب ان نــدرك ان البرمجــة
الكائنية ليست دائما هــي الحــل الفضــل للمشــكلة ، توجــد مشــاكل و برامــج
استخدام البرمجة الكائنية فيها مجرد تطويل و تعقيد للحل ، و لكن طبعا في
برامج و نـواحي اخـرى سـيكون مـن الصـعب البرمجـة باسـتخدام البرمجـة
الجرائية بدل من البرمجة الكائنيــة فيهــا ، لــذلك دائمــا احــب ان اشــير الــى
اهمية الجانب النظري في البرمجة و هـو فهـم طــرق البرمجـة و مبادئهــا و
من ثم اختيار الطريقة الفضل .
• ايضا احـب ان اشـير الـى ان البرمجـة ممتعـة اذا كـانت تحـل مشـكلة نحتـاج
لحلها و ال ستكون البرمجة مملة و رتيبة و عــادة مــا نــترك المشــروع فــي
منتصفه ، مثل لينوس لم يشرع في كتابة نظامه ال من مشــكلة عاناهــا مــع
نظم التشغيل الموجودة في وقته و غيره من المثلة كثيرة ، و هنا نصل الى
نقطــة اخــرى و هــي ان البرامــج العملقــة ســيكون مــن الصــعب جــدا علــى
شخص واحد فقط تطويرها و كتابتها و هنا تظهر اهمية العمــل الجمــاعي و
الحتكاك بالمبرمجين الخرين و المشاركة في المحافل البرمجيــة و دراســة
اكواد الغير للعمل من حيث انتهى الخرون و ليس تضيع الــوقت فــي اعــادة
اختراع العجلة و تشتيت الجهود .
/http://arabicplg.sourceforge.net
Version 1.0 final release
10. • النقطة الخيرة التي احب ان اختم بها هــي مســألة الدراســة البرمجيــة ، فــي
الجامعــة نمــل و نتضــجر مــن الشــياء النظريــة الــتي نتعلمهــا و نريــد تعلــم
الشــياء الكــووول علــى مــا يقــال !.. و لكــن لحقــا نــدرك ان هــذه الشــياء
النظرية المملة هي اهم ما تعلمناه و نرى لحقا مكانها في عــالم البرمجــة ،
كمثال كان هناك شخص دائما يتضجر من البرمجــة لســطر الوامــر و يقــول
ان هذا شيء قديم اكل الدهر عليه و شــرب و انــه علينــا ان نتعلــم البرمجــة
الحديثة فما نفع برامج سطر الوامر .. و لكن فــي حقيقــة المــر الجامعــة و
الكتب بشكل عام تعلمك البرمجة لسطر الوامر لنها تركز على المنطق فــي
حــل المشــاكل البرمجيــة و ســطر الوامــر مجــرد اداة لســتلم المتغيــرات و
التفاعــل مــع المســتخدم ، لحقــا ادركنــا ان الواجهــات الرســومية و برامــج
الويب مجرد قشور ل تنفع اذا لم يكـن خلفهــا اكـواد برمجيـة سـحرية تعمـل
بصمت خلف الستار ! و ان الذي تعلم تلك الكواد و المباديء و تمكن منهـا
لم يجد صعوبة في ان يغلفها بواجهات حديثة مثل QTاو ..! GTk
:: &&& ::
/http://arabicplg.sourceforge.net
Version 1.0 final release
11. :: نماذج البرمجة و اهم المصطلحات ::
في البدء كان الصفر و الواحد …
ثم جاءت اللغات التجميعية ، الــى هنــا و نحــن نتكلــم عــن اللغــات منخفضــة
المستوى اي انها ذات ارتباط شديد بالعتاد ، و ان كنا مع اللغات التجميعيــة
بدانا الماكروز و بعض الخصائص التي سنراها لحقا في اللغــات الجرائيــة
بشكل اكثر تقدما .
ثــم بــزغ الفجــر الجديــد مــع اللغــات عاليــة المســتوى و ظهــرت البرمجــة
الجرائية لتعلن عن ظهور عصر الهتمام بالمشكلة البرمجية !..
فقبل ان نتكلم عن لغات البرمجــة يجــب ان نســلط الضــوء علــى اهــم نمــاذج
البرمجة و اهم المصطلحات المرتبطــة بهــا ليســهل علينــا لحقــا فهــم لغــات
البرمجــة مــن خلل قــراءة اســطرها العريضــة . و فــي نهايــة هــذه الفقــرة
سنتعرض لمصطلحات متنوعة.
Programing Paradigms
يجب ان ننتبه الى انه ل يوجد اي تعريف رســمي لي نمــوذج مــن النمــاذج
التية ، و نقاط الشتراك كثيرة فالحدود هنا ليست فواصل ل يمكن تجاوزها
فالبرمجة الشيئية في النهاية هي برمجة اجرائية بطبيعتها. و لكن ما يعنينا
في حقيقة المر هنا هو النقاط التي يركز عليها كل نموذج من هذه النمــاذج
حيث عليه تتغير طريقة تفكير المبرمج في نظرته و تحليله و حله للمشــاكل
البرمجيـة . و هـذه النمـاذج القليلـة المـذكورة هنـا هـي المهمـة و ال هنـاك
العديد و العديد من النماذج كما هنالك العداد المهولة من لغات البرمجة.
/http://arabicplg.sourceforge.net
Version 1.0 final release
12. :: Imperativeالبرمجة المرية ) اللزامية(
تصف الحوسبة من ناحية الجمل التي تغير حالة Stateالبرنامج. و تندرج
تحتها العديد من النماذج كما سيأتي..
:: Non-Structured Programingالبرمجة الغير منظمة
قبل البدء في الكلم عن النماذج المرتبة )الجرائيــة ، الكائنيــة ..( يجــب ان
نذكر بأنه في البداية كام هنــاك نمــوذج البرمجــة الغيـر مرتبـة. يوجــد لغــات
عالية و منخفضة المستوى تستخدم هذا النموذج منها:
MSX Basic
GWBasic
Focal Joss
Mumps
Telcomp
Cobol
Machin Level code
بعض نظم السمبلي
Assembly Debuggers
و بعض لغات السكربتنج مثل .MS-Dos Batch file Lang
البرمجة الغير منظمة تنتقد بعنــف لنهــا تنتــج اكــواد صــعبة القــراءة او مــا
يعرف بـ ) اكواد السبجتي!( لهذا ل تعتبر في بعض الوقات خيــار مناســب
للمشاريع المهمة و لكن في الجهــة المقابلــة يمــدحها البعــض للحريــة الــتي
توفرهـــا للمبرمـــج و يشـــبهونها بطريقـــة كتابـــة موتســـارت للمقطوعـــات
الموسيقية.
البرامج التي تكتب بهذه الطريقـة عـادة مـا تتكـون مـن مجموعـة اوامـر او
جمل متتالية )عادة كل جملة في سطر مستقل (.
/http://arabicplg.sourceforge.net
Version 1.0 final release
13. اما الســطر فتكــون مرقمــة او معنونــة ) (Labelsو مــن خلل هــذه الليــة
يمكن للبرنامج ان يقفز الى اي سطر برمجي.
البرمجة غير المنظمة توفر اساسيات اليات التحكم بسير البرنامــج و تــوفر
ايضا الـ Subroutinesو سنتكلم عن هذه الشياء بقليل من التفصيل فــي
البرمجة الجرائية.
يبقى ان نعرف ان البرمجة غير المرتبة تتيح لنا انواع البيانات الولية مثل
العداد و النصوص و القوائم .
:: Structured Programingالبرمجة المنظمة
البرمجــة المنظمــة كالبرمجــة الغيــر منظمــة تعتــبر احــدى شــعب البرمجــة
المرية ) احدى اهم و اكبر نماذج البرمجة(. و اشتهرت البرمجــة المنظمــة
بازالتها للجملة الشهيرة GOTOاو الحد من استخدامها.
و هناك ثلث منهجيات اكثر شهرة لكتابة البرامج المنظمة :
1 - طريقــة ادســجار دايجســترا حيــث هيكــل البرنامــج مكــون مــن مجموعــة
هياكل جزئية . بهذه الطريقة يمكن فهــم البرنامــج مــن خلل فهــم كــل جــزء
لوحده و به نتحصل على فصل و عزل للمهمات المختلفة.
2 - طريقة اخرى مشتقة من طريقة دايجسترا حيث يتم تقسيم البرنامج الــى
برامج جزئية مع وجود مدخل واحد فقط للبرنامــج و لكــن تعــارض و بقــوة
مبدء المخرج الموحد.
3 - طريقة جاكسون للبرمجة المنظمة و الــتي تعتمــد علــى محــاذاة البيانــات
المنظمة مع اجزاء البرنامج المنظمة.
/http://arabicplg.sourceforge.net
Version 1.0 final release
14. يوجــد علــى القــل ثلث طــرق اساســية لتصــميم برامــج البيانــات المنظمــة
مقترحة باسماء اصحابها :
1. J. Dominique Warner
2. Ken Orr
3. Michael Jackson
من المنظور الدوني يمكن ان نرى البرامج المنظمــة علــى انهــا مكونــة مــن
اليات تحكم مسار البرنامج تنقسم الى ثلث انواع :
: Sequenceو نقصد بها تنفيذ اوامر بترتيب تسلسلي منظم.
: Selectionو نقصــد بهــا تنفيــذ مجموعــة اوامــر اعتمــادا علــى حالــة
البرنامج و ذلك عادة مــن خلل الكلمــات المفتاحيــة : ..if.. then .. else
..switch..case
: Repetitionو نقصد بها تنفيذ اوامر معينة و تكرار عمليــة التنفيــذ الــى
ان يصل البرنامج الى حالة معينة أو تنفيذ مجموعة اوامر علــى كــل عنصــر
من عناصر مجموعة ما . و ذلك يتم عادة من خلل الكلمات المفتاحية :
while.. repeat .. for .. do while.. until
ربما يمر علينا مصطلح Block-Structuredو هو صفة للغات البرمجــة
التي توفر فــي طريقــة كتابتهــا الكلمــات المفتاحيــة مــع القــواس الــتي تضــم
الوامــر المجــزءة . امــا النــوع الثــاني هــو Comb-Structuredو هــي
اللغات التي توفر الية الكلمــات المفتاحيــة المتسلســلة الــتي تحتــوي بـداخلها
الوامر المجزءة . مثال الخير فــي لغــة Adaالــ Blockمكــون مــن اربــع
اجزاء :
DECLARE BEGIN EXCEPTION END
/http://arabicplg.sourceforge.net
Version 1.0 final release
15. :: Proceduralالبرمجة الجرائية
تعتمد على عملية توفير الخطوات اللزمة لكي يصــل البرنامــج الــى الحالــة
المطلوبة. و هي من اقدم النماذج و اكثرها انتشــارا و قريبــة جــدا للطريقــة
الفطرية في التفكير. و سنستعرض بعض اهــم المفــاهيم الــتي تتعامــل معهــا
باختصار ...
المتغيرات :Variables
في البرمجة كما هو الحال في الرياضيات هناك حاجة ماسـة للتعامـل مـع المتغيـرات و ل
يخلو برنامج ما من متغير ال في حالت نادرة جـدا . ابسـط انـواع المتغيـرات هـو الـذي
يحمل قيمة واحدة فقط . مثل ص = 21. في هذه الحالة ص متغيـر يحمـل قيمـة معينـة
Valueو لكن هذه القيمة متغيرة فهي ليست ثابتة طالما البرنامج فـي طـور التنفيـذ فـي
اي لحظة ممكن تتغير هذه القيمة . بعض لغات البرمجة مثل جافـا تسـتوجب تحديـد نـوع
المتغير فاذا كان المتغير من نوع حرف مثل فل يمكن اسناد قيم رقمية للمتغير و لكـن فـي
لغات البرمجة الديناميكيةمثل بيرل و بي اتش بي ل يوجـد مثـل هـذا التقيـد فـالمتغير ص
مثل يمكن ان يحمل اي قيمة رقمية او نصية ..ألخ .
مثال:
;1 = my $number
في هذا المثال اعلنا عن المتغير و في نفس الوقت اسندنا له قيمــة و هــي 1
كان بالمكان ان نعلن عن المتغير فقط دون اسناد اي قيمة :
;my $number
/http://arabicplg.sourceforge.net
Version 1.0 final release
16. مثال اخر :
;”my $name = “ali
;”$name = “Tomy
في هذا المثال المتغير كان يحمل قيمة علي و لكن تم تغيير القيمة الى تومي
و سيظل المتغير يحمل اسم تومي الى نهاية البرنامج اذا لم يتم اعادة تغييــر
هذه القيمة.
القوائم :Arrays
طيب ماذا لــو كنــا نريــد ان ننشــيء متغيــر و لكــن يحمــل عــدة اســماء . مثل
اسماء اصدقاء البيئة. يمكننا ان نستخدم القــوائم او اللســتة و هــي متغيــر و
لكن يحمل عدة قيم بداخله و ذلك بحســب ترتيـب رقمـي فاللسـتة تبـدا مـن 0
للعنصر الول و 1 للعنصر الثاني ..الخ
مرة اخرى هنــاك لغــات برمجــة تطلــب تحديــد نــوع العناصــر الموجــودة فــي
القائمة و لغات ل تطلب، مثالنا هنا قائمة باسماء طلب ..
;my @array = qwali yasser salman
الن المتغيــر arrayيحمــل ثلث قيــم علــي و ياســر و ســلمان و يمكــن
الوصول الى كل قيمة بتحديد رقم القيمة :
;]0[print $array
/http://arabicplg.sourceforge.net
Version 1.0 final release
17. هذا المر مثل سيطبع لنــا القيمــة ذات الــترتيب 0 و هــي بعبــارة اخــرى اول
قيمة موجودة و في مثالنــا هــي علــي. طبعــا هكــذا يمكننــا اضــافة عناصــر و
ازالة عناصر بكل بساطة.
:Null value
و هي القيمة الغير معرفة و ل تعني الصفر كما يتوهم البعض . مثل العلن
عن متغير بدون اسناد قيمة سيحتوي على قيمة غير معرفة ، و من الشياء
الساسية في اختبار البرامج البحث عن القيم الغير معرفــة و يمكــن التحقــق
بأن المتغير يحمل قيمة باليات مختلفة منهــا الدالــة definedفــي بيــرل ، و
مثالها :
;my $number
{))if (defined($number
};print $number
}"else {print "undefined value
الهاش :Hash
يوجد نوع اخر من المتغيرات يشبه القوائم الى حد كبير اسمه الهاش و لكن الختلف هنا
ان القيم تمثل على شكل مفتاح keyو قيمة . valueبعبارة اخرى كنا في القوائم نشير
الى القيم باستخدام مفاتيح رقمية 0...* و لكن في الهاش يمكننا نحن ان نحدد المفاتيح و
التي يجـب ان تكـون مميـزة و غيـر مكـررة و بـذلك نسـتطيع تمثيـل قاعـدة بيانـات مثـل
القواميس و دليل الهاتف ..الخ
/http://arabicplg.sourceforge.net
Version 1.0 final release
18. مثال:
/my %hash= qw
0555555 ali
0666666 yasser
;/0899999 basem
فــي هــذا المثــال قمنــا بانشــاء هــاش يحمــل ارقــام المــوظفين و لن ارقــام
التليفونات عادة مميزة و غير مكررة قمنا بجعلها مفاتيح للوصول الــى اســم
الموظف المطلوب .
مرة اخرى يمكننا التعديل على كل عنصر في الهاش لوحده او نقــوم بعمليــة
على جميع العناصر، و ادناه مثال يطبع كــل القيــم الموجــودة فــي الهــاش و
سنتكلم عن دوائر التكرار بعد قليل :
)foreach $phoneNumber(keys %hash
}"{print "$phoneNumber = $hash{$phoneNumber} n
مسار البرنامج : Workflow
عندما نكتب برنامجا سيكون علينا في اغلب الحيان التحكـم فـي سـير البرنامـج اعتمـادا
على المتغيرات و طلبات المستخدم ، فقط في البرامج البسيطة ل نحتاج الى تغييــر مســار
البرنامج .
/http://arabicplg.sourceforge.net
Version 1.0 final release
19. في هذه الحالة سيقوم المفسر بتنفيذ الوامـر مـن البدايـة الـى النهايـة و ينتهـي البرنامـج
بشكل تسلسلي ، Sequencedمثال:
;1= {my $number
;2= 2my $number
;2print $number+$number
}
في هذا المثال سيقوم البرنامج بانشاء متغير و يسند له قيمة و متغيــر ثــاني
و يسند له قيمة و في النهاية يجمع القيمتين و يطبعهما الى الشاشة .
نلحظ عدم وجود اي تشـعب فـي البرنامـج . و لكـن هـذا كمـا قلنـا للبرامـج
البسيطة و لكن في اغلب الحيــان ســنحتاج الــى ادوات للتحكــم بســير العمــل
Control Structeresو مرة اخرى كل لغة برمجة توفر اليات مختلفة و لكن سنأخذ
بعض المثلة الدارجة :
الجملة الشرطية :If
باستخدام ifو الـتي تعنـي "اذا" نسـتطيع ان نحصـر تنفيـذ جـزء معيـن مـن البرنامـج
بحسب الشرط. مثال:
)"if ($user eq "Ali
}"!{print "Access granted
/http://arabicplg.sourceforge.net
Version 1.0 final release
20. هذا مثال بسيط لدينا عبارة تأكيد دخــول و لكــن ل نريــد ان نطبعهــا لكــل مــن
يدخل الى برنامجنا، فقط في حالة تحقق الشرط نطبع العبارة . الشرط هو ما
بين القوسين الذين يليان كلمة ، ifو في هــذه الحالــة الشــرط هــو ان يكــون
المتغير يحمل قيمة . Ali
جميل، الن نستطيع ان ننفذ امر اخر اذا كــان الشــرط غيــر متحققــا . و ذلــك
يتم عن طريق استخدام كلمة . else
}"else{ print "I don't know you
الن البرنامــج عنــدما يصــل الــى الجملــة الشــرطية و يــرى ان الشــرط غيــر
متحقــق ســينفذ مــا هــو موجــود فــي elseو فــي مثالنــا يطبــع جملــة انــا ل
اعرفك !.
يمكننا ايضـا اضــافة مزيـد مـن الشـروط لنفـس الجملـة الشـرطية باســتخدام
) elsifحرف eمحذوف عمدا في لغة البرمجة بيرل( .
)"elsif($user eq "fatima
}"!{print "Hi fatima
الن ســيقوم البرنامــج بــالتحقق مــن الشــرط الول و اذا كــان غيــر متحققــا
سيذهب الى الشرط الثــاني و يتأكـد هــل قيمــة المســتخدم فاطمـة ؟ فــاذا كــان
الشــرط متحققــا ســيطبع الجملــة المناســبة و ال ســيذهب الــى elseو يطبــع
الجملة انا ل اعرفك !.
/http://arabicplg.sourceforge.net
Version 1.0 final release
21. :Unless
الجملة الشرطية Unlessتعمــل بعكــس الجملــة الشــرطية ifتمامــا . فكأننــا
نقول اذا كان الشرط غير متحقق افعل كذا و كذا . بعكس ما كنا نفعــل فــي if
حيث كنا نقول اذا كان الشرط متحقق فافعل كذا و كذا ..
مثال :
)01 == unless($a
{
;"01 print "The number isn't
}
في هذا المثال سيقوم البرنامج بطباعة جملة " هذا الرقم ليــس 01” مــا دام
ان الشــرط فــي العلــى غيــر متحقــق و بــالطبع كنــا نســتطيع ان نكتــب هــذا
بطريقة ifو لكن سيكون الشرط بالنفي و ليس باليجاب … هكذا :
)01 =! if ($a
{
;"01 print "The number isn't
}
/http://arabicplg.sourceforge.net
Version 1.0 final release
22. دوائر التكرار:
في بعض الحيان نحتاج ان نكرر تنفيذ اوامر معينة ، و هنا تأتي دوائر التكرار .. عادة ما
يرافق كل دائرة تكرار عداد لديه قيمة صغرى و قيمة كـبرى لكـي تنتهـي عمليـة التكـرار
عنـد الوصـول للقيمـة الكـبرى و بـذلك نضـمن عـدم اسـتمرار التكـرار الـى مـا ل نهايـة
.infinite loop
لنبدا بالــ for loopمثالها على طريقة السي :
)++for ($a=0;$a<10;$a
}"{print "loop $a
نلحظ ان بعد كلمة forيوجد قيمة صــغرى لبدايــة العــداد و مــن ثــم الشــرط
الذي ستتحقق منه الدائرة عند تنفيذ كــل دورة و هــو هنــا ان يكــون المتغيــر
اقل من 01 . و في النهاية سنزيد قيمة العداد +1 مــع انتهــاء كــل دورة .. و
بذلك ستنفذ الوامر التي بين القواس المعقوفة 01 مرات لنحصل على هــذا
الناتج :
loop 0loop 1loop 2loop 3loop 4loop 5loop 6loop 7loop
9 8loop
ايضا يمكننا ان نمرر قائمـة بيـن قوســي الــ forمثل مــن 1 الـى 01 حيــث
ستكون القيمة الصغرى واحد و القيمة الكبرى 01.
/http://arabicplg.sourceforge.net
Version 1.0 final release
23. )01..1( for
{
"print "looping 10 times!n
}
هنا سنطبع الجملة التي بين القواس المعقوفة 01 مرات.
:Foreach
طريقة عملها مشابهة للـ forو تختلف قليل بين كل لغة و اخرى و لكن في
بيرل عادة ما نستخدمها مع القوائم...مثل :
;/my @list = qw/Ali Sara Yosra Mamdoh
{)foreach (@list
;"print $_, " You are a member of the family!n
}
في هذا المثال نلحظ ان لكل عنصر من عناصر القائمة ســيتم طباعــة اســمه
و مــن ثــم طباعــة الجملــة !You are a member of the family
امامه . فتكون النتيجة :
/http://arabicplg.sourceforge.net
Version 1.0 final release
24. !Ali You are a member of the family
!Sara You are a member of the family
!Yosra You are a member of the family
!Mamdoh You are a member of the family
: While
دائرة التكرار whileتقوم بعملية مشــابهة ايضــا فهــي تقــوم بتكــرار تنفيــذ
اوامر معينة عدد مرات محددة مازال الشرط متحققا .
مثال:
;01 =$a
)0 =! while ($a
};--{print $a
في هذا المثال سنتأكد مــن الشــرط هــل المتغيــر ل يســاوي صــفر؟ اذا كــانت
الجابة نعم سيتم طباعة قيمــة المتغيــر مــع انقاصــها -1 . فــاذا كــان الشــرط
متحققا تنتهي الدائرة مع وصول المتغير للقيمة 0 . في مثالنا اذا ســيتم العــد
التنازلي من 01 الى 1 ...
12345678901 :Ouputs
/http://arabicplg.sourceforge.net
Version 1.0 final release
25. do while
في بعض الحيان نريد ان نقوم بعملية التكرار مرة واحدة علـى القـل بغـض النظـر عـن
كون الشرط متحققا او ل هنا نستخدم .. do while
;01=my $a
{ do
;"print "this is a do while loop
;++$a
}
;)01< while ($a
نلحظ هنا ان الوامر الموجودة داخل القواس المعقوفة سـتنفذ علـى القـل مـرة واحـدة
حتى لو كان الشرط الموجود في whileغير صـحيح . فـي مثالنـا قيمـة المتغيـر 01 و
الشرط هو ان نقوم بتنفيذ الوامر اذا كان العدد اصغر من عشرة لهذا الشرط غير متحقق
و لكن لننا استخدمنا do whileفسيتم تنفيذ الوامر مرة واحدة و من ثم تقييم الشــرط
و بما انه غير متحقق سنخرج من التكرار .
:Until
untilتقوم بعملية عكسية لما تقوم به whileفهي تبدا بشرط غير متحقـق بـدل مـن
الشرط المتحقـق فـي whileو سـتنتهي الـدائرة عنـدما يصـبح الشـرط متحققـا بخلف
whileالتي تنتهي عندما يصبح الشرط غير متحققا .. مثال:
/http://arabicplg.sourceforge.net
Version 1.0 final release
26. ;01 = my $controller
)02 == until ($controller
{
;"print"going up until 19n
;++$controller
}
في هذا المثال سنقوم بالصعود بداية من 01 و انتهاء الى 91 حيث ســيكون
الشرط متحققا عند وصول المتغير الى قيمة 02 و بذلك ينتهي التكرار ..
:Given-When
في بعض الحيان بدل من الكثار مـن الجمـل الشـرطية if elseيمكننـا ان نحـدد مسـار
البرنامج بالية اسهل و اجمل للكتابة حيث سنقوم بتحليل قيمة المتغير و بنـاء علـى قيمتـه
سنتخذ الجراء المناسب:
{) given( $name
}"when("Ali"){ say "welcome $name your are the 1st
}"when("Saleh"){say "welcome $name your are the 2nd
/http://arabicplg.sourceforge.net
Version 1.0 final release
27. when("Hashem"){say "welcome $name your are the
}"3d
}}"default{say "I don't know you
نلحظ هنا كيف ان البرنامج سيختبر قيمة المتغيــر nameو عليــه ســيتخذ
الجراء المناسب فنحن هنا باسـتخدام كلمـة whenسـنحدد القيـم المتوقعـة
مثل ان يكــون الســم علــي او صــالح او هاشــم و ل ننســى ان نمــرر قيمــة
افتراضــية فــي حــال كــانت قيمــة المتغيــر ل تتطــابق مــع اي مــن القيــم الــتي
توقعناها فـ defaultهنا تعمل عمل elseو هي الحالة العامة .
Switch case
المثــال اعله علــى طريقــة بيــرل و لكــن فــي بعــض اللغــات الخــرى طريقــة
الكتابة تختلف و ان كان المفهوم واحدا فبــدل مــن given whenنســتخدم
switch caseحيث switchتاخذ المتغير المراد اختبــاره و caseتاخــذ
القيم المتوقعة … مثال:
;use Switch
{) switch ( $name
}"case "Ali" { say "welcome $name your are the 1st
}"case "Saleh" {say "welcome $name your are the 2nd
case "Hashem" {say "welcome $name your are the
}"3d
/http://arabicplg.sourceforge.net
Version 1.0 final release
28. }"else {say "I don't know you
}
Expression Modifiers
في اللغة هناك تراكيب مختلفة للجملة مثل "اسمي علي" او "علي هو اسمي" تركيبين
مختلفين لنفس المعنى . في اللغات البشرية تتاح هذه المكانيـة لتفيـد معنـى التأكيـد علـى
جزء معين من الجملة .
مثل علي و خالد ذهبا لحفل التخرج . ماذا لو كنا نريد التأكيد على الحفل و ليس على مــن
ذهب للحفل نسـتطيع ان نقـول لحفـل التخـرج ذهـب علـي و خالـد ! هنـا سـنركز اهتمـام
السامع الى كلمة حفـل التخـرج . معـدلت التعـابير Expression modifiersتعمـل
بمثل هذه اللية فهي تعكس ترتيب الجمل الشرطية و دوائر التكـرار و هـذه امثلـة نلحـظ
كيف ان الشرط يقع في نهاية الجملة بعد المر الذي سينفذ في حال كان الشرط متحققا:
;1 = $bool
;5 = $a
;say "I am in love" if $bool
;say "false" unless $bool
;9 < say "my name is", ($a++) while $a
/http://arabicplg.sourceforge.net
Version 1.0 final release
29. Regular Expressions
او باختصار Regexهي التعابير المعتادة و توفرها لغات البرمجــة للتعامــل
مع النصوص و المدخلت بالضافة الى استخدامها في ادوات و اوامر ادارة
النظم بكثرة. طبعا هذه عالم في حــد ذاتهــا و لكــن نختصــر فنقــول انــه هنــاك
رموز توفرها اللغة ) ايضا تختلف من لغــة الــى اخــرى( لكــي تســهل عمليــة
التعامل مع النصوص كعملية اجتزاء جزء معيــن او البحــث عــن نــص بهيئة
معينة. و سنأخذ بعض المثلة فقط لتقريب الفكرة ...
1- if($string =~ m/(A|E|I|O|U|Y|a|e|i|o|u|y)/) {print
}""String contains a vowel!n
;/2-$string =~ s/Ali Yami/Ali Qahtani
/]3-Change everything to upper case: $string =~ tr/[a-z
;/][A-Z
/]4-Change everything to lower case $string =~ tr/[A-Z
;/][a-z
في المثال الول قمنا باختبار النص هــل يوجــد فيــه احــد حــروف العلــة ؟ اذا
كان الجواب نعم سنطبع جملة تؤكد هذا المر.
في المثال الثاني قمنا باستبدال علي اليامي بعلي القحطاني كمــا نعمــل find
and replaceفي برامج الوفيس.
/http://arabicplg.sourceforge.net
Version 1.0 final release
30. في المثــال الثــالث قمنــا بتحويــل النــص الــى الحــروف الكــبيرة و فــي المثــال
الخير الى الحروف الصغيرة . ما يهمنا هو // حيث بين هذين نضع التعابير
المعتادة و المر المهم الخر هو ما قبل // حيث نضع المعامل مثــل sمعامــل
الستبدال .
:: Event – Drivenالبرمجة المعتمدة على الحداث
هنـا مسـار البرنامـج يحـدد مـن خلل الحـوادث ، مثل : الحساسـات او مـن
خلل المستخدم كالنقر على الفأرة او رسائل من برامج اخرى او مــن خلل
.threadsعادة نتعامل مع هذه النوعية من البرمجــة جنبــا الــى جنــب مــع
برمجة الواجهات الرسومية فهي توفر الية الربط بين الواجهات الرســومية
و الكواد البرمجية و قد تكلمت عن اهم مباديء هذه الطريقة فــي البرمجــة
في المقالة المرفقة " انت تعرف الكثير ! اكتب برامجك الشخصية"، حيــث
سنستعرض كيفية انشاء برنامج يبني بثقل على هذه الطريقة.
:: Object Orientedالبرمجة الشيئية ) الكائنية(
الطريقة المتداولة للبرمجة و الكثر شهرة في اوســاط الشــركات الكــبيرة و
حتى الجامعات هذه اليام . البرمجة الشيئية ليســت مفهومــا جديــدا بــل لهــا
من القدم و التاريخ ما يشهد على نموها و تبلورها علــى مــدى عــدة لغــات
برمجية تبنت هذه النظرة ، و لكن تتبع الجـانب التـاريخي ليـس مكـانه هـذه
العجالة.
قبل ان نتكلم قليل عــن البرمجــة الشــيئية يجــب ان نعــرف لمــاذا لقــت هــذه
الطريقة في البرمجة نجاحا واسعا بحيث ان اللغة التي ل تدعم هــذه الرؤيــة
البرمجية و ل تتيح الدوات اللزمة لكتابة برامج شــيئية تعتــبر ناقصــة فــي
نظر الخبراء و الشركات ؟
/http://arabicplg.sourceforge.net
Version 1.0 final release
31. و لهذا نرى ان حتى اللغات التي لم تكتب اصــل علــى النمــوذج الشــيئي فــي
وقت لحق يتم اضافة الــدعم لهــذا النمــوذج ، و كمثــال لغــة البرمجــة بيــرل
التي هي لغة اجرائية في الصل و لحقا تم اضافة النموذج الشــيئي للغــة و
لغة البي اتش بي و غيرها الكثير من اللغات .
و ليس ما يهمنا هنا هو كيف تطبق كــل لغــة مفهــوم الكــائن ؟ و مــاذا يعنــي
الكائن خلف الستار .. و لكن نعم السؤال المهم هنا ؟ لماذا كل هذا الهتمام
بالبرمجة الشيئية مع ان اغلبنا دخلنا عالم البرمجة مــن منطلقــات مختلفــة؟
قد يكون المنطلــق الجــرائي اكثرهــا قرابــة للبداهــة! لمــاذا هنــاك مباهــاة و
مقارنات بين مستوى دعم كل لغة للبرمجــة الشــيئية ؟ و هنــاك ســؤال مهــم
اخر هل الفضلية للغات البرمجة الشيئية الصرفة مثل سمولتولك و ايفل او
للغات الهجينة الخرى التي تتيح نوعا من المرونة و ل تجبر المبرمــج فــي
ان ينظر لكل شيء على انه كائن ؟
شخصيا افضل الطريق الخيــر لنــه حــتى لغــات البرمجــة الكائنيــة الصــرفة
تختلف في تطبيق مبــادئ و مفــاهيم البرمجــة الشــيئية فلكــل وجهــة نظــر و
رؤى لمعالجة الموضوع محل الخلف ، لذلك المرونة دائما سلح جيد لكــل
لغــة برمجــة ، و ل اقصــد المرونــة بمعناهــا الضــيق مثل فــي العلن عــن
المتغيرات بل اريد المعنى الوسع و هو حرية المبرمج في معالجة المشكلة
بالطريقة و الرؤية التي يختارها فتكون اللغة اداة و ليست عقبة .
لذلك احب لغات البرمجة كلغـة بيـرل الـتي تجعـل مـن الحريـة شـعارا لهـا و
توفر للمبرمج عدة طرق لحل المشكلة يختار منها ما يشاء و يبدع ما يشاء
بدون ان تجبره اللغة على طريق معين .
على انه هنا ايضا اختلف و الكثير يرون ان هــذا المــر ســلح ذو حــدين و
في اغلب الحيان يرجحون كفــة الجــانب الســلبي فنســمع عبــارات مثــل ) ل
يمكــن قــراءة اكوادهــا ( او ) تعطيــك الحبــل و الكرســي لتشــنق نفســك ( و
غيرها من العبارات التهكمية .
/http://arabicplg.sourceforge.net
Version 1.0 final release
32. و يفضلون الشعار المغاير ) هناك طريقــة واحــدة فقــط لعمــل هــذا ( و ذلــك
باعتبارهم يفيد التنظيم و يساعد على بناء المشــاريع العملقــة ، لــن احــول
الموضوع هنا الى مناقشة طويلة و ل انتصارا لطــرف علــى حســاب طــرف
اخــر لكــن ساستشــهد بمقولــة للمبرمــج الكــبير بــول غراهــام حيــث يقــول
مضمونا ) اننا كنا ل نعير الشركات الــتي تطلــب مــبرمجين جافــا اهتمامــا و
لكننا كنا نخشى الشركات التي تطلب مبرمجين ليســب او بيــرل لننــا حينهــا
نعلم انهم يريدون مبرمجين حقيقييــن !(. و فـي مكـان اخـر يقـول ) ان سـر
نجاحنا هو استخدامنا لليسب و لكن يبدو ان ل احد مهتم بسرقة سر نجاحنا
! (.
بعد كل هذا الستطراد لنذكر شيئا من مزايا البرمجة الشيئية :
1 - البساطة : حيث ان الكائنــات الوهميــة تحــاكي الكائنــات الحقيقيــة ، ذلــك
يؤدي الى تقليل التعقيد و هيكل برامج واضح للغاية و سهل الفهم.
2- سهولة الصيانة : حيــث ان عمليــة الصــيانة ســتكون ســهلة و ســنعرف
مكان الخطاء بالتحديد لن كل كائن له استقللية تامة.
3 - اعادة الستخدام : حيث ان الكائنــات يمكــن اعــادة اســتخدامها فــي عــدة
برامج.
4- التطوير : حيث ان عملية التوسع ستكون سهلة من خلل اضـافة اعـداد
قليلة من الكائنات الجديدة او التعديل المباشر علــى الكائنــات الموجــودة ، و
ذلك استجابة لي تغييرات او تحديات جديدة تفرضها بيئة التشغيل.
5 - التكاملية و تقليل العتمادية : حيـث ان كـل كـائن يمثـل كيانـا منفصـل ،
حيث ان العمل الداخلي للكائن منفصل عن اجزاء النظام الخرى.
6- سهولة التعديل : فهناك سهولة في اجراء اي تغييرات طفيفة في تمثيــل
البيانات او الجراءات في البرامج الشيئية. لن التغييرات داخــل اي كلس
ل تؤثر على الجزاء الخرى للبرنامج، حيث ان الطريقة الوحيدة للعالـــــم
/http://arabicplg.sourceforge.net
Version 1.0 final release
33. الخــارجي فــي التصــال بهــذا الكلس هــو عــن طريــق واجهتــه باســتخدام
ميثودز الكلس نفسه.
الن ما هي البرمجة الشيئية ؟
هي بكل بساطة عملية محاكاة الواقع في البرمجــة هــي النظــر الــى الوجــود
على انــه مجـرد اشـياء او كائنــات Objectsو مــن ثــم محاكــاته فــي عــالم
البرمجة . كل شيء في هذا الوجود يمكن ان ينظر اليه على انه كائن و كــل
كــائن لــه خصــائص)ســمات( Attributesو افعــال . Methodsانــواع
الخصائص Field typeثابتة كان تكون قيمة رقمية او نصية و لكــن قيـم
الخصائص Field Valueيمكن ان تختلف من حالة الى اخـرى . الكلس
Classهو عبارة عــن قــالب ننشــيء منــه الكائنــات حيــث داخــل كــل كلس
سيتم تعريف خصائص و افعــال كــل كــائن مــن هــذا الكلس علــى انــه يجــب
النتبــاه الــى انــه عــادة ل يعتــبر الكلس كائنــا فــي حــد ذاتــه ال فــي اللغــات
الكائنية الصرفة . اذا عرفنا الن ان الكلس هــو مجــرد قــالب جــاهز لصــنع
كائنات من نوع ما .
نــأتي الن لنشــير الــى وجــود نــوع اخــر مــن الكلســات و هــو مــا يســمى
بالكلسات المجردة Abstract Classهذه الكلسات مهمتهــا تنظيميــة
فقط و ل يمكن انشاء اي كائن منها مباشرة بل يجب ان يكــون هنــاك كلس
يرث الكلس المجرد و ان ل يكون هو بدوره كلسا مجردا حينها فقط يمكن
ان ننشــيء كائنــات تحتــوي علــى خصــائص الكلس المجــرد . هنــا ذكرنــا
مصــطلح الوراثــة Inheritanceو هــو بكــل بســاطة عمليــة انتقــال كــل
خصائص و افعال الكلس الب الى الكلس البن . لنأخذ بعض المثلــة قبــل
ان نواصل …
/http://arabicplg.sourceforge.net
Version 1.0 final release
34. لنتخيل هناك مصنع للسيارات و نريد ان نحاكيه بالرؤيــة الشــيئية يمكــن ان
نبسط الى شيء مشابه الى:
abstract class Vehicle
abstract class Sedan
class Camry
نلحظ اننا انشأنا سلسلة من الكلسات لتنظيم المور حيث انه بــدانا بكلس
مجــرد باســم ) Vehicleمركبــة( و فيــه ســنعرف الخصــائص و الفعــال
الساسية التي يجب ان تحتويهــا كــل مركبــة ثــم انشــانا كلس مجــرد باســم
سيدان يرث كل ما في كلس فيهكل و يضيف عليها خصــائص و افعــال كــل
عربة من نوع صالون اخيرا انشأنا كلس باسم كامري يرث كــل خصــائص
سيدان و يضيف عليها مميزات و هوية الكامري التي نعرفها .
هنا يطرح السؤال لماذا نجعل من سيدان و فيهكل كلسات مجردة ؟ لماذا ل
نتركها كلسات طبيعية اليس الغرض فقط هو الوراثة ؟ فيكون الجواب بكل
بساطة لننا نعلم مسبقا اننا لن ننشيء اي كائن مــن هــذه الكلســات و هــذه
عادة برمجية جيدة يجب النتباه لها و على المستوى المهنــي يتخــذ القــرار
فيها وقت التخطيط . Design
نلحظ ان المخطط الن قابــل جــدا للتطويــع و التعــديل فــي وقــت لحــق مثل
باضافة مزيد من انواع السـيارات بـل و فئات السـيارات . فـي المثـال اعله
كان المخطــط ينحــو منحــى عــامودي بطــبيعته اي سلســلة مــن العلــى الــى
السفل و لكن مع محاكاة امثلــة اكــثر تعقيــدا ســيبدو شــكل المخطــط و كــانه
شــجرة ذات غصــون متفرعــة تصــلح لن تحــاكي الظــواهر الطبيعيــة قبــل
الحقائق البرمجية كمشجرة الكائنات الحقيقية من ثدييات ...الخ.
/http://arabicplg.sourceforge.net
Version 1.0 final release
35. قبل ان انتقل للنقطة القادمــة و بمــا ان الكلم عــن المخططــات ل بــأس بــأن
نذكر لغة النمذجة الموحدة UMLو التي عادة مــا تــدرس جنبــا الــى جنــب
مع كورس لغات البرمجة الشيئية و هي لغة تمثيلية مفيدة جــدا فــي مرحلــة
التخطيط و تحتوي على 41 نوعا من المخططات تقع تحت مظلــة تصــنيفين
رئسين :
1- مخططات هيكلية تركز على عناصر النظام و ماذا يجب ان يحتوي.
2- مخططات تفاعلية )تصف سلوك الوبجكتس( تركـز علـى مـاذا يجـب ان
يحدث في النظام المحاكى و كيف سيتم التواصل و التفاعل بين العناصر.
من خلل هذا الستعراض البسيط بدانا نعرف سر قوة البرمجة الشيئية فــي
السيطرة على المشاريع العملقــة جــدا ، هــذه القــوة الــتي تنبــع فــي حقيقــة
المر من التجريد .
في البرمجة الجرائية عــادة هنــاك مشــكلة فــي كــون البيانــات مشــاعة لكــل
اجــــزاء البرنامــــج و لكــــن فــــي البرمجــــة الشــــيئية هنــــاك نــــوع مــــن
الكبسلة)التغليف( Encapsulationاي ان البيانات الخاصة بــاي كـائن ل
يمكن تعديلها ال من خلل ارسـال الرسـائل Messagesالـى الكـائن و هـو
بدوره يقوم بعمــل اللزم ســواء بالتعــديل المباشــر او اعــادة ارســال رســالة
اخرى الى كائن اخر طلبا للمساعدة في اتمام الطلب.
من هنا نعرف انه في البرمجة الشــيئية تتــم المهــام عــن طريــق الرســائل و
مجموع الرسائل التي يفهمها الكائن تســمى بروتوكــول الكــائن Protocol
بعبارة اخرى البروتوكول او الرسائل التي يمكــن للكــائن ان يتجــاوب معهــا
هي ذاتها الميثودز المعرفة سلفا في كلس الكائن .
نعود هنا للشارة الى اهمية التجريد هنا ايضــا فانــا كمســتخدم لــو اردت ان
ارسل ازهارا الى صديقي ما علي سوى ان اذهب الى محل الزهار و اخبره
باني اريد هذا النوع من الزهار لكي يتم ارساله الى صديقي .
/http://arabicplg.sourceforge.net
Version 1.0 final release
36. هنا نلحظ انني اعطيت البائع رسالة تمثل طلبا و ل حاجة لي بمعرفة كيفية
تعامل البائع لتمام عملية الرســال . هــذه العمليــة تعــرف بــالبلك بوكســنج
Black Boxingاي ان كل كائن مسؤول عن التعامــل مــع كــل رســالة او
طلــب بطريقتــه الخاصــة الــتي ل يجــب ان يعــرف عنهــا بقيــة الكائنــات اي
تفاصيل اضافية .
فبائع الزهور ربما يرسل طلب نقل الزهور الى محطة البريد او الــى شــركة
خاصة او ربما يعطيها لصــديق ســيذهب الــى منطقــة صــديقي !. و بمــا اننــا
نتكلـــــم عـــــن الرســـــائل لنتكلـــــم عـــــن البوليمـــــورفيزم ) التعدديـــــة(
Polymorphismو هــي مــن اهــم مميــزات البرمجــة الشــيئية و تلخــص
بانها قدرة استجابة انواع مختلفة من الكائنات الى رسالة واحدة و لكن كــل
كائن يفسرها بطريقته الخاصـة . المثـال المشـهور الـذي سيوضـح لنـا هـذا
المفهوم هو لو ان احد مدراء الشركات عقد اجتماعا و بعد انتهاء الجتماع
قــال لمــوظفيه تــابعوا اعمــالكم فالرســالة هنــا واحــدة و لكــن كــل موظــف
سيستجيب بطريقته الخاصــة فموظــف التســويق ســيعود الــى محــل الــبيع و
موظف الدعم الفني سيعود الى مكتب الدعم الفني و هلم جرا .
الن بما اننا نفهم جيدا ميزة البوليمورفيزم ، لنعد الى الفعــال ) الميثــودز (
حيث يمكن ان تعايش حالت اقوى من البوليمورفيزم بدل من فقط التشارك
في اسماء الرسائل كما في المثال الســابق . الحالــة الكــثر انتشــارا هــي مــا
يعــرف بــالوفر لــود Method Overloadو هــي قــدرة الكــائن علــى
الســتجابة لرســالة معينــة بعــدة اشــكال مختلفــة علــى حســب نــوع و عــدد
الرجيومنتس Parameters or argumentsالمرفقة مــع الرســالة ،
مثل :
;)(jump
;)jump(Int myNumber
/http://arabicplg.sourceforge.net
Version 1.0 final release
37. فهنا لــو اعطانــا المرســل عــدد مــرات القفــز فــي الرســالة لســتجاب الكــائن
بتكرار عملية القفز عدد المرات المطلوبـة و لكــن لــو تـرك المرســل رســالة
فارغة من اي رقم ستكون الستجابة للميثود الفتراضي لنقــل قفــزة واحــدة
فقط .
هذا مثال بسيط و لكنه يوضح فكرة جيدة اخرى و هي توفير انواع مختلفــة
من الميثود لمعالجة حالت مختلفة من الرسائل و الطلبات .
الحالة الخرى هي ما يعرف بالميثود اوفر رايد Method Overrideو
هي شكل من اشكال البوليمورفيزم يحدث في حال لو كــان هنــاك ميثــود فــي
الكلس الب و يرثه الكلس البن و لكننـا نريـد للكلس البــن ان يسـتجيب
بطريقة مغايرة لما يفعله الكلس الب . هنا نستخدم الوفر رايد حيث نقــوم
باضــافة ميثــود فــي الكلس البــن يحمــل نفــس اســم و توقيــع الميثــود
Signatureفـــي الكلس الب ، و لكـــن فـــي جســـم الميثـــود Method
Bodyنقوم باضافة اكواد مغايرة لمــا هــو موجــود فــي كلس الب . مثــال
بسيط :
{ public class DaddyClass
{)(public void aMethod
// Do something here
}}
{ public class myClass extends DaddyClass
{)(public void aMethod
// respond differently from my daddy
}}
/http://arabicplg.sourceforge.net
Version 1.0 final release
38. تعدد التوارث Multiple Inheritance
في لغات البرمجة مثل سي ++ و بيرل هنــاك امكانيـة لي كلس بــان يــرث
من اكثر من كلس ، هذا الشيء ل يخلو من الفائدة الكثيرة على الرغم مــن
بعض العيوب و لكن في لغة جافا مثل ل يمكن للكلس ان يرث ال مـــــــــن
كلس واحد و هنا يظهر انه سنلقي صعوبة و محدودية و لكن جافــا تــوفر
ما يسمى بالواجهات Interfaceحيث يمكن لي كلس ان يطبق اكثر مــن
واجهة بالضافة الى وراثته من كلس معين . عندما نعلن عــن كلس بــانه
يطبق واجهة ما فاننا ننشيء في الحقيقة عقد يجب من خلله علــى الكلس
المطبق ان يوفر التطبيق البرمجي لكل ميثود موجود في الواجهة .
فــي البرمجــة الشــيئية كــثيرا مــا نتكلــم عــن محــددات الــترخيص Access
Modifierو التي من خللها نضيف بعد اخر من اخفاء المعلومات Data
Hidingطبعا لكل لغة برمجية انـواع تحكـم مختلفـة و لكـن فـي جافـا مثل
لدينا :
1.private
2.protected
3.default
4. public
طبعا استخدام هذه الكلمات المفتاحية بالشكل الصحيح يحتاج خــبرة و قــرار
المبرمج نفسه و لكن القاعدة العامة هي كلما كان هناك تشديد في الوصــول
الى القيــم و الميثــودز كــان افضــل فنحــن قلنــا ان كــل كــائن يجــب ان يكــون
مسؤول عن نفسه فل يفضل التعــديل علــى المعلومــات مــن امــاكن كـثيرة و
مختلفة تؤدي بدورها الى المشاكل .
/http://arabicplg.sourceforge.net
Version 1.0 final release
39. :: Functionalالبرمجة الوظيفية
البرمجــة الوظيفيــة تعامــل الحوســبة كتقييــم للــدوال الرياضــية و تتجنــب
البيانــات المشــتركة Mutableو الحالــة .Stateتجــب الشــارة هنــا ان
البرمجة الوظيفية هي مجموعة افكار ان صح التعبير و ليست قوانين يجب
متابعتها لذلك هنــاك اختلف فــي تطــبيق البرمجــة الوظيفيــة فهنــاك اللغــات
الوظيفيــة الصــرفة pure functionalكلغــة البرمجــة هاســكل و غيرهــا
حيث انها ل تتيح امكانية التغييـر او تحـديث قيمـة المتغيـر. بنـاء علـى هـذا
الشرط تكون المتغيرات كالمتغيرات في الرياضيات حيـث ص + 2 = 3 و
لكن يمكننا ان نقــول ض = ص+ 3 و لكننــا سننشــيء متغيــر اخــر لن ص
قيمة ثابتة غير قابلة للتغيير.
و لكن بشكل عام اللغات التي التي تدعم :
– Code references
– Closures
يمكن ان تسمى و ان تتيح البرمجة الوظيفية.
تعمدت ان ل اتكلم عن الــ Subroutinesاو الـ Functionsفي معرض
الكلم عن البرمجة الجرائية مع ان هذه الدوال تستخدم بكثرة في البرمجــة
الجرائية كأداة لستدعاء بعض الكواد التي يتكرر استخدامها في البرنامج
مثال بسيط هو بدل من ان نضع اكــواد تــذييل صــفحة ويــب فـي كــل صــفحة
يمكننــا بكــل بســاطة حفــظ و كتابــة الكــواد داخــل دالــة مــرة واحــدة فقــط و
الكتفاء باستدعاء الدالة اينما احتجنا لها ..
حسنا السؤال الن اذا كانت اللغات الجرائية تــوفر الــدوال فلمــاذا ل تســمى
كلها لغات وظيفية ؟ الجواب لكي نســتطيع ان نقــول عــن لغــة انهــا وظيفيــة
يجــب ان تتــوافر فيهــا بعــض المميــزات الــتي ذكرنــا بعضــها فــي البدايــة و
سنتطرق لبعضها بقليل من التفصيل كما سيأتي..
/http://arabicplg.sourceforge.net
Version 1.0 final release
40. : References
اشرنا الى هذه النقطة كنقطة اساسية للبرمجة الوظيفيــة و ان كــانت ليســت
في حد ذاتها خاصية في البرمجــة الوظيفيــة ال انهـا اليـة تتيـح لنـا امكانيـة
البرمجة الوظيفية في بعض اللغات الجرائية.
طيب ما هو الـ reference؟ من اسمه هو اشــارة الــى مكــان المعلومــات.
بعبارة اخرى يمكننا ان نقول ان المشير او المرجع هو متغير لكنه ل يحمــل
القيمة الحقيقة انما يشير الى مكانها فقط . كمثال عندما اقــول تكلمنـا سـابقا
عن البرمجة الجرائية في صفحة 05 فأنا هنا اشير الى مكان المعلومة فــي
الكتاب و لكن ليس لدي المعلومة نفسها . في بيـرل اضــافة المعامــل قبــل
اسم المتغير ينشيء لنا مؤشرا .. مثال:
;) ’my %hash = ( one => ‘Hello’, two => ‘World
;my $hashref = %hash
نلحظ هنا ان المتغير الذي يحمل القيم الحقيقيــة هــو hashو امــا المتغيــر
hashrefهو مجرد متغير يشير الى مكان المعلومات و الكلم هنا يطول و
يختلف مــن لغـة الـى اخــرى لـذلك سـنتجنب الطالــة بمــا اننـا اخــذنا الفكـرة
العامة.
الن لكي نتعرف اكثر على بعض المفاهيم المتداولة في البرمجــة الوظيفيــة
نحن بحاجة اول لن نعــرف كيفيــة كتابــة الــدوال بشــكل عــام ، المــر الــذي
سيتيح لنا فهم المفاهيم الكثر صعوبة .
/http://arabicplg.sourceforge.net
Version 1.0 final release
41. اذا نبدا بمثال بسيط و هي دالة هيلو ! المشهورة..
{)(&hello(); sub hello
};"print "welcome to ali website
في هذا المقال البسيط قمنا بتعرف دالة اسمها هيلوو بين القواس المعقوفة
وضعنا الوامر التي سيتم تنفيذها في حــال اســتدعينا الدالــة و ذلــك يتــم )اي
الستدعاء( فقط بكتابة اسم الدالة و القوسين.
: Parameters
حسنا الن لماذا وضــعنا القوســين بعــد اســم الدالــة؟ هــذه القــواس تســتخدم
لتمرير قيم الى داخل الدالــة و بــذلك نضــفي ديناميكيــة الــى دالتنــا فهــي الن
تستطيع ان تنتج قيم مختلفة بحسب القيمة المررة . اذا لنعدل المثال قليل :
{)(&hello("Visitor1"); sub hello
;$name = shift
;"print "welcome to ali websiten
};"print "welcome $name
جميل الن نلحظ اننا وضعنا قيمة بين القوســين لكــي نســتخدمها لحقــا فــي
داخل الدالة و هناك عــدة طــرق لكيفيـة اســتقبال القيــم تختلــف مــن لغــة الــى
اخرى و لكن في مثالنا shiftستسند القيمة المــررة الــى المتغيــر nameو
بذلك ستكون نتيجة الدالة طباعة جمل مختلفة بحسب اسم الزائر المدخل.
/http://arabicplg.sourceforge.net
Version 1.0 final release
42. جميل و اذا احببنا اضافة المزيد من القيم المــررة مــا علينــا ال ان نســتقبلها
كقائمة و نسندها لمتغيرات حسب الحاجة ، مرة اخرى هذا المر يختلف من
لغة الى اخرى و لكن هذا نموذج :
;)"2&hello("Visitor1","Visitor
;_@ = )2sub hello(){my ($name1, $name
;"print "welcome to ali websiten
;"1print "welcome $name
};"2print "welcome $name
نلحظ الن اننا نستطيع ان نتعامل مع العديد من القيم المــررة بهــذه الليــة .
في بعض الحيان ل نريد فقط ان ننفذ اوامر بل نريد من الدالة ان ترجــع لنــا
قيمة لكي نسندها الى متغير مثل .
كل ما علينا فعلــه الن هــو ان نســتخدم كلمــة returnففــي المثــال البســيط
ادناه هذه الدالة:
{)(sub hello
};3 return
;)(my $number = hello
;print $number
/http://arabicplg.sourceforge.net
Version 1.0 final release
43. هذه الدالة كما هو واضــح فقــط ترجــع قيمــة 3 ، نلحــظ اننــا اســندنا القيمــة
المرجعة الى المتغير numberو في المر الخير طبعنا قيمة المتغير التي
في طبيعة الحال ستكون مجرد الرقم 3.
:Scoping
من المور المهمة جدا في البرمجة ما يعـرف بالمـدى او مـدة حيـاة المتغيـر . فـي اغلـب
لغات البرمجة مدى المتغير محصور بين القـواس المعقوفـة مثل دائرة تكـرار او جملـة
شرطية او حتى في كائن او في بكج ..ألخ مما يعني ان المتغير خاص بالمنطقـة المعـرف
بها و ل يمكن استخدامه خارجها، و لكن هناك متغيرات تكون عامة يمكن الوصول اليهــا
من اماكن متعددة مما يجعلها عرضة للتغيير بشكل مسـتمر ، مـاذا لـو كـان اسـم المتغيـر
العام هو ذاته اسم المتغير الخاص ستتولد لدينا مشاكل فـي المـدى و نحصـل علـى نتـائج
ربما تكون غير متوقعة .. لندرس هذا المثال :
;01 = $total
;21 = $number
;)&adding($number
)(sub adding
;{$number = shift
;$total = $total + --$number
;}print $number
;print $total
/http://arabicplg.sourceforge.net
Version 1.0 final release
44. الن ماذا تتوقعون ستكون نتيجة المرين الخرين ؟
النتيجــة ســتكون numberســيكون 11 و totalســيكون 12 . نلحــظ
كيف ان قيمة المتغير العام تغيرت لن numberصادف انه موجــود ايضــا
في الدالة الن لنتخيل كيف ستكون هذه مشكلة كبيرة جدا ان تقــوم كــل دالــة
بتغير المتغيرات العامة ، بالطبع مــا سنحصــل عليــه هــو فوضــى حيــن تتبــع
الخطاء .. اذا يجــب ان نجعــل مــن متغيــرات كــل دالــة متغيــرات خاصــة بهــا
بحيث ل يكون لها تأثير جانبي علــى متغيــرات البرنامــج side effectsو
في المقابل ايضا يجب ان نحرص علــى ان ل نجعــل مــن متغيــرات البرنامــج
متغيرات عامة فهذا مصدر لكثير من المشاكل ، في اكثر اللغــات هــذه ليســت
مشكلة فالمتغيرات ليست عامة ابتداء و لكــن فـي لغــات مثــل بيـرل يجــب ان
نستخدم use strictللحصول على هذه الميزة و من ثم نقوم بالعلن عن
كل متغير باســتخدام myو بــذلك نتفــادى تعــارض تــأثير اســماء المتغيــرات
خارج مداها .. لنعدل الكود اذا :
;01 = my $total
;21 = my $number
;)&adding($number
)(sub adding
;{ my $number = shift; my $total = $total + --$number
;}print $number
;print $total
/http://arabicplg.sourceforge.net
Version 1.0 final release
45. الن سنحصــل علــى النتيجــة المتوقعــة 21 و 01 للمتغيريــن اللــذين خــارج
الدالة حيث اختفى تأثير الدالة على المتغيــرات الخارجيـة . فالنتيجـة الن ان
اصبح لدينا متغيرين لهما نفس السم فــي خــارج و داخــل الدالــة و لكــن فــي
الحقيقة كل منهم متغير مختلف عن الخر فقط صادف انهما بنفس السم .
العودية : Recursion
العودية هي عندما نستخدم و نطبق الدالة في داخل تعريفها . بعبــارة اخــرى
الدالة تستدعي نفسهـا. و في البرمجة الشيئية عندما يستدعي الميثود نفسه
يســمى .recursive methodأقــرب مثــال لتوضــيح الفكــرة هــو طريقــة
حساب الـ factorialلرقم معين و الذي يتــم عــن طريــق ضــرب العــدد مــع
العداد الصغر منه مثل للعدد 5 ) 1*2*3*4*5( = 521.
لبرمجة هذه العملية بالعودية نلحظ النمــط هــو العــدد الصــلي ضــرب العــدد
الصلي-1 و هكذا الى ان نصل الى الواحد و بناء عليه نوقف عملية الطــرح
و نبدا العملية عكسية و عودية حيث ان الواحد قيمة معلومــة ضــرب الدالــة
التي كانت في النتظار و هكذا .. اذا ما سيحدث داخل الدالة هو :
)1-5(5*f
)1-4(4*f
)1-3(3*f
)1-2(2*f
f(1)=1 stop
عندما نصل الى هذه النقطة سترجع الدالــة قيمــة معلومــة و ليــس اســتدعاء
للدالة مرة اخرى عليه بما ان القيمة معلومة نضربها مع الثنين ...ألخ.
/http://arabicplg.sourceforge.net
Version 1.0 final release
46. و هذه الكواد البرمجية لهذه العملية …:
;)5( $fv = fact
;"print "factorial 5 is $fvn
{ sub fact
;my $val = shift
{ )1 > if ($val
;)1-$fv = $val * fact($val
{ } else
;1 = $fv
}
}
هذه الظــاهرة لهــا اســتخدامات كــثيرة و مفيــدة و كمثــال اخيــر دالــة لتحويــل
الرقام الى ما يمثلها من الـ Binaryباستخدام العودية...
{ sub binary
;_@ = )my ($n
;1 == return $n if $n == 0 || $n
;)2/my $k = int($n
;2 % my $b = $n
;)my $E = binary($k
;return $E . $b
}
و كما شاهدنا في المثالين و في اي حالة اخــرى يجــب تــوفير نقطــة ليقــاف
عملية الستدعاء المتكرر و ال لن تتوقف عملية الستدعاء كمــا هــي الحــال
في دوائر التكرار اللنهائية.
/http://arabicplg.sourceforge.net
Version 1.0 final release
47. Higher-order functions
الن ســنبدأ اســتعراض بعــض الخصــائص الحقيقيــة للبرمجــة الوظيفيــة. و
ســنبدا بالــدوال العاليــة حســب اصــطلحهم و ربمــا يعرفهــا البعــض بالـــ
callbacksاو .factoriesو تسمى الدالة بهذا السم عنــدما تحقــق احــد
المرين :
1- ان تستقبل دالة كمدخل )قيمة ممررة(
2- ان ترجع دالة بدل من قيمة معينة
و قبل ان نأخذ بعض المثلة يجب ان نتعرف على :
Anonymous subroutines
و هي الدوال المجهولة او بعبارة اخرى ليس لها اسم !. مثل :
;}2+)(my $number_plus_two = sub {return shift
5# ;)3(>-print $number_plus_two
في هذا المثال نلحظ اننا انشأنا متغير و لكن لم نسند له قيمة بل اســندنا لــه
دالة و المهم هنا نلحظ انها ل تحتوي على اسم الن نلحظ عند تمرير قيمة
3 سيتم جمعها مع 2 لتكون النتيجة 5.
اذا نستطيع ان نقول للدوال المجهولة فوائد منها :
1- اننا نستطيع ان نسندها الى متغير او قائمة او هاش
2- نستطيع ان نمررهم الى دوال اخرى Arguments
/http://arabicplg.sourceforge.net
Version 1.0 final release
48. 3- سنحتفظ بالمتغيرات في المدى المحيط
4- نستطيع انشائهم في وقت التنفيذ
: Closures
لندرس هذا المثال :
{ sub demo
;my $name = shift
}"!return sub{ print "hello $name
}
;)"my $ref = demo("Ali
&$ref(); # hello Ali
المر الذي يلفت النظر هنا هو اننا نلحظ ان الدالة المجهولــة اســتطاعت ان
تصل الى متغير غير معرف في مداها بــل موجــود فــي الدالــة المحيطــة بهــا.
هذه الظاهرة تسمى بالكلوجرز .
مثال اكثر تقدما :
{ sub demo
;_@ = )my ($title
;_@=)return sub{ my ($name
}" !print "$title $name
}
;)".my $ref = demo("Mr
;)".my $ref_2 = demo("Ms
/http://arabicplg.sourceforge.net
Version 1.0 final release
49. : الن نلحظ النتيجة
$ref->("Ali"); # Mr. Ali!
$ref_2->("Yosra"); # Ms. Yosra!
نلحــظ كيـف ان الدالـة احتفظـت بالمـدخلت فــي المرحلــة الولــى و مــن ثـم
.طبعت المتغيرين بالشكل الصحيح
@@To be completed in the upcoming release.
@TODO currying, lazy eval, streams, more on
closures, more on Higher functions, continuation ..etc
( :: البرمجة التعريفية ) اعلنيةDeclarative
وصف لمنطق الحوسبة بدون وصف طريقة التحكم بمجراها، و بذلك تكون
.Imperative عكس الـ
@@To be completed in the upcoming release.
http://arabicplg.sourceforge.net/
Version 1.0 final release
50. المزيد من المصطلحــات :
IDE
هــــذه الكلمــــة تمــــر علينــــا كــــثيرا و هــــي اختصــــار Integrated
، Development Enviromentاي بيئة التطــوير المتكاملــة ، حســنا
مــاذا يعنــي هــذا ؟ اعتقــد ان القليــل هــذه اليــام يبرمــج مــن خلل محــررات
النصوص مثل المفكرة فــي وينــدوز و viفــي لينكــس ، حيــث يمكــن لنــا ان
نبرمــج برامــج كاملــة فقــط باســتخدام المفكــرة البســيطة ثــم نقــوم بعمليــة
الترجمــة للكــواد ، هــذه الطريقــة و ان كــانت جيــدة مــن ناحيــة انهــا تجــبر
المبرمج على العتماد على نفسه في البرمجة بدون اي تــدخل مــن برنامــج
الكتابة كمساعد ، ال انها تقلل من النتاجية . ل يزال هناك من يتعصب الــى
ان برامج كتابــة الكــواد يجــب ان تكــون بســيطة فــي حــد ذاتهــا و ل تغــرق
المبرمج فـي بحـار الخصــائص الــتي فـي العــادة ل يسـتخدمها بـذلك الشــكل
المستمر . الى عهد قريب كنت اتبنى هذا الرأي لني كنت ارى ان المبرمــج
فعل يجب ان يكون خــبيرا فــي لغتــه و حافظــا لكــل تفاصــيلها و خفاياهــا فل
يحتاج الى مساعدة من اي احد حتى لو كان برنامج التطــوير، و كنــت اتخــذ
من هذه الطريقة وسيلة لكي اصقل مهارتي، حيث كنت فــي وينــدوز اتعامــل
مباشرة مع المفكرة ، ثــم تطــور المــر الــى اســتخدامي لبرنامــج Padreو
الذي كان بسيطا جدا فــي امكانيــاته وقتهــا و لكــن احببتــه لنــه يقــدم خدمــة
التلوين للكواد. كنت اتجنب برنامج اكلبس او نــت بينــز بــل حــتى Emacs
لنني كنت اؤمن بان الفترة التي سأقضيها في تعلم هذه البرامج و اكتشــاف
خفاياها و حفظ اختصــاراتها ، يجــب ان اســتغلها فــي تعلــم لغــتي المفضــلة.
على كل حال في يوم ما بدات العمل على مشروع لجافا و كان يتوجب علــي
عمله باستخدام اكلبس و من خلل عملي في هذا المشروع رايت ان الفــترة
التي احتجتها لتعلم البرنامج لم تكن بتلك الطول هذا فضل عن الفوائد الــتي
تحصلت عليها من اســتخدام اكلبــس ، عنــدها بــدات اؤمــن ببئيــات التطــوير
المتكاملة مع بعض التحفظات علــى بعــض النقــاط الــتي الــى الن افضــل ان
اعملها بنفسي مثل انشاء الواجهات الرسومية فهذه البرامج فقط تصلـــــح
/http://arabicplg.sourceforge.net
Version 1.0 final release
51. لتصــميم الشــكل الســريع للبرنامــج و لكــن عنــدما اريــد ان اكتــب الواجهــة
النهائية ساكتبها بنفسي لنني ل اريد كل تلك الكواد المحشوة من قبــل اداة
انشاء الواجهات ، و كذا الحال ايضــا فــي كتابــة اكــواد htmlفالتعامــل مــع
الدوات المرئيــة فــي هــذا المجــال تطويــل ل ارى لــه ضــرورة فــي اغلــب
الحيــان. علــى كــل حــال هــذه وجهــة نظــر … نعــود الــى بيئات التطــوير
المتكاملة ماذا تعني متكاملة هنا ؟ نستطيع ان نقول ان التكامل هنا يعني ان
نتحصل على برنامج واحد يقدم محرر نصوص و خدمات تحرير النصــوص
البرمجية مثل التلوين للكواد و ربما الكمال التلقائي و ايضــا ربمــا القــدرة
على تصحيح الخطاء في الوقت الحقيقي كما يوجد في اكلبس. ثم يجــب ان
يقدم البرنامج مفسر او مترجم للغة المعنية و قــد يســتخدم مفســر خــارجي.
ايضا قد تحتوي البيئة على ادوات البناء التلقائي. ايضا قد يحتوي البرنامج
ادوات لعملية التصحيح و التجريب. و مــا الــى ذلــك مــن خــدمات اخــرى قــد
تختلــف مــن برنامــج الــى اخــر حســب امكانيــاته مثــل تــوفير ادوات رســم
الواجهات الرسومية و ادوات العمل الجماعي ...الخ.
Compiled and interpreted
يمكن عادة تقســيم لغــات البرمجــة الــى مفســرة او مترجمــة او حــتى بعــض
اللغات توفر الثنين معا كما سيأتي. المترجم يحــول الكــود المصــدري ) مــا
نكتبه مثل بلغة سي( الى كود لغة اخرى غالبا الــى لغــة يفهمهــا الكمــبيوتر.
عادة الهدف الساسي مــن الترجمــة هــو التحصــل علــى ملــف تنفيــذي. فــي
اللغات المفسرة يتم ارسال الكواد الى مفسر اللغة و الذي يقوم هــو بــدوره
بتنفيذ الكواد مباشرة. بين هذا و ذاك توجد لغات لــديها مفســر و مــترجم و
توجد لغــات مثــل جافــا يتــم فــي البدايــة ترجمــة الملــف المصــدري الــى لغــة
وسطية byteCodeو من ثم يتم تفسير هذا الكود من خلل المفسر الــذي
هو بالنسبة للجافا هو ذاته اللة التخيلية . Virtual Machine
/http://arabicplg.sourceforge.net
Version 1.0 final release