الثلاثاء، 15 نوفمبر 2011

المفاضلة بين لغات البرمجة 2

التهجين:


تتفاخر كثيرٌ من اللغات البرمجية (أو على الأحرى يتفاخر مصمموها و المستخدمون المتعصبون لها) اليوم بأنها لغاتٌ كائنيةٌ صرفة pure object oriented، أو لغاتٌ وظائفيةٌ functional أو إجرائيةٌ procedural صرفة، و ذلك من منطلق أن الخير كل الخير فى ذلك النمط البرمجى programming paradigm الذى تخصصت فيه تلك اللغات و لا خير فيما عاداه، و هو القول الذى أود أن أنوه هنا إلى مدى حمقه و بلاهته.
فنرى من يتعصب للـjava يقول أن البرمجة الكائنية هى الأفضل و هى النوع الأقوى من الأنماط البرمجية التى وصل إليها الفكر البرمجى البشرى، و بالتالى كان من الرائع أن تكون الجافا تامة الكائنية، و هناك من يصر حتى اليوم على أن البرمجة الإجرائية هى الأفضل و الأقدر على القيام بكل المهام بسهولة و بالتالى تكون البرمجة بلغات عتيقة مثل الـ(C) منتهى المتعة بالنسبة له !
و الحق أننى لا أرى الحق مع أىٍ منهما، بل أراهما رأيا ما امتلأ من الكوب و لم ينتبها إلى ما فرغ منه، فالمبرمج باللغة الكائنية الصرفة لم ينتبه إلى ما بها من عيوب كان بإمكانه تفاديها عند البرمجة بالنمط الوظائفى أو الإجرائى، و كذا فالمبرمج الوظائفى أو الإجرائى إن صح لى أن أسميه هكذا لم ينتبه إلى أنه كان بإمكانه الإفادة من ميزات البرمجة الكائنية بدلاً من المعاناة التى وضع نفسه فيها حينما استخدم نمط البرمجة الآخر.
و قولى هنا يستند إلى أن كل نمطٍ برمجىٍ له ميزاته و عيوبه التى يعلمها كل دارسٍ لعلم هندسة البرمجيات (الذى هو للمبرمج بمثابة أصول الفقه للفقيه و أصول الحديث للمحدث بلا زيادةٍ أو نقصان)، و ما دام الأمر هكذا فإنه من الأفضل لو استطاع المبرمج أن يستخدم كل نمطٍ من هذه الأنماط فى أفضل النواحى التى يتميز فيها و يكون من الأكفأ استعماله فيه
و ما دامت اللغة البرمجية هى الأداة التى يستعملها المبرمج فى عمله فإن هذه الأداة ستكون هى الفيصل فى تحديد الاختيارات التى سيقوم المبرمج باختيار نمط البرمجة المناسب من بينها، فلو كانت اللغة صرفة النمط (سواء أكانت كائنيةً أم وظائفيةً أم إجرائيةً) فإنها تقوم عندئذٍ بفرض ذلك النمط على المبرمج و تكبله به و تقيده به تماماً فلا يفارقه، أى أنها تعطيه كل ميزات ذلك النمط و لكنها تُحَمِّله كل عيوبه، و فى نفس الوقت تحميه من عيوب الأنماط الأخرى و لكنها تحرمه من المميزات التى تتمتع بها و لا توجد فى نمطها المختار.
و المجادلة بأنه يمكن ببعض الالتفاف بناء نمطٍ باستخدام نمطٍ آخر هو نوعٌ من الاستجارة بالنار من الرمضاء، فما دام هناك الطريق الأسهل و هو إتاحة الفرصة أمام المبرمج ليختار النمط الذى يرتضيه لتطبيقه فلم تكلف العناء و إثقال عاتق المبرمج بمهمة الالتفاف و الدوران ليحصل على ما يريد، ثم فى النهاية نجد أن لهذا الأمر أضراره التى لا تخفى على أحد و منها: 
أن هناك أنماطاً يكون من الصعب أن تُعَلِّمها للمبرمج المبتدئ فى البداية قبل الأنماط الأخرى، مثل البرمجة الكائنية التى لا يمكن لأحدٍ أن يفهمها جيداً قبل أن يفهم أولاً البرمجة الإجرائية و الوظائفية، و ما يحدث عندما يكون أمامه لغة برمجةٍ كائنيةٍ صرفةٍ مثل الـjava و يبدأ أول تعليمه بها ببرنامج هو الأبسط فى أى لغة مثل:
ثم يتساءل ببراءةٍ عن معنى public و class و static أن المعلم له يبدأ فى قول كلامٍ كثيرٍ من عينة (لن نتحدث عن هذا الآن) و (أكتبها كما هى و سأخبرك بالسبب فى وقت لاحق) و (كلا لا تخلط بينهما فهذه موضوع درس اليوم و تلك موضوع الدرس العاشر، فلا تتعجل و اكتب كما أقول لك و ستفهم فيما بعد) و غيرها الكثير و الكثير من الكلام الذى لا يجد فى نفس المستمع إلا دور إثارة الحيرة و الإرتباك بشدة
و يكون بعدها من الجلى أنه لا يمكننا تعليم البرمجة بلغةٍ مثلها؛ لأننا سنحتاج إلى المرور على اللغات الأخرى أولاً قبل المجئ إليها، و بالتالى يضيع الكثير و الكثير من الوقت على المبرمج المبتدئ متخبطاً بين اللغات المختلفة لمجرد تعلم البرمجة بصورةٍ جيدة و هو الأمر الذى لا أجد له داعياً من أى نوع. 
و خلاف ذلك الوضع مع اللغات التى لا تدعم البرمجة الكائنية مثل الـC حيث يكون على الراغب فى تعلم البرمجة الكائنية الذهاب إلى لغةٍ أخرى، و لعل ما يخفف من عناء ذلك و مشقته فى حالة مبرمج الـC أنه سيجد لغة الـ++C التى يمكنه أن يغمض عينيه بعض الشئ عن الفروقات التى بينها و بين الـC ليقول (بضميرٍ غير مستريح) أنهما ذات اللغة، و أنه لم يضطر إلى ترك اللغة الأولى لتكملة مشوار التعلم البرمجى، و لكن الحقيقة تظل هى الحقيقة من حيث أنه حتى فى هذه الحالة فإن الأمر كان مرهقاً بالنسبة له و لم يكن كما يحاول إيهامنا نزهةً ريفيةً جميلة.
و حتى فى تلك الحالة يظل القول بأن المبرمج ما زال تحت سيطرة نوعٍ واحدٍ من الأنماط البرمجية حقيقةً في منتهى القوة و العنفوان، و يظل الحصول على ميزات الأنماط البرمجية الأخرى رهناً بمدى البراعة و الدهاء و الوقت و الجهد الذى بإمكان المبرمج  بذله للالتفاف حول النمط المفرد للغة لبناء النمط المطلوب باستخدامهو هكذا سنرى إهدار الوقت و الجهد و حيل الحواة و المشعوذين فى أكواد المبرمجين من تلك النوعيات المسكينة المقهورة على أمرها.
 لذلك و بكل بساطةٍ أستطيع أن أقول أن المبدأ الذى يجب على كل لغةٍ برمجيةٍ أن تنتهجه عند التعامل مع أنماط البرمجة المختلفة هو التهجين، و أقصد بالتهجين هنا مزج أقصى قدرٍ ممكنٍ من الأنماط البرمجية فى اللغة بحيث يكون المبرمج قادراً على استخدام أيها حينما يريد ذلك، مدفوعاً بالطبع إلى ذلك بقراراتٍ تصميميةٍ للتطبيق المراد بناءه تخبره أن ذلك هو القرار التصميمى الأفضل فى هذه الحالة.

يُتبع.

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

إرسال تعليق