SlideShare una empresa de Scribd logo
1 de 160
Descargar para leer sin conexión
‫مختصر‬

‫دليل لغات البرمجة‬
‫كتبه‬
‫علي آل ياسين‬
‫راهب في صومعة‬

‫عضــــو‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
:: ‫:: بسم ال الرحمن الرحيم‬
:: ‫:: تم اعداد الكتاب باستخدام برنامج‬

‫ رخصة الكتاب‬Creative Commons
http://creativecommons.org/licenses/by-nc-sa/3.0/us/

‫مرفق في النهاية مستند الترخيص‬

http://arabicplg.sourceforge.net/
Version 1.0 final release
‫:: اهداء ::‬
‫الى ناحيتـــها ،،‬
‫الى قبلتهـــا ،،‬
‫الى سموهـــا ،،‬
‫الى حبهــــا ،،‬
‫الى روحها ،،‬
‫الى جسمها ،،‬
‫الى وقوفها ،،‬
‫الى جلوسها ،،‬
‫الى قنوتها ،،‬
‫الى دعائها ،،‬
‫الى ركوعها ،،‬
‫الى سجودها ،،‬
‫الى انبساطها ،،‬
‫الى انقباضها ،،‬
‫الى ابتسامتها ،،‬
‫الى سرورها ،،‬
‫الى صاحبــــة الشــــــأن ،،‬
‫اليك ،، جعلني ال فداك ،،‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫:: مدخـــل ::‬
‫• بسم ال الرحمن الرحيم و الصلة و السلم علــى ســيد المرســلين محمــد و‬
‫اله الطاهرين ، اللهم صل على محمد و ال محمد كما صليت على ابراهيم و‬
‫ال ابراهيــم اللهــم و صــل و ســلم و ترحــم و بــارك علــى محمــد و ال محمــد‬
‫كأفضل ما صليت و باركت و ترحمت على احد من خلقك انك سميع مجيد.‬
‫• جائتني فكرة هذا الكتاب اللكتروني بعد ان قــرات كتــاب "حــرب البرامــج"‬
‫للكاتب الرائع كيث كرتس، و على الرغم من ان عملي هــذا لــم و لــن يصــل‬
‫الى مستوى عمل شخص في مستوى هذا المبرمج ، ل مــن حيــث الكــم "‬
‫003 صــفحة" و ل مــن حيــث المســتوى "خــبرة ســنين فــي البرمجــة مــع‬
‫ميكروسوفت و غير ذلك.‬
‫• ال ان هذا لم يمنعني من ان اشرع في كتيب يكون بمثابة دليل مختصــر الــى‬
‫لغات البرمجة متجنبا الطالة المملة و التفاصيل التقنية الدقيقــة او التوغــل‬
‫في شرح الكواد البرمجية التي من شأنها ان تبعد كل من ليــس لــه اهتمــام‬
‫بالبرمجة.‬
‫• عملي اذا في هــذا المختصــر هــو التعريــف بــالخطوط العريضــة بــاهم لغــات‬
‫البرمجة في عالمهـا الواسـع. مـع اضـافة تعريـف بـأهم المصـطلحات الـتي‬
‫يجب ان تعرف كي نستطيع من خللها قراءة تلك الخطوط العريضة.‬
‫• و هذه النسخة النهائية الولى اطرحها في منتداي المفضــل مجتمــع لينكــس‬
‫العربي ليماني بان الذي جعل المصادر الحرة عظيمة هو مبدا المشــاركة ،‬
‫لهذا انا اطمح في ان ارى القتراحات و النقد لهذه الصدارة كي نستمر في‬
‫مسلسل تطور هذا الكتاب من مسودة ابتدائيــة كمــا كــان قبــل ســنة و بضــع‬
‫شهور الى كتاب غني و مفيد خلل الشهور القادمة.‬
‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫• عليــه اشــكر كــل مــن ســاعدني و اخــذ بيــدي ســواء: بعبــارات شــكر و‬
‫استحســان ، نقــد بنــاء او اقــتراح مفيــد و اطمــح للمزيــد مــن المشــاركة و‬
‫المعونة.‬
‫• يوجد الكثير من المصطلحات البرمجيــة البحتــة طبعــا لــم اســتطع تفاديهــا و‬
‫ايضا لم يكن باستطاعتي اضافة تعريفهــا كلهــا خــوف الطالــة و لكــن قمــت‬
‫باضافة مقالة اضافية تعنــى بشــرح اهــم تلــك المصــطلحات مــع اســتعراض‬
‫سريع لهم نمــاذج البرمجــة و ذلــك نــزول عنــد رغبــة الكــثير مــن اخــواني‬
‫العضاء. و ايضا ارفقت في نهاية الكتاب مقالة تعنى بكيفية انشاء برنامج‬
‫بالقليل من الجهد و دراسة بعض جوانب التطوير و المــور الــتي يجــب ان‬
‫تأخذ في الحسبان في هذه العملية.‬
‫• تخصصــي فــي علــوم الحاســب اللــي طبعــا ل يعطينــي الخــبرة الكافيــة فــي‬
‫استعراض كل لغات البرمجة ، بل في حقيقة المر اللغات التي تعاملت معها‬
‫هي فقط بيرل كلغة اساسية و سي++ و جافا و سمول تولك و بي اتش بي‬
‫و قليل جدا من بايثون فكان هناك حاجة كبيرة للترجمة الصرفة في اللغــات‬
‫الباقية فارجو الشارة الى مواطن الخلل فــي اي مكــان مــن هــذه المقــالت‬
‫كي اقوم بتصحيحه ان وجد في الصدارات القادمة.‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫:: مقدمة ::‬
‫• ل اريد ان امثل دور المبرمج المحنك هنا ، فأنا واقعا لست اهل لذلك، و لكـن‬
‫بحكم تخصصي في هذا المجال و اهتمــامي بالجــانب النظــري منــه خاصـة ،‬
‫احببــت ان اكتــب بعــض الســطر لمــن لــديهم اهتمــام بالبرمجــة و لكنهــم لــم‬
‫يقدموا بعد :‬
‫• هناك نقــاط كــثيرة يجــب ان تاخــذ فــي الحســبان قبــل الشــروع فــي تعلــم لغــة‬
‫برمجة، و لكن لحظــت ان المشــكلة الساســية عنــدنا هــي ليســت فــي عــدم‬
‫القدرة على اختيار لغة معينة بل في عدم العزم على التعلم ابتداء. من منا ل‬
‫يحب ان يقال عنــه مبرمــج ؟ خاصــة ان البرمجــة مثــل الرياضــيات يوصــف‬
‫اصحابها بالذكاء و العبقرية . الكثير منا يقــول و يتمنــى و يخطــط ان يكــون‬
‫مبرمجا عندما يقرا عن المبرمجين و المخترقين و قصص نجاح البرامج و‬
‫المواقع و لكن عندما يبدا اول خطــوة فــي الدراســة يعــرف ان هنــاك الكــثير‬
‫ليتعلمه و ان المادة ليست ممتعة كما كان يتصور و يبدا بالشعور بالممــل و‬
‫من ثم يترك ما شرع فــي قراتــه مــن كتــاب او دورة تعليميــة . هنــاك حكمــة‬
‫يابانية تقول " الطموح بدون عمل مجرد حلم يقظة ". شخصيا كنت اعاني‬
‫من هذه المشكلة و هي تكديس الكتــب و الــدورات و المحاضــرات و غيرهــا‬
‫على امل اني ساقراها و اشرع في تعلمها في وقت ما ! و الن لهــا ســنوات‬
‫و لم اقرا منها شي ! اذا هذه المشكلة الولى التي يجب ان نجتازها ! و هي‬
‫ان ندرك ان مجرد تحميل الكتب و الدورات التعليمية سواء في البرمجــة او‬
‫غيرها من الفنون لن يجعل منا شيئا ! بل هو البدء و الصرار في تعلم هذه‬
‫الشياء المملــة و المــواد الثقيلــة و اكمــال الكتــب و الــدورات الــى نهاياتهــا‬
‫بالضــافة الــى الممارســة و التفكيــر هــو مــا يضــيف الــى حصــيلتنا الشــيء‬
‫المفيد.‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫• حسنا الن ، انت عازم على المواصلة و الجد في تعلم لغــة برمجــة معينــة و‬
‫لكنك ل تســتطيع ان تختــار اي لغــة تناســبك؟ هــذه المشــكلة الثانيــة و نــرى‬
‫الكثير من المواضيع من هذه الشاكلة ماذا اتعلم ؟ مــا هــي افضــل لغــة ؟ مــا‬
‫هي اقوى لغة ؟ ايهما القوى بيرل او بــايثون ؟ جافــا او ســي شــارب ! فــي‬
‫حقيقة المر ل يوجد شيء اسمه اللغة القوى و كل مــن يقــول هنــاك شــيء‬
‫من هذا القبيل فهو في حقيقة المر واهم ، فكل لغة قوية في جانب معيــن و‬
‫عادة ما يكون هو الجانب الذي انشئت من اجلــه اساســا، طبعــا يوجــد لغــات‬
‫تصلح لكل شيء تقريبا و لكن يبقى انها ل تقدم كفائة و انتاجيــة عاليــة فــي‬
‫كــل شـيء فمثل لغـة مخصصـة للـويب مثــل بـي اتـش بــي و ان كــان هنــاك‬
‫امكانيــة عمــل برامــج ســطح مكتــب بهــا فهــي لــن تكــون بقــوة و ســهولة و‬
‫انتاجية لغات البرمجة المخصصة لهذا الجانب و العكس صحيح . علــى هــذا‬
‫فسيكون الجواب على سؤالك هو: ما هو احتياجك؟ ماذا تريــد ان تبرمــج؟‬
‫هل تريد ان تتعلم لنفسك ام لسوق العمل ؟ و منه تختار لغة البرمجــة الــتي‬
‫تريدها، لهذا هذا الكتيب ربما يكـون جيـدا فـي اختيـار لغـة برمجتـك الولـى‬
‫فهــو يعرفــك بالهــداف الساســية الــتي انشــئت لهــا لغــات البرمجــة و اهــم‬
‫التطبيقات التي تستخدم فيها هذه اللغات. و النقطة الجديرة بالذكر ايضا هي‬
‫اطلعك على امثلة مــن طريقـة كتابـة الكـواد فـي لغــات مختلفـة باعتقــادي‬
‫الشخصي سيؤثر على اهتمامك و اســتمتاعك بلغــة البرمجــة الــتي تختارهــا‬
‫فهناك الكثير من المبرمجين يستخدمون لغات معينة لنهم يحبــون اســلوبها‬
‫فــي الكتابــة و ايضــا طريقــة معالجتهــا للمشـاكل البرمجيـة . مثل : اذا كنـت‬
‫تحب ان يكون كل شيء واضح في اسماء المتغيــرات و الكلمــات المفتاحيــة‬
‫و غيرهــا و تكــره اســتخدام الكــثير مــن الختصــارات و الرمــوز كــالقواس‬
‫الكثيرة في ليسب و القواس المعقوفة و ما الــى ذلــك فــذلك بــالطبع ســيؤثر‬
‫علــى اختيــارك. مثــاله : قــولهم عــن اقــواس لغــة البرمجــة ليســب ) جهنــم‬
‫القواس ( ، و لكن يقول الخر ) عندما وصلت الى مرحلة التنــوير ارتفعــت‬
‫القواس !( .‬
‫•‬
‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫ربما يستصغر البعض هذه النقطة و لكن في حقيقة المر هذه امور فطريــة‬
‫ل يمكــن تجاهلهــا! أل يمكــن ان تكــره قــراءة كتــاب لن خطــه لــم ترتــح لــه‬
‫عينك ؟ و ان كان هذا الكتاب الكثر مبيعا و غني بالمحتوى!‬
‫الشيء الهم هو:‬
‫• ان تعلم ان تعلمك لي لغة برمجـة سـيفيدك كـثيرا حــتى لــو انتقلـت الـى لغـة‬
‫اخرى .‬
‫• ان تعلم ان لغــات البرمجــة مبــاديء ان فهمتهــا ســهل عليــك النتقــال حســب‬
‫الحاجة الى لغة اخرى.‬
‫• لهذا نرى ان اغلب المبرمجين يعرفون اكثر من لغة و يســهل عليهــم التــأقلم‬
‫مع اي لغة جديدة يفرضها عليهم سوق العمل ، و كمثــال فــي بيــرل لــم اكــن‬
‫اعرف كيف اقوم بعمل برنامج ذو واجهة رسومية لننــي كنــت معتــاد علــى‬
‫عمل برامجي على الويب او سطر الوامر و لكن بعد تعلمــي مكتبــة ‪ Tk‬و‬
‫فهمي لكيفية عمــل الواجهــات الرســومية اســتطعت بكــل بســاطة و يســر ان‬
‫انقل برنامجي الى مكتبة ‪ wxperl‬و ايضا واجهة ‪.. GTK‬‬
‫• لــذلك شخصــيا ارى الهميــة المطلقــة الــتي يغفــل عنهــا الكــثيرون للجــانب‬
‫النظري و المنطقي للبرمجة بدل التركيز على حفــظ الــدوال و الكــواد فهــذه‬
‫اشياء بسيطة جدا حتى يمكن الرجوع اليها بسرعة من خلل كتيب الــدليل ،‬
‫بل يجب ان نعرف كيف يعمل البرنامج ل كيف يكتب البرنامج .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫• شيء اخر يجب الشارة اليه هو عدم الهتمام كثيرا بمـا يشـاع عـن افضـلية‬
‫طريقة معينة في البرمجة ، مثل هناك اشارة دائمــة مــن خلل دراســتي فــي‬
‫الجامعة الى افضــلية البرمجــة الكائنيــة و لكــن يجــب ان نــدرك ان البرمجــة‬
‫الكائنية ليست دائما هــي الحــل الفضــل للمشــكلة ، توجــد مشــاكل و برامــج‬
‫استخدام البرمجة الكائنية فيها مجرد تطويل و تعقيد للحل ، و لكن طبعا في‬
‫برامج و نـواحي اخـرى سـيكون مـن الصـعب البرمجـة باسـتخدام البرمجـة‬
‫الجرائية بدل من البرمجة الكائنيــة فيهــا ، لــذلك دائمــا احــب ان اشــير الــى‬
‫اهمية الجانب النظري في البرمجة و هـو فهـم طــرق البرمجـة و مبادئهــا و‬
‫من ثم اختيار الطريقة الفضل .‬
‫• ايضا احـب ان اشـير الـى ان البرمجـة ممتعـة اذا كـانت تحـل مشـكلة نحتـاج‬
‫لحلها و ال ستكون البرمجة مملة و رتيبة و عــادة مــا نــترك المشــروع فــي‬
‫منتصفه ، مثل لينوس لم يشرع في كتابة نظامه ال من مشــكلة عاناهــا مــع‬
‫نظم التشغيل الموجودة في وقته و غيره من المثلة كثيرة ، و هنا نصل الى‬
‫نقطــة اخــرى و هــي ان البرامــج العملقــة ســيكون مــن الصــعب جــدا علــى‬
‫شخص واحد فقط تطويرها و كتابتها و هنا تظهر اهمية العمــل الجمــاعي و‬
‫الحتكاك بالمبرمجين الخرين و المشاركة في المحافل البرمجيــة و دراســة‬
‫اكواد الغير للعمل من حيث انتهى الخرون و ليس تضيع الــوقت فــي اعــادة‬
‫اختراع العجلة و تشتيت الجهود .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫• النقطة الخيرة التي احب ان اختم بها هــي مســألة الدراســة البرمجيــة ، فــي‬
‫الجامعــة نمــل و نتضــجر مــن الشــياء النظريــة الــتي نتعلمهــا و نريــد تعلــم‬
‫الشــياء الكــووول علــى مــا يقــال !.. و لكــن لحقــا نــدرك ان هــذه الشــياء‬
‫النظرية المملة هي اهم ما تعلمناه و نرى لحقا مكانها في عــالم البرمجــة ،‬
‫كمثال كان هناك شخص دائما يتضجر من البرمجــة لســطر الوامــر و يقــول‬
‫ان هذا شيء قديم اكل الدهر عليه و شــرب و انــه علينــا ان نتعلــم البرمجــة‬
‫الحديثة فما نفع برامج سطر الوامر .. و لكن فــي حقيقــة المــر الجامعــة و‬
‫الكتب بشكل عام تعلمك البرمجة لسطر الوامر لنها تركز على المنطق فــي‬
‫حــل المشــاكل البرمجيــة و ســطر الوامــر مجــرد اداة لســتلم المتغيــرات و‬
‫التفاعــل مــع المســتخدم ، لحقــا ادركنــا ان الواجهــات الرســومية و برامــج‬
‫الويب مجرد قشور ل تنفع اذا لم يكـن خلفهــا اكـواد برمجيـة سـحرية تعمـل‬
‫بصمت خلف الستار ! و ان الذي تعلم تلك الكواد و المباديء و تمكن منهـا‬
‫لم يجد صعوبة في ان يغلفها بواجهات حديثة مثل ‪ QT‬او ‪..! GTk‬‬
‫:: &&& ::‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫:: نماذج البرمجة و اهم المصطلحات ::‬
‫في البدء كان الصفر و الواحد …‬
‫ثم جاءت اللغات التجميعية ، الــى هنــا و نحــن نتكلــم عــن اللغــات منخفضــة‬
‫المستوى اي انها ذات ارتباط شديد بالعتاد ، و ان كنا مع اللغات التجميعيــة‬
‫بدانا الماكروز و بعض الخصائص التي سنراها لحقا في اللغــات الجرائيــة‬
‫بشكل اكثر تقدما .‬
‫ثــم بــزغ الفجــر الجديــد مــع اللغــات عاليــة المســتوى و ظهــرت البرمجــة‬
‫الجرائية لتعلن عن ظهور عصر الهتمام بالمشكلة البرمجية !..‬
‫فقبل ان نتكلم عن لغات البرمجــة يجــب ان نســلط الضــوء علــى اهــم نمــاذج‬
‫البرمجة و اهم المصطلحات المرتبطــة بهــا ليســهل علينــا لحقــا فهــم لغــات‬
‫البرمجــة مــن خلل قــراءة اســطرها العريضــة . و فــي نهايــة هــذه الفقــرة‬
‫سنتعرض لمصطلحات متنوعة.‬
‫‪Programing Paradigms‬‬
‫يجب ان ننتبه الى انه ل يوجد اي تعريف رســمي لي نمــوذج مــن النمــاذج‬
‫التية ، و نقاط الشتراك كثيرة فالحدود هنا ليست فواصل ل يمكن تجاوزها‬
‫فالبرمجة الشيئية في النهاية هي برمجة اجرائية بطبيعتها. و لكن ما يعنينا‬
‫في حقيقة المر هنا هو النقاط التي يركز عليها كل نموذج من هذه النمــاذج‬
‫حيث عليه تتغير طريقة تفكير المبرمج في نظرته و تحليله و حله للمشــاكل‬
‫البرمجيـة . و هـذه النمـاذج القليلـة المـذكورة هنـا هـي المهمـة و ال هنـاك‬
‫العديد و العديد من النماذج كما هنالك العداد المهولة من لغات البرمجة.‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫‪ :: 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‬‬
‫اما الســطر فتكــون مرقمــة او معنونــة )‪ (Labels‬و مــن خلل هــذه الليــة‬
‫يمكن للبرنامج ان يقفز الى اي سطر برمجي.‬
‫البرمجة غير المنظمة توفر اساسيات اليات التحكم بسير البرنامــج و تــوفر‬
‫ايضا الـ ‪ Subroutines‬و سنتكلم عن هذه الشياء بقليل من التفصيل فــي‬
‫البرمجة الجرائية.‬
‫يبقى ان نعرف ان البرمجة غير المرتبة تتيح لنا انواع البيانات الولية مثل‬
‫العداد و النصوص و القوائم .‬
‫‪ :: Structured Programing‬البرمجة المنظمة‬
‫البرمجــة المنظمــة كالبرمجــة الغيــر منظمــة تعتــبر احــدى شــعب البرمجــة‬
‫المرية ) احدى اهم و اكبر نماذج البرمجة(. و اشتهرت البرمجــة المنظمــة‬
‫بازالتها للجملة الشهيرة ‪ GOTO‬او الحد من استخدامها.‬
‫و هناك ثلث منهجيات اكثر شهرة لكتابة البرامج المنظمة :‬
‫1 - طريقــة ادســجار دايجســترا حيــث هيكــل البرنامــج مكــون مــن مجموعــة‬
‫هياكل جزئية . بهذه الطريقة يمكن فهــم البرنامــج مــن خلل فهــم كــل جــزء‬
‫لوحده و به نتحصل على فصل و عزل للمهمات المختلفة.‬
‫2 - طريقة اخرى مشتقة من طريقة دايجسترا حيث يتم تقسيم البرنامج الــى‬
‫برامج جزئية مع وجود مدخل واحد فقط للبرنامــج و لكــن تعــارض و بقــوة‬
‫مبدء المخرج الموحد.‬
‫3 - طريقة جاكسون للبرمجة المنظمة و الــتي تعتمــد علــى محــاذاة البيانــات‬
‫المنظمة مع اجزاء البرنامج المنظمة.‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫يوجــد علــى القــل ثلث طــرق اساســية لتصــميم برامــج البيانــات المنظمــة‬
‫مقترحة باسماء اصحابها :‬
‫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‬‬
‫‪ :: Procedural‬البرمجة الجرائية‬
‫تعتمد على عملية توفير الخطوات اللزمة لكي يصــل البرنامــج الــى الحالــة‬
‫المطلوبة. و هي من اقدم النماذج و اكثرها انتشــارا و قريبــة جــدا للطريقــة‬
‫الفطرية في التفكير. و سنستعرض بعض اهــم المفــاهيم الــتي تتعامــل معهــا‬
‫باختصار ...‬
‫المتغيرات ‪:Variables‬‬
‫في البرمجة كما هو الحال في الرياضيات هناك حاجة ماسـة للتعامـل مـع المتغيـرات و ل‬
‫يخلو برنامج ما من متغير ال في حالت نادرة جـدا . ابسـط انـواع المتغيـرات هـو الـذي‬
‫يحمل قيمة واحدة فقط . مثل ص = 21. في هذه الحالة ص متغيـر يحمـل قيمـة معينـة‬
‫‪ Value‬و لكن هذه القيمة متغيرة فهي ليست ثابتة طالما البرنامج فـي طـور التنفيـذ فـي‬
‫اي لحظة ممكن تتغير هذه القيمة . بعض لغات البرمجة مثل جافـا تسـتوجب تحديـد نـوع‬
‫المتغير فاذا كان المتغير من نوع حرف مثل فل يمكن اسناد قيم رقمية للمتغير و لكـن فـي‬
‫لغات البرمجة الديناميكيةمثل بيرل و بي اتش بي ل يوجـد مثـل هـذا التقيـد فـالمتغير ص‬
‫مثل يمكن ان يحمل اي قيمة رقمية او نصية ..ألخ .‬
‫مثال:‬
‫;1 = ‪my $number‬‬
‫في هذا المثال اعلنا عن المتغير و في نفس الوقت اسندنا له قيمــة و هــي 1‬
‫كان بالمكان ان نعلن عن المتغير فقط دون اسناد اي قيمة :‬
‫;‪my $number‬‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫مثال اخر :‬
‫;”‪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‬‬
‫هذا المر مثل سيطبع لنــا القيمــة ذات الــترتيب 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‬‬
‫مثال:‬
‫/‪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‬‬
‫في هذه الحالة سيقوم المفسر بتنفيذ الوامـر مـن البدايـة الـى النهايـة و ينتهـي البرنامـج‬
‫بشكل تسلسلي ‪ ، Sequenced‬مثال:‬
‫;1= ‪{my $number‬‬
‫;2= 2‪my $number‬‬
‫;2‪print $number+$number‬‬
‫}‬
‫في هذا المثال سيقوم البرنامج بانشاء متغير و يسند له قيمة و متغيــر ثــاني‬
‫و يسند له قيمة و في النهاية يجمع القيمتين و يطبعهما الى الشاشة .‬
‫نلحظ عدم وجود اي تشـعب فـي البرنامـج . و لكـن هـذا كمـا قلنـا للبرامـج‬
‫البسيطة و لكن في اغلب الحيــان ســنحتاج الــى ادوات للتحكــم بســير العمــل‬
‫‪ Control Structeres‬و مرة اخرى كل لغة برمجة توفر اليات مختلفة و لكن سنأخذ‬
‫بعض المثلة الدارجة :‬
‫الجملة الشرطية ‪:If‬‬
‫باستخدام ‪ if‬و الـتي تعنـي "اذا" نسـتطيع ان نحصـر تنفيـذ جـزء معيـن مـن البرنامـج‬
‫بحسب الشرط. مثال:‬
‫)"‪if ($user eq "Ali‬‬
‫}"!‪{print "Access granted‬‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫هذا مثال بسيط لدينا عبارة تأكيد دخــول و لكــن ل نريــد ان نطبعهــا لكــل مــن‬
‫يدخل الى برنامجنا، فقط في حالة تحقق الشرط نطبع العبارة . الشرط هو ما‬
‫بين القوسين الذين يليان كلمة ‪ ، 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‬‬
‫‪: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‬‬
‫دوائر التكرار:‬
‫في بعض الحيان نحتاج ان نكرر تنفيذ اوامر معينة ، و هنا تأتي دوائر التكرار .. عادة ما‬
‫يرافق كل دائرة تكرار عداد لديه قيمة صغرى و قيمة كـبرى لكـي تنتهـي عمليـة التكـرار‬
‫عنـد الوصـول للقيمـة الكـبرى و بـذلك نضـمن عـدم اسـتمرار التكـرار الـى مـا ل نهايـة‬
‫‪.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‬‬
‫)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‬‬
‫!‪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‬‬
‫‪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‬‬
‫;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‬‬
‫‪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‬‬
‫}"‪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‬‬
‫‪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‬‬
‫في المثــال الثــالث قمنــا بتحويــل النــص الــى الحــروف الكــبيرة و فــي المثــال‬
‫الخير الى الحروف الصغيرة . ما يهمنا هو // حيث بين هذين نضع التعابير‬
‫المعتادة و المر المهم الخر هو ما قبل // حيث نضع المعامل مثــل ‪ s‬معامــل‬
‫الستبدال .‬
‫‪ :: Event – Driven‬البرمجة المعتمدة على الحداث‬
‫هنـا مسـار البرنامـج يحـدد مـن خلل الحـوادث ، مثل : الحساسـات او مـن‬
‫خلل المستخدم كالنقر على الفأرة او رسائل من برامج اخرى او مــن خلل‬
‫‪ .threads‬عادة نتعامل مع هذه النوعية من البرمجــة جنبــا الــى جنــب مــع‬
‫برمجة الواجهات الرسومية فهي توفر الية الربط بين الواجهات الرســومية‬
‫و الكواد البرمجية و قد تكلمت عن اهم مباديء هذه الطريقة فــي البرمجــة‬
‫في المقالة المرفقة " انت تعرف الكثير ! اكتب برامجك الشخصية"، حيــث‬
‫سنستعرض كيفية انشاء برنامج يبني بثقل على هذه الطريقة.‬
‫‪ :: Object Oriented‬البرمجة الشيئية ) الكائنية(‬
‫الطريقة المتداولة للبرمجة و الكثر شهرة في اوســاط الشــركات الكــبيرة و‬
‫حتى الجامعات هذه اليام . البرمجة الشيئية ليســت مفهومــا جديــدا بــل لهــا‬
‫من القدم و التاريخ ما يشهد على نموها و تبلورها علــى مــدى عــدة لغــات‬
‫برمجية تبنت هذه النظرة ، و لكن تتبع الجـانب التـاريخي ليـس مكـانه هـذه‬
‫العجالة.‬
‫قبل ان نتكلم قليل عــن البرمجــة الشــيئية يجــب ان نعــرف لمــاذا لقــت هــذه‬
‫الطريقة في البرمجة نجاحا واسعا بحيث ان اللغة التي ل تدعم هــذه الرؤيــة‬
‫البرمجية و ل تتيح الدوات اللزمة لكتابة برامج شــيئية تعتــبر ناقصــة فــي‬
‫نظر الخبراء و الشركات ؟‬
‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫و لهذا نرى ان حتى اللغات التي لم تكتب اصــل علــى النمــوذج الشــيئي فــي‬
‫وقت لحق يتم اضافة الــدعم لهــذا النمــوذج ، و كمثــال لغــة البرمجــة بيــرل‬
‫التي هي لغة اجرائية في الصل و لحقا تم اضافة النموذج الشــيئي للغــة و‬
‫لغة البي اتش بي و غيرها الكثير من اللغات .‬
‫و ليس ما يهمنا هنا هو كيف تطبق كــل لغــة مفهــوم الكــائن ؟ و مــاذا يعنــي‬
‫الكائن خلف الستار .. و لكن نعم السؤال المهم هنا ؟ لماذا كل هذا الهتمام‬
‫بالبرمجة الشيئية مع ان اغلبنا دخلنا عالم البرمجة مــن منطلقــات مختلفــة؟‬
‫قد يكون المنطلــق الجــرائي اكثرهــا قرابــة للبداهــة! لمــاذا هنــاك مباهــاة و‬
‫مقارنات بين مستوى دعم كل لغة للبرمجــة الشــيئية ؟ و هنــاك ســؤال مهــم‬
‫اخر هل الفضلية للغات البرمجة الشيئية الصرفة مثل سمولتولك و ايفل او‬
‫للغات الهجينة الخرى التي تتيح نوعا من المرونة و ل تجبر المبرمــج فــي‬
‫ان ينظر لكل شيء على انه كائن ؟‬
‫شخصيا افضل الطريق الخيــر لنــه حــتى لغــات البرمجــة الكائنيــة الصــرفة‬
‫تختلف في تطبيق مبــادئ و مفــاهيم البرمجــة الشــيئية فلكــل وجهــة نظــر و‬
‫رؤى لمعالجة الموضوع محل الخلف ، لذلك المرونة دائما سلح جيد لكــل‬
‫لغــة برمجــة ، و ل اقصــد المرونــة بمعناهــا الضــيق مثل فــي العلن عــن‬
‫المتغيرات بل اريد المعنى الوسع و هو حرية المبرمج في معالجة المشكلة‬
‫بالطريقة و الرؤية التي يختارها فتكون اللغة اداة و ليست عقبة .‬
‫لذلك احب لغات البرمجة كلغـة بيـرل الـتي تجعـل مـن الحريـة شـعارا لهـا و‬
‫توفر للمبرمج عدة طرق لحل المشكلة يختار منها ما يشاء و يبدع ما يشاء‬
‫بدون ان تجبره اللغة على طريق معين .‬
‫على انه هنا ايضا اختلف و الكثير يرون ان هــذا المــر ســلح ذو حــدين و‬
‫في اغلب الحيان يرجحون كفــة الجــانب الســلبي فنســمع عبــارات مثــل ) ل‬
‫يمكــن قــراءة اكوادهــا ( او ) تعطيــك الحبــل و الكرســي لتشــنق نفســك ( و‬
‫غيرها من العبارات التهكمية .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫و يفضلون الشعار المغاير ) هناك طريقــة واحــدة فقــط لعمــل هــذا ( و ذلــك‬
‫باعتبارهم يفيد التنظيم و يساعد على بناء المشــاريع العملقــة ، لــن احــول‬
‫الموضوع هنا الى مناقشة طويلة و ل انتصارا لطــرف علــى حســاب طــرف‬
‫اخــر لكــن ساستشــهد بمقولــة للمبرمــج الكــبير بــول غراهــام حيــث يقــول‬
‫مضمونا ) اننا كنا ل نعير الشركات الــتي تطلــب مــبرمجين جافــا اهتمامــا و‬
‫لكننا كنا نخشى الشركات التي تطلب مبرمجين ليســب او بيــرل لننــا حينهــا‬
‫نعلم انهم يريدون مبرمجين حقيقييــن !(. و فـي مكـان اخـر يقـول ) ان سـر‬
‫نجاحنا هو استخدامنا لليسب و لكن يبدو ان ل احد مهتم بسرقة سر نجاحنا‬
‫! (.‬
‫بعد كل هذا الستطراد لنذكر شيئا من مزايا البرمجة الشيئية :‬
‫1 - البساطة : حيث ان الكائنــات الوهميــة تحــاكي الكائنــات الحقيقيــة ، ذلــك‬
‫يؤدي الى تقليل التعقيد و هيكل برامج واضح للغاية و سهل الفهم.‬
‫2- سهولة الصيانة : حيــث ان عمليــة الصــيانة ســتكون ســهلة و ســنعرف‬
‫مكان الخطاء بالتحديد لن كل كائن له استقللية تامة.‬
‫3 - اعادة الستخدام : حيث ان الكائنــات يمكــن اعــادة اســتخدامها فــي عــدة‬
‫برامج.‬
‫4- التطوير : حيث ان عملية التوسع ستكون سهلة من خلل اضـافة اعـداد‬
‫قليلة من الكائنات الجديدة او التعديل المباشر علــى الكائنــات الموجــودة ، و‬
‫ذلك استجابة لي تغييرات او تحديات جديدة تفرضها بيئة التشغيل.‬
‫5 - التكاملية و تقليل العتمادية : حيـث ان كـل كـائن يمثـل كيانـا منفصـل ،‬
‫حيث ان العمل الداخلي للكائن منفصل عن اجزاء النظام الخرى.‬
‫6- سهولة التعديل : فهناك سهولة في اجراء اي تغييرات طفيفة في تمثيــل‬
‫البيانات او الجراءات في البرامج الشيئية. لن التغييرات داخــل اي كلس‬
‫ل تؤثر على الجزاء الخرى للبرنامج، حيث ان الطريقة الوحيدة للعالـــــم‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫الخــارجي فــي التصــال بهــذا الكلس هــو عــن طريــق واجهتــه باســتخدام‬
‫ميثودز الكلس نفسه.‬
‫الن ما هي البرمجة الشيئية ؟‬
‫هي بكل بساطة عملية محاكاة الواقع في البرمجــة هــي النظــر الــى الوجــود‬
‫على انــه مجـرد اشـياء او كائنــات ‪ Objects‬و مــن ثــم محاكــاته فــي عــالم‬
‫البرمجة . كل شيء في هذا الوجود يمكن ان ينظر اليه على انه كائن و كــل‬
‫كــائن لــه خصــائص)ســمات( ‪ Attributes‬و افعــال ‪ . Methods‬انــواع‬
‫الخصائص ‪ Field type‬ثابتة كان تكون قيمة رقمية او نصية و لكــن قيـم‬
‫الخصائص ‪ Field Value‬يمكن ان تختلف من حالة الى اخـرى . الكلس‬
‫‪ Class‬هو عبارة عــن قــالب ننشــيء منــه الكائنــات حيــث داخــل كــل كلس‬
‫سيتم تعريف خصائص و افعــال كــل كــائن مــن هــذا الكلس علــى انــه يجــب‬
‫النتبــاه الــى انــه عــادة ل يعتــبر الكلس كائنــا فــي حــد ذاتــه ال فــي اللغــات‬
‫الكائنية الصرفة . اذا عرفنا الن ان الكلس هــو مجــرد قــالب جــاهز لصــنع‬
‫كائنات من نوع ما .‬
‫نــأتي الن لنشــير الــى وجــود نــوع اخــر مــن الكلســات و هــو مــا يســمى‬
‫بالكلسات المجردة ‪ Abstract Class‬هذه الكلسات مهمتهــا تنظيميــة‬
‫فقط و ل يمكن انشاء اي كائن منها مباشرة بل يجب ان يكــون هنــاك كلس‬
‫يرث الكلس المجرد و ان ل يكون هو بدوره كلسا مجردا حينها فقط يمكن‬
‫ان ننشــيء كائنــات تحتــوي علــى خصــائص الكلس المجــرد . هنــا ذكرنــا‬
‫مصــطلح الوراثــة ‪ Inheritance‬و هــو بكــل بســاطة عمليــة انتقــال كــل‬
‫خصائص و افعال الكلس الب الى الكلس البن . لنأخذ بعض المثلــة قبــل‬
‫ان نواصل …‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫لنتخيل هناك مصنع للسيارات و نريد ان نحاكيه بالرؤيــة الشــيئية يمكــن ان‬
‫نبسط الى شيء مشابه الى:‬
‫‪abstract class Vehicle‬‬
‫‪abstract class Sedan‬‬
‫‪class Camry‬‬
‫نلحظ اننا انشأنا سلسلة من الكلسات لتنظيم المور حيث انه بــدانا بكلس‬
‫مجــرد باســم ‪) Vehicle‬مركبــة( و فيــه ســنعرف الخصــائص و الفعــال‬
‫الساسية التي يجب ان تحتويهــا كــل مركبــة ثــم انشــانا كلس مجــرد باســم‬
‫سيدان يرث كل ما في كلس فيهكل و يضيف عليها خصــائص و افعــال كــل‬
‫عربة من نوع صالون اخيرا انشأنا كلس باسم كامري يرث كــل خصــائص‬
‫سيدان و يضيف عليها مميزات و هوية الكامري التي نعرفها .‬
‫هنا يطرح السؤال لماذا نجعل من سيدان و فيهكل كلسات مجردة ؟ لماذا ل‬
‫نتركها كلسات طبيعية اليس الغرض فقط هو الوراثة ؟ فيكون الجواب بكل‬
‫بساطة لننا نعلم مسبقا اننا لن ننشيء اي كائن مــن هــذه الكلســات و هــذه‬
‫عادة برمجية جيدة يجب النتباه لها و على المستوى المهنــي يتخــذ القــرار‬
‫فيها وقت التخطيط ‪. Design‬‬
‫نلحظ ان المخطط الن قابــل جــدا للتطويــع و التعــديل فــي وقــت لحــق مثل‬
‫باضافة مزيد من انواع السـيارات بـل و فئات السـيارات . فـي المثـال اعله‬
‫كان المخطــط ينحــو منحــى عــامودي بطــبيعته اي سلســلة مــن العلــى الــى‬
‫السفل و لكن مع محاكاة امثلــة اكــثر تعقيــدا ســيبدو شــكل المخطــط و كــانه‬
‫شــجرة ذات غصــون متفرعــة تصــلح لن تحــاكي الظــواهر الطبيعيــة قبــل‬
‫الحقائق البرمجية كمشجرة الكائنات الحقيقية من ثدييات ...الخ.‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫قبل ان انتقل للنقطة القادمــة و بمــا ان الكلم عــن المخططــات ل بــأس بــأن‬
‫نذكر لغة النمذجة الموحدة ‪ UML‬و التي عادة مــا تــدرس جنبــا الــى جنــب‬
‫مع كورس لغات البرمجة الشيئية و هي لغة تمثيلية مفيدة جــدا فــي مرحلــة‬
‫التخطيط و تحتوي على 41 نوعا من المخططات تقع تحت مظلــة تصــنيفين‬
‫رئسين :‬
‫1- مخططات هيكلية تركز على عناصر النظام و ماذا يجب ان يحتوي.‬
‫2- مخططات تفاعلية )تصف سلوك الوبجكتس( تركـز علـى مـاذا يجـب ان‬
‫يحدث في النظام المحاكى و كيف سيتم التواصل و التفاعل بين العناصر.‬
‫من خلل هذا الستعراض البسيط بدانا نعرف سر قوة البرمجة الشيئية فــي‬
‫السيطرة على المشاريع العملقــة جــدا ، هــذه القــوة الــتي تنبــع فــي حقيقــة‬
‫المر من التجريد .‬
‫في البرمجة الجرائية عــادة هنــاك مشــكلة فــي كــون البيانــات مشــاعة لكــل‬
‫اجــــزاء البرنامــــج و لكــــن فــــي البرمجــــة الشــــيئية هنــــاك نــــوع مــــن‬
‫الكبسلة)التغليف( ‪ Encapsulation‬اي ان البيانات الخاصة بــاي كـائن ل‬
‫يمكن تعديلها ال من خلل ارسـال الرسـائل ‪ Messages‬الـى الكـائن و هـو‬
‫بدوره يقوم بعمــل اللزم ســواء بالتعــديل المباشــر او اعــادة ارســال رســالة‬
‫اخرى الى كائن اخر طلبا للمساعدة في اتمام الطلب.‬
‫من هنا نعرف انه في البرمجة الشــيئية تتــم المهــام عــن طريــق الرســائل و‬
‫مجموع الرسائل التي يفهمها الكائن تســمى بروتوكــول الكــائن ‪Protocol‬‬
‫بعبارة اخرى البروتوكول او الرسائل التي يمكــن للكــائن ان يتجــاوب معهــا‬
‫هي ذاتها الميثودز المعرفة سلفا في كلس الكائن .‬
‫نعود هنا للشارة الى اهمية التجريد هنا ايضــا فانــا كمســتخدم لــو اردت ان‬
‫ارسل ازهارا الى صديقي ما علي سوى ان اذهب الى محل الزهار و اخبره‬
‫باني اريد هذا النوع من الزهار لكي يتم ارساله الى صديقي .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫هنا نلحظ انني اعطيت البائع رسالة تمثل طلبا و ل حاجة لي بمعرفة كيفية‬
‫تعامل البائع لتمام عملية الرســال . هــذه العمليــة تعــرف بــالبلك بوكســنج‬
‫‪ Black Boxing‬اي ان كل كائن مسؤول عن التعامــل مــع كــل رســالة او‬
‫طلــب بطريقتــه الخاصــة الــتي ل يجــب ان يعــرف عنهــا بقيــة الكائنــات اي‬
‫تفاصيل اضافية .‬
‫فبائع الزهور ربما يرسل طلب نقل الزهور الى محطة البريد او الــى شــركة‬
‫خاصة او ربما يعطيها لصــديق ســيذهب الــى منطقــة صــديقي !. و بمــا اننــا‬
‫نتكلـــــم عـــــن الرســـــائل لنتكلـــــم عـــــن البوليمـــــورفيزم ) التعدديـــــة(‬
‫‪ Polymorphism‬و هــي مــن اهــم مميــزات البرمجــة الشــيئية و تلخــص‬
‫بانها قدرة استجابة انواع مختلفة من الكائنات الى رسالة واحدة و لكن كــل‬
‫كائن يفسرها بطريقته الخاصـة . المثـال المشـهور الـذي سيوضـح لنـا هـذا‬
‫المفهوم هو لو ان احد مدراء الشركات عقد اجتماعا و بعد انتهاء الجتماع‬
‫قــال لمــوظفيه تــابعوا اعمــالكم فالرســالة هنــا واحــدة و لكــن كــل موظــف‬
‫سيستجيب بطريقته الخاصــة فموظــف التســويق ســيعود الــى محــل الــبيع و‬
‫موظف الدعم الفني سيعود الى مكتب الدعم الفني و هلم جرا .‬
‫الن بما اننا نفهم جيدا ميزة البوليمورفيزم ، لنعد الى الفعــال ) الميثــودز (‬
‫حيث يمكن ان تعايش حالت اقوى من البوليمورفيزم بدل من فقط التشارك‬
‫في اسماء الرسائل كما في المثال الســابق . الحالــة الكــثر انتشــارا هــي مــا‬
‫يعــرف بــالوفر لــود ‪ Method Overload‬و هــي قــدرة الكــائن علــى‬
‫الســتجابة لرســالة معينــة بعــدة اشــكال مختلفــة علــى حســب نــوع و عــدد‬
‫الرجيومنتس ‪ Parameters or arguments‬المرفقة مــع الرســالة ،‬
‫مثل :‬
‫;)(‪jump‬‬
‫;)‪jump(Int myNumber‬‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫فهنا لــو اعطانــا المرســل عــدد مــرات القفــز فــي الرســالة لســتجاب الكــائن‬
‫بتكرار عملية القفز عدد المرات المطلوبـة و لكــن لــو تـرك المرســل رســالة‬
‫فارغة من اي رقم ستكون الستجابة للميثود الفتراضي لنقــل قفــزة واحــدة‬
‫فقط .‬
‫هذا مثال بسيط و لكنه يوضح فكرة جيدة اخرى و هي توفير انواع مختلفــة‬
‫من الميثود لمعالجة حالت مختلفة من الرسائل و الطلبات .‬
‫الحالة الخرى هي ما يعرف بالميثود اوفر رايد ‪ 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‬‬
‫تعدد التوارث ‪Multiple Inheritance‬‬
‫في لغات البرمجة مثل سي ++ و بيرل هنــاك امكانيـة لي كلس بــان يــرث‬
‫من اكثر من كلس ، هذا الشيء ل يخلو من الفائدة الكثيرة على الرغم مــن‬
‫بعض العيوب و لكن في لغة جافا مثل ل يمكن للكلس ان يرث ال مـــــــــن‬
‫كلس واحد و هنا يظهر انه سنلقي صعوبة و محدودية و لكن جافــا تــوفر‬
‫ما يسمى بالواجهات ‪ Interface‬حيث يمكن لي كلس ان يطبق اكثر مــن‬
‫واجهة بالضافة الى وراثته من كلس معين . عندما نعلن عــن كلس بــانه‬
‫يطبق واجهة ما فاننا ننشيء في الحقيقة عقد يجب من خلله علــى الكلس‬
‫المطبق ان يوفر التطبيق البرمجي لكل ميثود موجود في الواجهة .‬
‫فــي البرمجــة الشــيئية كــثيرا مــا نتكلــم عــن محــددات الــترخيص ‪Access‬‬
‫‪Modifier‬و التي من خللها نضيف بعد اخر من اخفاء المعلومات ‪Data‬‬
‫‪ Hiding‬طبعا لكل لغة برمجية انـواع تحكـم مختلفـة و لكـن فـي جافـا مثل‬
‫لدينا :‬
‫‪1.private‬‬
‫‪2.protected‬‬
‫‪3.default‬‬
‫‪4. public‬‬
‫طبعا استخدام هذه الكلمات المفتاحية بالشكل الصحيح يحتاج خــبرة و قــرار‬
‫المبرمج نفسه و لكن القاعدة العامة هي كلما كان هناك تشديد في الوصــول‬
‫الى القيــم و الميثــودز كــان افضــل فنحــن قلنــا ان كــل كــائن يجــب ان يكــون‬
‫مسؤول عن نفسه فل يفضل التعــديل علــى المعلومــات مــن امــاكن كـثيرة و‬
‫مختلفة تؤدي بدورها الى المشاكل .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫‪ :: Functional‬البرمجة الوظيفية‬
‫البرمجــة الوظيفيــة تعامــل الحوســبة كتقييــم للــدوال الرياضــية و تتجنــب‬
‫البيانــات المشــتركة ‪ Mutable‬و الحالــة ‪ .State‬تجــب الشــارة هنــا ان‬
‫البرمجة الوظيفية هي مجموعة افكار ان صح التعبير و ليست قوانين يجب‬
‫متابعتها لذلك هنــاك اختلف فــي تطــبيق البرمجــة الوظيفيــة فهنــاك اللغــات‬
‫الوظيفيــة الصــرفة ‪ pure functional‬كلغــة البرمجــة هاســكل و غيرهــا‬
‫حيث انها ل تتيح امكانية التغييـر او تحـديث قيمـة المتغيـر. بنـاء علـى هـذا‬
‫الشرط تكون المتغيرات كالمتغيرات في الرياضيات حيـث ص + 2 = 3 و‬
‫لكن يمكننا ان نقــول ض = ص+ 3 و لكننــا سننشــيء متغيــر اخــر لن ص‬
‫قيمة ثابتة غير قابلة للتغيير.‬
‫و لكن بشكل عام اللغات التي التي تدعم :‬
‫‪– Code references‬‬
‫‪– Closures‬‬
‫يمكن ان تسمى و ان تتيح البرمجة الوظيفية.‬
‫تعمدت ان ل اتكلم عن الــ ‪ Subroutines‬او الـ ‪ Functions‬في معرض‬
‫الكلم عن البرمجة الجرائية مع ان هذه الدوال تستخدم بكثرة في البرمجــة‬
‫الجرائية كأداة لستدعاء بعض الكواد التي يتكرر استخدامها في البرنامج‬
‫مثال بسيط هو بدل من ان نضع اكــواد تــذييل صــفحة ويــب فـي كــل صــفحة‬
‫يمكننــا بكــل بســاطة حفــظ و كتابــة الكــواد داخــل دالــة مــرة واحــدة فقــط و‬
‫الكتفاء باستدعاء الدالة اينما احتجنا لها ..‬
‫حسنا السؤال الن اذا كانت اللغات الجرائية تــوفر الــدوال فلمــاذا ل تســمى‬
‫كلها لغات وظيفية ؟ الجواب لكي نســتطيع ان نقــول عــن لغــة انهــا وظيفيــة‬
‫يجــب ان تتــوافر فيهــا بعــض المميــزات الــتي ذكرنــا بعضــها فــي البدايــة و‬
‫سنتطرق لبعضها بقليل من التفصيل كما سيأتي..‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫‪: References‬‬
‫اشرنا الى هذه النقطة كنقطة اساسية للبرمجة الوظيفيــة و ان كــانت ليســت‬
‫في حد ذاتها خاصية في البرمجــة الوظيفيــة ال انهـا اليـة تتيـح لنـا امكانيـة‬
‫البرمجة الوظيفية في بعض اللغات الجرائية.‬
‫طيب ما هو الـ ‪ reference‬؟ من اسمه هو اشــارة الــى مكــان المعلومــات.‬
‫بعبارة اخرى يمكننا ان نقول ان المشير او المرجع هو متغير لكنه ل يحمــل‬
‫القيمة الحقيقة انما يشير الى مكانها فقط . كمثال عندما اقــول تكلمنـا سـابقا‬
‫عن البرمجة الجرائية في صفحة 05 فأنا هنا اشير الى مكان المعلومة فــي‬
‫الكتاب و لكن ليس لدي المعلومة نفسها . في بيـرل اضــافة المعامــل  قبــل‬
‫اسم المتغير ينشيء لنا مؤشرا .. مثال:‬
‫;) ’‪my %hash = ( one => ‘Hello’, two => ‘World‬‬
‫;‪my $hashref = %hash‬‬
‫نلحظ هنا ان المتغير الذي يحمل القيم الحقيقيــة هــو ‪ hash‬و امــا المتغيــر‬
‫‪ hashref‬هو مجرد متغير يشير الى مكان المعلومات و الكلم هنا يطول و‬
‫يختلف مــن لغـة الـى اخــرى لـذلك سـنتجنب الطالــة بمــا اننـا اخــذنا الفكـرة‬
‫العامة.‬
‫الن لكي نتعرف اكثر على بعض المفاهيم المتداولة في البرمجــة الوظيفيــة‬
‫نحن بحاجة اول لن نعــرف كيفيــة كتابــة الــدوال بشــكل عــام ، المــر الــذي‬
‫سيتيح لنا فهم المفاهيم الكثر صعوبة .‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫اذا نبدا بمثال بسيط و هي دالة هيلو ! المشهورة..‬
‫{)(‪&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‬‬
‫جميل و اذا احببنا اضافة المزيد من القيم المــررة مــا علينــا ال ان نســتقبلها‬
‫كقائمة و نسندها لمتغيرات حسب الحاجة ، مرة اخرى هذا المر يختلف من‬
‫لغة الى اخرى و لكن هذا نموذج :‬
‫;)"2‪&hello("Visitor1","Visitor‬‬
‫;_@ = )2‪sub hello(){my ($name1, $name‬‬
‫;"‪print "welcome to ali websiten‬‬
‫;"1‪print "welcome $name‬‬
‫};"2‪print "welcome $name‬‬
‫نلحظ الن اننا نستطيع ان نتعامل مع العديد من القيم المــررة بهــذه الليــة .‬
‫في بعض الحيان ل نريد فقط ان ننفذ اوامر بل نريد من الدالة ان ترجــع لنــا‬
‫قيمة لكي نسندها الى متغير مثل .‬
‫كل ما علينا فعلــه الن هــو ان نســتخدم كلمــة ‪ return‬ففــي المثــال البســيط‬
‫ادناه هذه الدالة:‬
‫{)(‪sub hello‬‬
‫};3 ‪return‬‬
‫;)(‪my $number = hello‬‬
‫;‪print $number‬‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫هذه الدالة كما هو واضــح فقــط ترجــع قيمــة 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‬‬
‫الن ماذا تتوقعون ستكون نتيجة المرين الخرين ؟‬
‫النتيجــة ســتكون ‪ 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‬‬
‫الن سنحصــل علــى النتيجــة المتوقعــة 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‬‬
‫و هذه الكواد البرمجية لهذه العملية …:‬
‫;)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‬‬
‫‪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‬‬
‫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‬‬
: ‫الن نلحظ النتيجة‬
$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
‫المزيد من المصطلحــات :‬
‫‪IDE‬‬
‫هــــذه الكلمــــة تمــــر علينــــا كــــثيرا و هــــي اختصــــار ‪Integrated‬‬
‫‪ ، Development Enviroment‬اي بيئة التطــوير المتكاملــة ، حســنا‬
‫مــاذا يعنــي هــذا ؟ اعتقــد ان القليــل هــذه اليــام يبرمــج مــن خلل محــررات‬
‫النصوص مثل المفكرة فــي وينــدوز و ‪ vi‬فــي لينكــس ، حيــث يمكــن لنــا ان‬
‫نبرمــج برامــج كاملــة فقــط باســتخدام المفكــرة البســيطة ثــم نقــوم بعمليــة‬
‫الترجمــة للكــواد ، هــذه الطريقــة و ان كــانت جيــدة مــن ناحيــة انهــا تجــبر‬
‫المبرمج على العتماد على نفسه في البرمجة بدون اي تــدخل مــن برنامــج‬
‫الكتابة كمساعد ، ال انها تقلل من النتاجية . ل يزال هناك من يتعصب الــى‬
‫ان برامج كتابــة الكــواد يجــب ان تكــون بســيطة فــي حــد ذاتهــا و ل تغــرق‬
‫المبرمج فـي بحـار الخصــائص الــتي فـي العــادة ل يسـتخدمها بـذلك الشــكل‬
‫المستمر . الى عهد قريب كنت اتبنى هذا الرأي لني كنت ارى ان المبرمــج‬
‫فعل يجب ان يكون خــبيرا فــي لغتــه و حافظــا لكــل تفاصــيلها و خفاياهــا فل‬
‫يحتاج الى مساعدة من اي احد حتى لو كان برنامج التطــوير، و كنــت اتخــذ‬
‫من هذه الطريقة وسيلة لكي اصقل مهارتي، حيث كنت فــي وينــدوز اتعامــل‬
‫مباشرة مع المفكرة ، ثــم تطــور المــر الــى اســتخدامي لبرنامــج ‪ Padre‬و‬
‫الذي كان بسيطا جدا فــي امكانيــاته وقتهــا و لكــن احببتــه لنــه يقــدم خدمــة‬
‫التلوين للكواد. كنت اتجنب برنامج اكلبس او نــت بينــز بــل حــتى ‪Emacs‬‬
‫لنني كنت اؤمن بان الفترة التي سأقضيها في تعلم هذه البرامج و اكتشــاف‬
‫خفاياها و حفظ اختصــاراتها ، يجــب ان اســتغلها فــي تعلــم لغــتي المفضــلة.‬
‫على كل حال في يوم ما بدات العمل على مشروع لجافا و كان يتوجب علــي‬
‫عمله باستخدام اكلبس و من خلل عملي في هذا المشروع رايت ان الفــترة‬
‫التي احتجتها لتعلم البرنامج لم تكن بتلك الطول هذا فضل عن الفوائد الــتي‬
‫تحصلت عليها من اســتخدام اكلبــس ، عنــدها بــدات اؤمــن ببئيــات التطــوير‬
‫المتكاملة مع بعض التحفظات علــى بعــض النقــاط الــتي الــى الن افضــل ان‬
‫اعملها بنفسي مثل انشاء الواجهات الرسومية فهذه البرامج فقط تصلـــــح‬
‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
‫لتصــميم الشــكل الســريع للبرنامــج و لكــن عنــدما اريــد ان اكتــب الواجهــة‬
‫النهائية ساكتبها بنفسي لنني ل اريد كل تلك الكواد المحشوة من قبــل اداة‬
‫انشاء الواجهات ، و كذا الحال ايضــا فــي كتابــة اكــواد ‪ html‬فالتعامــل مــع‬
‫الدوات المرئيــة فــي هــذا المجــال تطويــل ل ارى لــه ضــرورة فــي اغلــب‬
‫الحيــان. علــى كــل حــال هــذه وجهــة نظــر … نعــود الــى بيئات التطــوير‬
‫المتكاملة ماذا تعني متكاملة هنا ؟ نستطيع ان نقول ان التكامل هنا يعني ان‬
‫نتحصل على برنامج واحد يقدم محرر نصوص و خدمات تحرير النصــوص‬
‫البرمجية مثل التلوين للكواد و ربما الكمال التلقائي و ايضــا ربمــا القــدرة‬
‫على تصحيح الخطاء في الوقت الحقيقي كما يوجد في اكلبس. ثم يجــب ان‬
‫يقدم البرنامج مفسر او مترجم للغة المعنية و قــد يســتخدم مفســر خــارجي.‬
‫ايضا قد تحتوي البيئة على ادوات البناء التلقائي. ايضا قد يحتوي البرنامج‬
‫ادوات لعملية التصحيح و التجريب. و مــا الــى ذلــك مــن خــدمات اخــرى قــد‬
‫تختلــف مــن برنامــج الــى اخــر حســب امكانيــاته مثــل تــوفير ادوات رســم‬
‫الواجهات الرسومية و ادوات العمل الجماعي ...الخ.‬
‫‪Compiled and interpreted‬‬
‫يمكن عادة تقســيم لغــات البرمجــة الــى مفســرة او مترجمــة او حــتى بعــض‬
‫اللغات توفر الثنين معا كما سيأتي. المترجم يحــول الكــود المصــدري ) مــا‬
‫نكتبه مثل بلغة سي( الى كود لغة اخرى غالبا الــى لغــة يفهمهــا الكمــبيوتر.‬
‫عادة الهدف الساسي مــن الترجمــة هــو التحصــل علــى ملــف تنفيــذي. فــي‬
‫اللغات المفسرة يتم ارسال الكواد الى مفسر اللغة و الذي يقوم هــو بــدوره‬
‫بتنفيذ الكواد مباشرة. بين هذا و ذاك توجد لغات لــديها مفســر و مــترجم و‬
‫توجد لغــات مثــل جافــا يتــم فــي البدايــة ترجمــة الملــف المصــدري الــى لغــة‬
‫وسطية ‪ byteCode‬و من ثم يتم تفسير هذا الكود من خلل المفسر الــذي‬
‫هو بالنسبة للجافا هو ذاته اللة التخيلية ‪. Virtual Machine‬‬

‫/‪http://arabicplg.sourceforge.net‬‬
‫‪Version 1.0 final release‬‬
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1
Prog guide 1

Más contenido relacionado

Similar a Prog guide 1

سي بالعربي.pdf
سي بالعربي.pdfسي بالعربي.pdf
سي بالعربي.pdfssuser536c36
 
4_5879580116761186441.pptx..............
4_5879580116761186441.pptx..............4_5879580116761186441.pptx..............
4_5879580116761186441.pptx..............AlyaaKaram1
 
مع الامثله البرمجه بسكراتس.اساسيات البرمجه
مع الامثله البرمجه بسكراتس.اساسيات البرمجهمع الامثله البرمجه بسكراتس.اساسيات البرمجه
مع الامثله البرمجه بسكراتس.اساسيات البرمجهMohamed Alashram
 
الترجمة الفورية.pptx
الترجمة الفورية.pptxالترجمة الفورية.pptx
الترجمة الفورية.pptxAliAlex12
 
لغات البرمجه بل تفصيل
لغات البرمجه بل تفصيللغات البرمجه بل تفصيل
لغات البرمجه بل تفصيلIbrheemJasim
 
Visual basic.net احترف فيجوال بيسك
Visual basic.net احترف فيجوال بيسك Visual basic.net احترف فيجوال بيسك
Visual basic.net احترف فيجوال بيسك Abdalwahab Noureldien
 
لقاء طلاب نادي جوجل للمطورين .pdf
لقاء طلاب نادي جوجل للمطورين .pdfلقاء طلاب نادي جوجل للمطورين .pdf
لقاء طلاب نادي جوجل للمطورين .pdfLeenaAlsayari
 
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلان
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلانمحاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلان
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلانExperience inbound initiative
 
Ayaspell arabic spellchecker
Ayaspell arabic spellcheckerAyaspell arabic spellchecker
Ayaspell arabic spellcheckerlinuxscout
 
ترويج منتجات البحث
ترويج منتجات البحثترويج منتجات البحث
ترويج منتجات البحثlinuxscout
 
صياغة البرامج ولغات البرمجه
صياغة البرامج ولغات البرمجهصياغة البرامج ولغات البرمجه
صياغة البرامج ولغات البرمجهmohamed hamed
 
Nabil al shahrani
Nabil al shahraniNabil al shahrani
Nabil al shahranina55
 

Similar a Prog guide 1 (20)

سي بالعربي.pdf
سي بالعربي.pdfسي بالعربي.pdf
سي بالعربي.pdf
 
4_5879580116761186441.pptx..............
4_5879580116761186441.pptx..............4_5879580116761186441.pptx..............
4_5879580116761186441.pptx..............
 
مع الامثله البرمجه بسكراتس.اساسيات البرمجه
مع الامثله البرمجه بسكراتس.اساسيات البرمجهمع الامثله البرمجه بسكراتس.اساسيات البرمجه
مع الامثله البرمجه بسكراتس.اساسيات البرمجه
 
C++ &amp; python
C++ &amp; pythonC++ &amp; python
C++ &amp; python
 
الترجمة الفورية.pptx
الترجمة الفورية.pptxالترجمة الفورية.pptx
الترجمة الفورية.pptx
 
عرض مقدمة في البرمجة 01
عرض مقدمة في البرمجة 01عرض مقدمة في البرمجة 01
عرض مقدمة في البرمجة 01
 
Bader madah
Bader madahBader madah
Bader madah
 
لغات البرمجه بل تفصيل
لغات البرمجه بل تفصيللغات البرمجه بل تفصيل
لغات البرمجه بل تفصيل
 
الدرس 1.pdf
الدرس 1.pdfالدرس 1.pdf
الدرس 1.pdf
 
Visual basic.net احترف فيجوال بيسك
Visual basic.net احترف فيجوال بيسك Visual basic.net احترف فيجوال بيسك
Visual basic.net احترف فيجوال بيسك
 
Python.pdf
Python.pdfPython.pdf
Python.pdf
 
Python.pdf
Python.pdfPython.pdf
Python.pdf
 
لقاء طلاب نادي جوجل للمطورين .pdf
لقاء طلاب نادي جوجل للمطورين .pdfلقاء طلاب نادي جوجل للمطورين .pdf
لقاء طلاب نادي جوجل للمطورين .pdf
 
Alshhrany c++
Alshhrany c++Alshhrany c++
Alshhrany c++
 
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلان
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلانمحاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلان
محاضره "مبرمجين اذن هنموت صغنططين :) " لمصطفى رسلان
 
Sketch engine
Sketch engine Sketch engine
Sketch engine
 
Ayaspell arabic spellchecker
Ayaspell arabic spellcheckerAyaspell arabic spellchecker
Ayaspell arabic spellchecker
 
ترويج منتجات البحث
ترويج منتجات البحثترويج منتجات البحث
ترويج منتجات البحث
 
صياغة البرامج ولغات البرمجه
صياغة البرامج ولغات البرمجهصياغة البرامج ولغات البرمجه
صياغة البرامج ولغات البرمجه
 
Nabil al shahrani
Nabil al shahraniNabil al shahrani
Nabil al shahrani
 

Último

الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .ppt
الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .pptالفعل الصحيح والفعل المعتل ونواعه لفيف نقص .ppt
الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .pptNaeema18
 
التنمية المستدامة والمكتبات الاكاديمية.pptx
التنمية المستدامة والمكتبات الاكاديمية.pptxالتنمية المستدامة والمكتبات الاكاديمية.pptx
التنمية المستدامة والمكتبات الاكاديمية.pptxJoudyHaydar
 
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdf
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdfالتعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdf
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdfNaseej Academy أكاديمية نسيج
 
أمثلة عن قضية السرقات الشعريه والانتحال في الشعر
أمثلة عن قضية السرقات الشعريه والانتحال في الشعرأمثلة عن قضية السرقات الشعريه والانتحال في الشعر
أمثلة عن قضية السرقات الشعريه والانتحال في الشعرneamam383
 
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptx
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptxالوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptx
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptxMohamadAljaafari
 
التعلم المؤسسي في المؤسسات الأكاديمية. pptx
التعلم المؤسسي في المؤسسات الأكاديمية. pptxالتعلم المؤسسي في المؤسسات الأكاديمية. pptx
التعلم المؤسسي في المؤسسات الأكاديمية. pptxyjana1298
 
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجه
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجهأهمية كرة القدم ومخاطر التعصب الكروي وعلاجه
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجهneamam383
 
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdf
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdfالخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdf
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdfabdomjido9
 
مدخل لعلم الارشاد السياحي الفصل الاول.pptx
مدخل لعلم الارشاد السياحي الفصل الاول.pptxمدخل لعلم الارشاد السياحي الفصل الاول.pptx
مدخل لعلم الارشاد السياحي الفصل الاول.pptxtourismistchristenaa
 
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptx
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptxدرس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptx
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptxNaceraLAHOUEL1
 
وزارة التربية دورة استراتيجيات التعلم النشط -.ppt
وزارة التربية دورة استراتيجيات التعلم النشط -.pptوزارة التربية دورة استراتيجيات التعلم النشط -.ppt
وزارة التربية دورة استراتيجيات التعلم النشط -.pptAdamIdiris
 
نشأة القضية الفلسطينية وتطورها التاريخي .pptx
نشأة القضية الفلسطينية وتطورها التاريخي .pptxنشأة القضية الفلسطينية وتطورها التاريخي .pptx
نشأة القضية الفلسطينية وتطورها التاريخي .pptxNaceraLAHOUEL1
 
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docx
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docxمخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docx
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docxouassam
 
أنواع الحياة والاغراض الشعرية في العصر الجاهلي
أنواع الحياة والاغراض الشعرية في العصر الجاهليأنواع الحياة والاغراض الشعرية في العصر الجاهلي
أنواع الحياة والاغراض الشعرية في العصر الجاهليneamam383
 

Último (14)

الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .ppt
الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .pptالفعل الصحيح والفعل المعتل ونواعه لفيف نقص .ppt
الفعل الصحيح والفعل المعتل ونواعه لفيف نقص .ppt
 
التنمية المستدامة والمكتبات الاكاديمية.pptx
التنمية المستدامة والمكتبات الاكاديمية.pptxالتنمية المستدامة والمكتبات الاكاديمية.pptx
التنمية المستدامة والمكتبات الاكاديمية.pptx
 
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdf
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdfالتعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdf
التعليم في عصر الذكاء الاصطناعي مواطن التحدي ومناهل الفرص _.pdf
 
أمثلة عن قضية السرقات الشعريه والانتحال في الشعر
أمثلة عن قضية السرقات الشعريه والانتحال في الشعرأمثلة عن قضية السرقات الشعريه والانتحال في الشعر
أمثلة عن قضية السرقات الشعريه والانتحال في الشعر
 
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptx
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptxالوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptx
الوعي المعلوماتي للعاملين في المكتبات و مراكز المعلومات.pptx
 
التعلم المؤسسي في المؤسسات الأكاديمية. pptx
التعلم المؤسسي في المؤسسات الأكاديمية. pptxالتعلم المؤسسي في المؤسسات الأكاديمية. pptx
التعلم المؤسسي في المؤسسات الأكاديمية. pptx
 
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجه
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجهأهمية كرة القدم ومخاطر التعصب الكروي وعلاجه
أهمية كرة القدم ومخاطر التعصب الكروي وعلاجه
 
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdf
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdfالخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdf
الخرائط الموضوعاتية وتحليلية - المحاضرة الثالثة.pdf
 
مدخل لعلم الارشاد السياحي الفصل الاول.pptx
مدخل لعلم الارشاد السياحي الفصل الاول.pptxمدخل لعلم الارشاد السياحي الفصل الاول.pptx
مدخل لعلم الارشاد السياحي الفصل الاول.pptx
 
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptx
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptxدرس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptx
درس الطباقالمحسنات المعنويّة، بهدف تحسين المعنى .pptx
 
وزارة التربية دورة استراتيجيات التعلم النشط -.ppt
وزارة التربية دورة استراتيجيات التعلم النشط -.pptوزارة التربية دورة استراتيجيات التعلم النشط -.ppt
وزارة التربية دورة استراتيجيات التعلم النشط -.ppt
 
نشأة القضية الفلسطينية وتطورها التاريخي .pptx
نشأة القضية الفلسطينية وتطورها التاريخي .pptxنشأة القضية الفلسطينية وتطورها التاريخي .pptx
نشأة القضية الفلسطينية وتطورها التاريخي .pptx
 
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docx
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docxمخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docx
مخطط رياضيات .مخطط الفترة 4 و 5 رياضيات سنة سادسة6.docx
 
أنواع الحياة والاغراض الشعرية في العصر الجاهلي
أنواع الحياة والاغراض الشعرية في العصر الجاهليأنواع الحياة والاغراض الشعرية في العصر الجاهلي
أنواع الحياة والاغراض الشعرية في العصر الجاهلي
 

Prog guide 1

  • 1. ‫مختصر‬ ‫دليل لغات البرمجة‬ ‫كتبه‬ ‫علي آل ياسين‬ ‫راهب في صومعة‬ ‫عضــــو‬ ‫/‪http://arabicplg.sourceforge.net‬‬ ‫‪Version 1.0 final release‬‬
  • 2. :: ‫:: بسم ال الرحمن الرحيم‬ :: ‫:: تم اعداد الكتاب باستخدام برنامج‬ ‫ رخصة الكتاب‬Creative Commons http://creativecommons.org/licenses/by-nc-sa/3.0/us/ ‫مرفق في النهاية مستند الترخيص‬ http://arabicplg.sourceforge.net/ Version 1.0 final release
  • 3. ‫:: اهداء ::‬ ‫الى ناحيتـــها ،،‬ ‫الى قبلتهـــا ،،‬ ‫الى سموهـــا ،،‬ ‫الى حبهــــا ،،‬ ‫الى روحها ،،‬ ‫الى جسمها ،،‬ ‫الى وقوفها ،،‬ ‫الى جلوسها ،،‬ ‫الى قنوتها ،،‬ ‫الى دعائها ،،‬ ‫الى ركوعها ،،‬ ‫الى سجودها ،،‬ ‫الى انبساطها ،،‬ ‫الى انقباضها ،،‬ ‫الى ابتسامتها ،،‬ ‫الى سرورها ،،‬ ‫الى صاحبــــة الشــــــأن ،،‬ ‫اليك ،، جعلني ال فداك ،،‬ ‫/‪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= 2‪my $number‬‬ ‫;2‪print $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‬‬ ‫;_@ = )2‪sub hello(){my ($name1, $name‬‬ ‫;"‪print "welcome to ali websiten‬‬ ‫;"1‪print "welcome $name‬‬ ‫};"2‪print "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‬‬