السبت، يونيو 20، 2009

لماذا البرمجة الوظيفية (الجزء 2)

توقفت في الجزء الأول عند ترجمة المقدمة لـ "Why Functional Programming Matters". في هذا الجزء أكمل الترجمة:

مشابهة مع البرمجة الهيكلية "structured programming":
لعله يساعدنا على فهم الموضوع رسم مقارنة بـ "البرمجة الهيكلية". في الماضي، أختصرت صفات و مميزات البرمجة الهيكلية بالتالي: إنها لا تحتوي على تعليمات goto. أجزاء البنامج blocks ليس لها مداخل و مخارج متعددة. و البرامج الهيكلية يمكن تتبعها رياضيا أسهل من غيرها. هذه الميزات تشبه كثيرا ميزات البرمجة بالدوال.

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

عدم وجود "goto" في اللغة، ليس هو العامل الرئيسي. صحيح أنها تساعد في نطاق سطور قليلة أو حتى عدة دوال، في المقابل، البرمجة الهيكلية تساعد في صحة البرنامج و جودته في النطاق الأوسع. لذا فإن البرمجة الهيكلية يمكن الإستفادة منها بغظ النظر عن اللغة المستعملة، سواء كانت FORTRAN أو Assmbly

الأن كثير من اللغات تتمتع بخصائص تساعد على البرمجة الهيكلية من حيث تقسيم البنامج إلى وحدات مصممة "Modular design" . ومع ذلك، هناك نقطة هامة جدا غالبا ما تنسى. عند كتابة برنامج منمذج في حل مشكلة ما، ربما يجزء أحدهم المشكلة إلى مشاكل جزئية أصغر و أبسط، ثم يحلها و يجمع بين الحلول. الطرق التي يمكن للمرء أن يجزء بها المشكلة الأصلية تعتمد مباشرة على الطرق التي يمكن للمرء أن يجمع بها حلول الأجزاء معا. لذلك، من أجل زيادة قدرة المبرمج على تجزئة مشكلة ما من الناحية النظرية، لا بد من توفير أنواع جديدة من طرق الجمع (الغراء) في لغة البرمجة. ما هو موجود حاليا من قواعد معقدة لتحديد نطاق المعلومات (information locality) و توفير إمكانة ترجمة الوحدات منفصلة (unit of compilation) تساعد فقط في تفاصيل سطحية، و لا توفر أساليب جديدة في مفهوم حلحلة المشاكل. يمكن للمرء أن يقدر أهمية الغراء عن طريق القياس على النجارة.
يمكن بسهولة تامة صنع كرسي من أجزاء -- قاعدة وسيقان وظهر الخ -- وجمعهم مع بعضهم البعض بالطريق الصحيحة. لكن هذا يتوقف على قدرة النجار على صناعة المفاصل وغراء الخشب. عندما نفتقر إلى هذين العاملين، فإن الطريقة الوحيدة لصنع كرسي هو نحته كاملا من قطعة واحدة من الخشب، وهو أمر أصعب بكثير. هذا المثال يوضح كلا من الإمكانيات الهائلة التي توفرها فكرة تجزئة المشاكل وأهمية وجود الغراء.

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

ليست هناك تعليقات: