برنامج وظيفي بحت
في علوم الحاسوب ، يشير مصطلح البرمجة الوظيفية البحتة عادةً إلى نموذج برمجة - أسلوب بناء هيكل وعناصر برامج الحاسوب - الذي يعامل جميع العمليات الحسابية على أنها تقييم للوظائف الرياضية .
عادةً ما يتم نمذجة حالة البرنامج والكائنات القابلة للتغيير باستخدام المنطق الزمني ، كمتغيرات صريحة تمثل حالة البرنامج في كل خطوة من خطوات تنفيذه: يتم تمرير متغير الحالة كمعامل إدخال لدالة تحويل الحالة، والتي بدورها تُعيد الحالة المُحدثة كجزء من قيمتها المُعادة. يُعالج هذا الأسلوب تغييرات الحالة دون فقدان الشفافية المرجعية لتعبيرات البرنامج.
تعتمد البرمجة الوظيفية البحتة على ضمان أن الدوال، ضمن النموذج الوظيفي ، تعتمد فقط على وسائطها، بغض النظر عن أي حالة عامة أو محلية. ولا يمكن للروتين الوظيفي البحت رؤية تغييرات الحالة التي تمثلها متغيرات الحالة المضمنة في نطاقه.
الفرق بين البرمجة الوظيفية البحتة والبرمجة الوظيفية غير البحتة
يُعدّ الفرق الدقيق بين البرمجة الوظيفية النقية وغير النقية موضوعًا مثيرًا للجدل. ويُعرّف صبري نقاء البرمجة الوظيفية بأن جميع استراتيجيات التقييم الشائعة (التقييم بالاسم، والتقييم بالقيمة، والتقييم حسب الحاجة) تُنتج النتيجة نفسها، مع تجاهل الاستراتيجيات التي تُسبب أخطاءً أو تُؤدي إلى نتائج مُختلفة. [ 1 ]
يُقال عادةً إن البرنامج وظيفي عندما يستخدم بعض مفاهيم البرمجة الوظيفية ، مثل الدوال من الدرجة الأولى والدوال ذات الرتبة العليا . [ 2 ] مع ذلك، لا يشترط أن تكون الدالة من الدرجة الأولى وظيفية بحتة، إذ قد تستخدم تقنيات من نموذج البرمجة الإجرائية ، مثل المصفوفات أو طرق الإدخال/الإخراج التي تستخدم خلايا قابلة للتغيير، والتي تُحدِّث حالتها كآثار جانبية. في الواقع، تُعتبر لغتا البرمجة IPL و Lisp ، وهما من أوائل اللغات التي ذُكرت على أنها وظيفية، [ 3 ] [ 4 ] لغتين وظيفيتين "غير نقيتين" وفقًا لتعريف صبري.
خصائص البرمجة الوظيفية البحتة
التقييم الصارم مقابل التقييم غير الصارم
تُعيد كل استراتيجية تقييم تنتهي ببرنامج وظيفي بحت نفس النتيجة. وعلى وجه الخصوص، يضمن ذلك عدم اضطرار المبرمج إلى مراعاة ترتيب تقييم البرامج، لأن التقييم الفوري يُعيد نفس نتيجة التقييم المؤجل . مع ذلك، قد لا ينتهي التقييم الفوري بينما يتوقف التقييم المؤجل لنفس البرنامج. ومن مزايا ذلك سهولة تنفيذ التقييم المؤجل؛ فبما أن جميع التعبيرات تُعيد نفس النتيجة في أي لحظة (بغض النظر عن حالة البرنامج)، يُمكن تأجيل تقييمها حسب الحاجة.
الحوسبة المتوازية
في لغة برمجة وظيفية بحتة، تقتصر التبعيات بين العمليات الحسابية على تبعيات البيانات، وتكون هذه العمليات حتمية. لذا، لبرمجة البرامج بالتوازي، يكفي أن يحدد المبرمج الأجزاء التي يجب حسابها بالتوازي، ويتولى وقت التشغيل جميع التفاصيل الأخرى، مثل توزيع المهام على المعالجات، وإدارة التزامن والاتصال، وجمع البيانات المهملة بالتوازي. يتجنب هذا النمط من البرمجة المشكلات الشائعة كحالات التزامن المتنافس والتعطل، ولكنه أقل تحكمًا من لغة البرمجة الإجرائية. [ 5 ]
لضمان تسريع الأداء، يجب اختيار مستوى تفصيل المهام بعناية بحيث لا يكون كبيرًا جدًا ولا صغيرًا جدًا. نظريًا، يُمكن استخدام تحليل الأداء أثناء التشغيل وتحليل وقت الترجمة لتقييم ما إذا كان إدخال التوازي سيُسرّع البرنامج، وبالتالي يُمكن موازاة البرامج الوظيفية البحتة تلقائيًا. عمليًا، لم يُحقق هذا نجاحًا كبيرًا، كما أن التوازي التلقائي الكامل غير عملي. [ 5 ]
هياكل البيانات
تتميز هياكل البيانات الوظيفية البحتة بالاستمرارية . والاستمرارية ضرورية للبرمجة الوظيفية؛ فبدونها، قد تُعطي نفس العملية الحسابية نتائج مختلفة. قد تستخدم البرمجة الوظيفية هياكل بيانات غير وظيفية بحتة ذات استمرارية ، بينما لا يُسمح باستخدام هذه الهياكل في البرامج الوظيفية البحتة.
غالبًا ما تُمثَّل هياكل البيانات الوظيفية البحتة بطريقة مختلفة عن نظيراتها في اللغات الإجرائية . [ 6 ] على سبيل المثال، تُعدّ المصفوفة ذات الوصول والتحديث في وقت ثابت عنصرًا أساسيًا في معظم اللغات الإجرائية، وتعتمد العديد من هياكل البيانات الإجرائية، مثل جداول التجزئة والكومات الثنائية ، على المصفوفات. يمكن استبدال المصفوفات بالخرائط أو قوائم الوصول العشوائي ، مما يسمح بتنفيذ وظيفي بحت، ولكن وقت الوصول والتحديث يكون لوغاريتميًا . لذلك، يمكن استخدام هياكل البيانات الوظيفية البحتة في اللغات غير الوظيفية، ولكنها قد لا تكون الأداة الأكثر كفاءة المتاحة، خاصةً إذا لم تكن هناك حاجة إلى استمرارية البيانات.
بشكل عام، يتطلب تحويل البرنامج الإجرائي إلى برنامج وظيفي بحت أيضًا ضمان أن الهياكل القابلة للتغيير سابقًا يتم إرجاعها بشكل صريح من الوظائف التي تقوم بتحديثها، وهو هيكل برنامج يسمى أسلوب تمرير المخزن .
لغة وظيفية بحتة
اللغة الوظيفية البحتة هي لغة لا تقبل إلا البرمجة الوظيفية البحتة. ومع ذلك، يمكن كتابة البرامج الوظيفية البحتة بلغات ليست وظيفية بحتة.
مراجع
- ↑ صبري، عمرو (يناير 1993). "ما هي اللغة الوظيفية البحتة؟". مجلة البرمجة الوظيفية . 8 (1): 1-22 . CiteSeerX 10.1.1.27.7800 . doi : 10.1017/S0956796897002943 . S2CID 30595712 .
- ^ أتينسيو، لويس (18 يونيو 2016). البرمجة الوظيفية في جافا سكريبت . منشورات مانينغ. رقم ISBN 978-1617292828.
- ↑ مذكرات هربرت أ. سيمون (1991)، نماذج من حياتي، الصفحات 189-190، رقم ISBN 0-465-04640-1يدّعي أنه، إلى جانب آل نيويل وكليف شو، يُعتبرون "بشكل عام آباء مجال الذكاء الاصطناعي"، وذلك لكتابتهم برنامج "لوجيك ثيورست "، الذي كان يُثبت نظريات من كتاب "برينسيبيا ماثيماتيكا" تلقائيًا. ولتحقيق ذلك، كان عليهم ابتكار لغة ونموذج، يُمكن اعتبارهما، عند النظر إليهما اليوم، مُتضمنين البرمجة الوظيفية.
- ↑ مكارثي، جون (يونيو 1978). "تاريخ لغة ليسب" . المؤتمر الأول لجمعية آلات الحوسبة (ACM) حول تاريخ لغات البرمجة - HOPL-1 . الصفحات 217-223 . doi : 10.1145/800025.808387 .
- 1 2 مارلو، سيمون (18 يونيو 2013). البرمجة المتوازية والمتزامنة في هاسكل: تقنيات للبرمجة متعددة النوى ومتعددة الخيوط . دار نشر أورايلي ميديا. الصفحات 5-6 . ISBN 978-1449335946.
- ↑ هياكل البيانات الوظيفية البحتة ، تأليف كريس أوكازاكي ، مطبعة جامعة كامبريدج ، 1998، رقم ISBN 0-521-66350-4
- نماذج البرمجة
- البرمجة الوظيفية
