المعلوماتية > برمجيات
البرمجة الوظيفية Functional programming
منذ المرحلة الثانوية، تعرفنا في حصص الرياضيات إلى مفهومٍ ومُصطلح مهم وهو الدالة أو التابع Function. ولازمنا هذا المصطلح طوال فترة دراستنا، حتى الجامعية منها. وعند دراستنا لُغات البرمجة، تفاجأنا بوجود المفهوم نفسه المُتعلق بالبرمجة، وهو نموذج البرمجة الوظيفية Functional Programming Paradigm، فما هو هذا النموذج؟ وما علاقته بالإجراءات؟
تُعَد البرمجة الوظيفية Functional Programming واحدة من العديد من النماذج paradigms المُستخدمة في تطوير البرمجيات، ومن هذه النماذج نموذج *البرمجة غرضية التوجه Object-Oriented Programming paradigm، والبرمجة المُهيكلة أو المنظمة Structured Programming، والبرمجة التصريحية Declarative Programming، والبرمجة الحتمية Imperative programming وغيرها من النماذج (2).
تهدف البرمجة الوظيفية إلى هيكلة البرامج بطريقة مشابهة لتعريفاتها الرياضية. على سبيل المثال، يستخدم مفهوم العودية Recursion (استدعاء التابع على نحو متكرر عند الحاجة) بدلًا من الحلقات Loops، وغالبًا ما تكون قيمة المتغيرات ذات قيم ثابتة وليست قيمًا متغيرة فعلية، والتوابع هي كائنات من الدرجة الأولى، مما يعني أنه يمكن تمرير التوابع إلى توابع أخرى بوصفها متحولات مستقلة Arguments (1).
حتى نقول عن لغة برمجة ما إنها لغة برمجة وظيفية لا بد من توفر مجموعة من الخصائص، منها:
- تستطيع من خلال اللغة تنفيذ التوابع functions دون آثار جانبية (side effects) على حالة البرنامج (machine state). بمعنى أنّ استدعاء تابع ما عدة مرات مع الدخل نفسه (argument) يُعطي النتيجة نفسها دوماً وهذا ما يُعرف بالشفافية المرجعية referential transparency، أي لا تتغير حالة البرنامج في كل مرة يجري تنفيذ هذه التوابع (3,2).
- تستطيع استخدام ما يُعرف بالتوابع أو الدالات العُليا Higher order functions، وهي توابع يمكن أن يكون دَخلها توابع أُخرى أو يُمكنها أن تُعيد (returned value) نتيجة تنفيذها بوصفها تابعا (2).
- تُعد التوابع من أصل اللغة first-class citizen أي مثل باقي أنواع البيانات المعرفة ضمن اللغة ولا تحتاج لبرمجتها من قبل المبرمجين، ويجري التعامل معها مثل المتغيرات variables. (2)
الهوامش:
2. Functional programming [Internet]. Cs.lmu.edu. [cited 23 September 2020]. Available from: هنا
3. Functional Programming [Internet]. Ics.uci.edu. 2016 [cited 23 September 2020]. Available from: هنا