البرمجة الوظيفية
في علوم الحاسوب ، تُعدّ البرمجة الوظيفية نموذجًا برمجيًا تُبنى فيه البرامج من خلال تطبيق الدوال وتركيبها . وهي نموذج برمجي تصريحي، حيث تكون تعريفات الدوال عبارة عن أشجار من التعبيرات التي تربط القيم ببعضها، بدلاً من سلسلة من العبارات الإجرائية التي تُحدّث حالة تشغيل البرنامج.
في البرمجة الوظيفية، تُعامل الدوال ككيانات أساسية ، ما يعني إمكانية ربطها بأسماء (بما في ذلك المعرفات المحلية )، وتمريرها كوسائط ، وإرجاعها من دوال أخرى، تمامًا كما هو الحال مع أي نوع بيانات آخر . وهذا يسمح بكتابة البرامج بأسلوب تصريحي وتركيبي ، حيث تُدمج الدوال الصغيرة بطريقة معيارية .
يُعتبر البرمجة الوظيفية أحيانًا مرادفًا للبرمجة الوظيفية البحتة ، وهي فرع من البرمجة الوظيفية يُعامل جميع الدوال كدوال رياضية حتمية ، أو دوال نقية . عند استدعاء دالة نقية مع بعض الوسائط المُعطاة، فإنها ستُعيد دائمًا نفس النتيجة، ولا تتأثر بأي حالة قابلة للتغيير أو أي آثار جانبية أخرى . وهذا على عكس الإجراءات غير النقية ، الشائعة في البرمجة الإجرائية ، والتي قد يكون لها آثار جانبية (مثل تعديل حالة البرنامج أو أخذ مدخلات من المستخدم). يزعم مؤيدو البرمجة الوظيفية البحتة أنه من خلال تقييد الآثار الجانبية، يمكن أن تحتوي البرامج على أخطاء أقل ، وتكون أسهل في التصحيح والاختبار ، وأكثر ملاءمة للتحقق الرسمي . [ 1 ] [ 2 ]
تستمد البرمجة الوظيفية جذورها من الأوساط الأكاديمية، حيث تطورت من حساب لامدا ، وهو نظام حسابي رسمي يعتمد فقط على الدوال. تاريخيًا، كانت البرمجة الوظيفية أقل شيوعًا من البرمجة الإجرائية، ولكن العديد من لغات البرمجة الوظيفية تُستخدم اليوم في الصناعة والتعليم، بما في ذلك Common Lisp و Scheme [ 3 ] [ 4 ] [ 5 ] [ 6 ] وClojure و Wolfram Language [ 7 ] [ 8 ] و Racket [ 9 ] و Erlang [ 10 ] [ 11 ] [ 12 ] و Elixir [ 13 ] و OCaml [ 14 ] [ 15 ] و Haskell [ 16 ] [ 17 ] و F# [ 18 ] [ 19 ] . Lean هي لغة برمجة وظيفية شائعة الاستخدام للتحقق من النظريات الرياضية . [ 20 ] تُعدّ البرمجة الوظيفية أساسيةً أيضًا لبعض اللغات التي حققت نجاحًا في مجالاتٍ مُحددة، مثل جافا سكريبت في الويب، [ 21 ] وR في الإحصاء، [ 22 ] [ 23 ] و J و K و Q في التحليل المالي، و XQuery / XSLT لـ XML . [ 24 ] [ 25 ] تستخدم لغات البرمجة التصريحية الخاصة بمجالاتٍ مُحددة، مثل SQL و Lex / Yacc ، بعض عناصر البرمجة الوظيفية، مثل عدم السماح بالقيم القابلة للتغيير . [ 26 ] بالإضافة إلى ذلك، تدعم العديد من لغات البرمجة الأخرى البرمجة بأسلوبٍ وظيفي أو طبّقت ميزاتٍ من البرمجة الوظيفية، مثل C++ (منذ C++11 )، و C# ، [ 27 ] وKotlin ، [ 28 ] وPerl ، [ 29][ 30 ] PHP، [ 31 ] Python، [ 32 ] Go، [ 33 ] Rust، [ 34 ] Raku، [ 35 ] Scala، [ 36 ] وJava(منذ Java 8). [ 36 ]
تاريخ
حساب لامدا ، الذي طوره ألونسو تشيرش في ثلاثينيات القرن العشرين ، هو نظام حسابي رسمي مبني على تطبيق الدوال . في عام ١٩٣٧، أثبت آلان تورينج أن حساب لامدا وآلات تورينج نموذجان متكافئان للحساب، [ ٣٧ ] مُبينًا أن حساب لامدا كامل تورينج . يُشكل حساب لامدا أساس جميع لغات البرمجة الوظيفية. وقد طوّر موسى شونفينكل وهاسكل كاري صياغة نظرية مكافئة، هي المنطق التوافقي ، في عشرينيات وثلاثينيات القرن العشرين. [ ٣٨ ]
طوّر تشيرش لاحقًا نظامًا أضعف، وهو حساب لامدا ذو النوع البسيط ، والذي وسّع حساب لامدا من خلال تعيين نوع بيانات لجميع الحدود. [ 39 ] يشكّل هذا أساس البرمجة الوظيفية ذات النوع الثابت.
طُوِّرت لغة البرمجة الوظيفية عالية المستوى الأولى ، ليسب ، في أواخر خمسينيات القرن العشرين لسلسلة الحواسيب العلمية IBM 700/7000 على يد جون مكارثي أثناء عمله في معهد ماساتشوستس للتكنولوجيا (MIT). [ 40 ] عُرِّفت دوال ليسب باستخدام تدوين لامدا لتشرش، ووُسِّعت بإضافة بنية التسمية للسماح بالدوال التكرارية . [ 41 ] قدمت ليسب في البداية العديد من السمات النموذجية للبرمجة الوظيفية، على الرغم من أن لغات ليسب المبكرة كانت متعددة النماذج ، وتضمنت دعمًا لأنماط برمجة عديدة مع تطور النماذج الجديدة. سعت اللهجات اللاحقة، مثل سكيم وكلوجر ، والفروع منها مثل ديلان وجوليا ، إلى تبسيط ليسب وترشيدها حول نواة وظيفية نقية، بينما صُمِّمت كومون ليسب للحفاظ على السمات النموذجية للعديد من اللهجات القديمة التي حلت محلها وتحديثها. [ 42 ]
تُعتبر لغة معالجة المعلومات (IPL)، التي طُوّرت عام 1956، أحيانًا أول لغة برمجة وظيفية حاسوبية. [ 43 ] وهي لغة شبيهة بلغة التجميع لمعالجة قوائم الرموز. تتضمن مفهوم المولد ، وهو عبارة عن دالة تقبل دالة أخرى كمعامل، وبما أنها لغة برمجة منخفضة المستوى ، يمكن اعتبار الكود بيانات، لذا يمكن اعتبار IPL لغة ذات دوال من الرتبة العليا. مع ذلك، فهي تعتمد بشكل كبير على بنية القوائم المتغيرة وخصائص إجرائية مماثلة.
قام كينيث إي. إيفرسون بتطوير لغة البرمجة APL في أوائل الستينيات، ووصفها في كتابه الصادر عام 1962 بعنوان "لغة برمجة " ( ISBN). 9780471430148كان برنامج APL هو المؤثر الرئيسي على برنامج FP الخاص بجون باكوس . في أوائل التسعينيات، ابتكر إيفرسون وروجر هوي برنامج J. وفي منتصف التسعينيات، ابتكر آرثر ويتني ، الذي سبق له العمل مع إيفرسون، برنامج K ، الذي يُستخدم تجاريًا في الصناعات المالية إلى جانب برنامج Q المشتق منه .
في منتصف الستينيات، اخترع بيتر لاندين آلة SECD ، [ 44 ] وهي أول آلة مجردة للغة برمجة وظيفية، [ 45 ] ووصف تطابقًا بين ALGOL 60 وحساب لامدا ، [ 46 ] [ 47 ] واقترح لغة البرمجة ISWIM . [ 48 ]
قدّم جون باكوس البرمجة الوظيفية في محاضرته التي ألقاها عام 1977 بمناسبة حصوله على جائزة تورينج بعنوان "هل يمكن تحرير البرمجة من أسلوب فون نيومان ؟ أسلوب وظيفي وجبر برامجه". [ 49 ] عرّف باكوس البرامج الوظيفية بأنها تُبنى بطريقة هرمية من خلال "أشكال مركبة" تسمح بوجود "جبر برامج"؛ وبعبارة أخرى، هذا يعني أن البرامج الوظيفية تتبع مبدأ التركيبية . [ 50 ] ساهمت ورقة باكوس في نشر البحث في البرمجة الوظيفية، على الرغم من أنها ركزت على البرمجة على مستوى الدوال بدلاً من أسلوب حساب لامدا المرتبط حاليًا بالبرمجة الوظيفية.
تم ابتكار لغة ML عام 1973 على يد روبن ميلنر في جامعة إدنبرة ، بينما طوّر ديفيد تيرنر لغة SASL في جامعة سانت أندروز . وفي إدنبرة أيضًا خلال سبعينيات القرن الماضي، طوّر بيرستال ودارلينجتون لغة NPL الوظيفية . [ 51 ] استندت NPL إلى معادلات كلين التكرارية ، وقُدّمت لأول مرة في عملهما على تحويل البرامج. [ 52 ] ثم قام بيرستال وماكوين وسانيلا بدمج التحقق من الأنواع متعددة الأشكال من ML لإنتاج لغة Hope . [ 53 ] تطورت ML لاحقًا إلى عدة لهجات، أشهرها الآن OCaml و Standard ML .
في سبعينيات القرن العشرين، قام جاي إل. ستيل وجيرالد جاي سوسمان بتطوير لغة سكيم ، كما هو موضح في أوراق لامدا وكتاب " بنية وتفسير برامج الحاسوب" الصادر عام 1985. وكانت سكيم أول لهجة من لغة ليسب تستخدم النطاق المعجمي وتتطلب تحسين استدعاء الذيل ، وهي ميزات تشجع البرمجة الوظيفية.
في ثمانينيات القرن العشرين، طوّر بير مارتن-لوف نظرية الأنواع الحدسية (وتُسمى أيضًا نظرية الأنواع البنائية )، التي ربطت البرامج الوظيفية بالبراهين البنائية المُعبَّر عنها كأنواع تابعة . وقد أدى ذلك إلى ظهور مناهج جديدة لإثبات النظريات التفاعلي ، وأثّر على تطوير لغات البرمجة الوظيفية اللاحقة. [ 54 ]
ظهرت لغة البرمجة الوظيفية الكسولة، ميراندا ، التي طورها ديفيد تيرنر، لأول مرة عام 1985 وكان لها تأثير قوي على لغة هاسكل . ولأن ميراندا كانت لغة احتكارية، بدأت هاسكل بتوافق الآراء عام 1987 لتشكيل معيار مفتوح لأبحاث البرمجة الوظيفية؛ واستمرت إصدارات التنفيذ حتى عام 1990.
في الآونة الأخيرة، وجدت هذه التقنية استخداماً في مجالات متخصصة مثل التصميم بمساعدة الحاسوب البارامتري في لغة OpenSCAD المبنية على إطار عمل CGAL ، على الرغم من أن تقييدها لإعادة تعيين القيم (حيث تُعامل جميع القيم كثوابت) قد أدى إلى ارتباك بين المستخدمين غير الملمين بمفهوم البرمجة الوظيفية. [ 55 ]
لا تزال البرمجة الوظيفية مستخدمة في البيئات التجارية. [ 56 ] [ 57 ] [ 58 ]
المفاهيم
هناك عدد من المفاهيم [ 59 ] والنماذج البرمجية الخاصة بالبرمجة الوظيفية، والتي تُعتبر غريبة عمومًا عن البرمجة الإجرائية (بما في ذلك البرمجة الكائنية التوجه ). ومع ذلك، غالبًا ما تدعم لغات البرمجة العديد من النماذج البرمجية، لذا قد يكون المبرمجون الذين يستخدمون لغات "إجرائية في الغالب" قد استفادوا من بعض هذه المفاهيم. [ 60 ]
الدوال من الدرجة الأولى والرتب العليا
الدوال ذات الرتبة العليا هي دوال يمكنها إما أن تأخذ دوالًا أخرى كمعاملات أو أن تُرجعها كنتائج. في حساب التفاضل والتكامل، يُعد المؤثر التفاضلي مثالًا على الدوال ذات الرتبة العليا.، والتي تُعيد مشتقة الدالة.
تتشابه الدوال ذات الرتبة العليا مع الدوال من الدرجة الأولى في كونهما تسمحان باستخدام الدوال كوسائط ونتائج لدوال أخرى. والفرق بينهما دقيق: فمصطلح "ذات الرتبة العليا" يصف مفهومًا رياضيًا للدوال التي تعمل على دوال أخرى، بينما مصطلح "من الدرجة الأولى" هو مصطلح في علوم الحاسوب يُطلق على كيانات لغات البرمجة التي لا تخضع لأي قيود في استخدامها (وبالتالي، يمكن أن تظهر الدوال من الدرجة الأولى في أي مكان في البرنامج كما هو الحال مع كيانات الدرجة الأولى الأخرى كالأعداد، بما في ذلك كوسائط لدوال أخرى وكقيم مُعادة منها).
تُمكّن الدوال ذات الرتبة العليا من تطبيق الدوال جزئيًا أو ما يُعرف بالتطبيق الجزئي ، وهي تقنية تُطبّق الدالة على مُعاملاتها واحدًا تلو الآخر، حيث يُعيد كل تطبيق دالة جديدة تقبل المُعامل التالي. وهذا يُتيح للمبرمج التعبير بإيجاز، على سبيل المثال، عن دالة التابع كعملية جمع مُطبّقة جزئيًا على العدد الطبيعي واحد.
الدوال البحتة
لا تُحدث الدوال (أو التعبيرات) النقية أي آثار جانبية (على الذاكرة أو عمليات الإدخال/الإخراج). وهذا يعني أن للدوال النقية العديد من الخصائص المفيدة، والتي يمكن استخدام الكثير منها لتحسين الكود.
- إذا لم يتم استخدام نتيجة تعبير نقي، فيمكن إزالتها دون التأثير على التعبيرات الأخرى.
- إذا تم استدعاء دالة نقية بمعاملات لا تُسبب أي آثار جانبية، فإن النتيجة تظل ثابتة بالنسبة لتلك المعاملات (يُطلق على ذلك أحيانًا الشفافية المرجعية أو التكرارية )، أي أن استدعاء الدالة النقية مرة أخرى بنفس المعاملات يُعيد نفس النتيجة. (يُمكن لهذا أن يُتيح تحسينات التخزين المؤقت مثل التخزين المؤقت ).
- إذا لم يكن هناك تبعية بيانات بين تعبيرين نقيين، فيمكن عكس ترتيبهما، أو يمكن تنفيذهما بالتوازي ولا يمكنهما التداخل مع بعضهما البعض (بمعنى آخر، فإن تقييم أي تعبير نقي آمن للخيوط ).
- إذا كانت اللغة بأكملها لا تسمح بالآثار الجانبية، فيمكن استخدام أي استراتيجية تقييم؛ وهذا يمنح المترجم حرية إعادة ترتيب أو دمج تقييم التعبيرات في البرنامج (على سبيل المثال، باستخدام إزالة الغابات ).
بينما تكتشف معظم مُجمِّعات لغات البرمجة الإجرائية الدوال النقية وتُجري عملية حذف التعبيرات الفرعية المشتركة لاستدعاءات الدوال النقية، إلا أنها لا تستطيع دائمًا القيام بذلك للمكتبات المُجمَّعة مسبقًا، والتي لا تُفصح عادةً عن هذه المعلومات، مما يحول دون إجراء التحسينات التي تتضمن تلك الدوال الخارجية. تُضيف بعض المُجمِّعات، مثل gcc ، كلمات مفتاحية إضافية للمبرمج لتمييز الدوال الخارجية صراحةً على أنها نقية، لتمكين هذه التحسينات. كما يسمح Fortran 95 بتصنيف الدوال على أنها نقية . [ 61 ] أضافت C++11 constexprكلمة مفتاحية ذات دلالات مماثلة.
التكرار
تُنفَّذ عملية التكرار (الحلقات) في اللغات الوظيفية عادةً عبر الاستدعاء الذاتي . تستدعي الدوال الاستدعائية نفسها، مما يسمح بتكرار العملية حتى الوصول إلى حالة التوقف . يتطلب الاستدعاء الذاتي عمومًا الاحتفاظ بمكدس ، يستهلك مساحةً تتناسب طرديًا مع عمق الاستدعاء. قد يجعل هذا الاستدعاء الذاتي مكلفًا للغاية مقارنةً بالحلقات الإجرائية. مع ذلك، يمكن للمترجم التعرف على شكل خاص من الاستدعاء الذاتي يُعرف بالاستدعاء الذاتي الذيل ، وتحسينه ليصبح مطابقًا للشيفرة المستخدمة في تنفيذ التكرار في اللغات الإجرائية. يمكن تنفيذ تحسين الاستدعاء الذاتي الذيل عن طريق تحويل البرنامج إلى أسلوب تمرير الاستمرارية أثناء الترجمة، بالإضافة إلى طرق أخرى.
يشترط معيار لغة Scheme أن تدعم التطبيقات الاستدعاء الذيل الصحيح، أي السماح بعدد غير محدود من استدعاءات الذيل النشطة. [ 62 ] [ 63 ] لا يُعد الاستدعاء الذيل الصحيح مجرد تحسين، بل هو ميزة لغوية تضمن للمستخدمين إمكانية استخدام الاستدعاء للتعبير عن حلقة تكرارية دون التأثير على المساحة. [ 64 ] علاوة على ذلك، وخلافًا لاسمه، فهو يشمل جميع استدعاءات الذيل، وليس الاستدعاء الذيل فقط. في حين أن الاستدعاء الذيل الصحيح يُنفذ عادةً بتحويل الكود إلى حلقات تكرارية إجرائية، إلا أن التطبيقات قد تُنفذه بطرق أخرى. على سبيل المثال، يحتفظ Chicken عمدًا بمكدس ويسمح بتجاوزه . مع ذلك، عندما يحدث ذلك، يستعيد جامع البيانات المهملة المساحة، [ 65 ] مما يسمح بعدد غير محدود من استدعاءات الذيل النشطة حتى وإن لم يُحوّل الاستدعاء الذيل إلى حلقة تكرارية.
يمكن تجريد أنماط الاستدعاء الذاتي الشائعة باستخدام الدوال ذات الرتبة العليا، وتُعدّ عمليات التحويل العكسي والتحويل العكسي (أو "الطي" و"الفك") من أبرز الأمثلة على ذلك. وتؤدي مخططات الاستدعاء الذاتي هذه دورًا مشابهًا لهياكل التحكم المدمجة، مثل الحلقات، في لغات البرمجة الإجرائية .
تسمح معظم لغات البرمجة الوظيفية العامة بالاستدعاء الذاتي غير المقيد، وهي كاملة تورينج ، مما يجعل مشكلة التوقف غير قابلة للحل ، وقد يتسبب في عدم سلامة الاستدلال المعادلاتي ، ويتطلب عمومًا إدخال تناقض في المنطق الذي يعبر عنه نظام أنواع اللغة . تسمح بعض اللغات ذات الأغراض الخاصة، مثل Rocq، بالاستدعاء الذاتي المُؤسس جيدًا فقط ، وهي لغات تطبيع قوية (لا يمكن التعبير عن العمليات الحسابية غير المنتهية إلا بتدفقات لا نهائية من القيم تسمى البيانات المساعدة ). ونتيجة لذلك، تفشل هذه اللغات في أن تكون كاملة تورينج، ويستحيل التعبير عن بعض الدوال فيها، لكنها لا تزال قادرة على التعبير عن فئة واسعة من العمليات الحسابية المهمة مع تجنب المشاكل التي يسببها الاستدعاء الذاتي غير المقيد. تُسمى البرمجة الوظيفية المقتصرة على الاستدعاء الذاتي المُؤسس جيدًا مع بعض القيود الأخرى بالبرمجة الوظيفية الكاملة . [ 66 ]
التقييم الصارم مقابل التقييم غير الصارم
يمكن تصنيف لغات البرمجة الوظيفية حسب استخدامها للتقييم الصارم (السريع) أو التقييم غير الصارم (الكسول) ، وهما مفهومان يشيران إلى كيفية معالجة وسائط الدوال عند تقييم تعبير ما. يكمن الاختلاف التقني في الدلالات التفسيرية للتعبيرات التي تحتوي على عمليات حسابية فاشلة أو متباينة. في التقييم الصارم، يفشل تقييم أي مصطلح يحتوي على مصطلح فرعي فاشل. على سبيل المثال، عبارة بايثون التالية :
طباعة ( لين ([ 2 + 1 , 3 * 2 , 1 / 0 , 5 - 4 ]))يفشل هذا الأسلوب في التقييم الصارم بسبب القسمة على صفر في العنصر الثالث من القائمة. أما في التقييم الكسول، فتُرجع دالة الطول القيمة 4 (أي عدد عناصر القائمة)، لأن تقييمها لا يُقيّم عناصر القائمة. باختصار، يُقيّم التقييم الصارم وسائط الدالة تقييمًا كاملًا قبل استدعائها. بينما لا يُقيّم التقييم الكسول وسائط الدالة إلا إذا كانت قيمها ضرورية لتقييم استدعاء الدالة نفسه.
تتمثل استراتيجية التنفيذ المعتادة للتقييم الكسول في اللغات الوظيفية في اختزال الرسم البياني . [ 67 ] يُستخدم التقييم الكسول افتراضيًا في العديد من اللغات الوظيفية البحتة، بما في ذلك Miranda و Clean و Haskell .
يجادل هيوز (1984) لصالح التقييم الكسول كآلية لتحسين نمطية البرنامج من خلال فصل الاهتمامات ، وذلك بتسهيل التنفيذ المستقل لمنتجي ومستهلكي تدفقات البيانات. [ 2 ] يصف لانشبري (1993) بعض الصعوبات التي يُسببها التقييم الكسول، لا سيما في تحليل متطلبات تخزين البرنامج، ويقترح دلالات تشغيلية للمساعدة في هذا التحليل. [ 68 ] يقترح هاربر (2009) تضمين كل من التقييم الصارم والتقييم الكسول في اللغة نفسها، باستخدام نظام أنواع اللغة للتمييز بينهما. [ 69 ]
أنظمة الكتابة
منذ تطوير استدلال أنواع هيندلي-ميلنر في سبعينيات القرن الماضي، اتجهت لغات البرمجة الوظيفية نحو استخدام حساب لامدا المُنمّط ، الذي يرفض جميع البرامج غير الصالحة أثناء الترجمة، مما يُعرّضها لخطر أخطاء إيجابية خاطئة . على عكس حساب لامدا غير المُنمّط ، الذي يقبل جميع البرامج الصالحة أثناء الترجمة، ولكنه يُعرّضها لخطر أخطاء سلبية خاطئة ، والمستخدم في لغة ليسب ومشتقاتها (مثل سكيم )، حيث يرفض جميع البرامج غير الصالحة أثناء التشغيل عندما تكون المعلومات كافية لعدم رفض البرامج الصالحة. يُسهّل استخدام أنواع البيانات الجبرية التعامل مع هياكل البيانات المعقدة؛ كما أن وجود فحص قوي للأنواع أثناء الترجمة يجعل البرامج أكثر موثوقية في غياب تقنيات موثوقية أخرى مثل التطوير الموجه بالاختبار ، بينما يُعفي استدلال الأنواع المبرمج من الحاجة إلى تعريف الأنواع يدويًا للمترجم في معظم الحالات.
تعتمد بعض لغات البرمجة الوظيفية الموجهة للبحث، مثل Rocq و Agda و Cayenne و Epigram، على نظرية الأنواع الحدسية ، التي تسمح للأنواع بالاعتماد على الحدود. تُسمى هذه الأنواع بالأنواع التابعة . لا تمتلك أنظمة الأنواع هذه استدلالًا قابلًا للتقرير للأنواع، ويصعب فهمها والبرمجة بها. [ 70 ] [ 71 ] [ 72 ] [ 73 ] لكن الأنواع التابعة قادرة على التعبير عن قضايا عشوائية في منطق الرتبة العليا . من خلال تماثل كاري-هوارد ، تصبح البرامج المكتوبة جيدًا بهذه اللغات وسيلة لكتابة براهين رياضية رسمية يمكن للمترجم من خلالها توليد شفرة معتمدة . في حين أن هذه اللغات ذات أهمية رئيسية في البحث الأكاديمي (بما في ذلك في الرياضيات الرسمية )، فقد بدأ استخدامها في الهندسة أيضًا. Compcert هو مترجم لمجموعة فرعية من لغة C مكتوبة بلغة Rocq ومُدققة رسميًا. [ 74 ]
يمكن تطبيق شكل محدود من الأنواع التابعة، يُسمى أنواع البيانات الجبرية المعممة (GADT)، بطريقة توفر بعض مزايا البرمجة المعتمدة على الأنواع مع تجنب معظم عيوبها. [ 75 ] تتوفر أنواع GADT في مُصرّف غلاسكو هاسكل ، وفي لغة OCaml [ 76 ] ، وفي لغة سكالا [ 77 ] ، وقد اقتُرحت كإضافات للغات أخرى، بما في ذلك جافا وسي شارب. [ 78 ]
الشفافية المرجعية
لا تحتوي البرامج الوظيفية على عبارات إسناد، أي أن قيمة المتغير في البرنامج الوظيفي لا تتغير بمجرد تعريفه. وهذا يمنع أي احتمال لحدوث آثار جانبية، لأنه يمكن استبدال أي متغير بقيمته الفعلية في أي مرحلة من مراحل التنفيذ. لذا، فإن البرامج الوظيفية شفافة من الناحية المرجعية. [ 79 ]
لنفترض أن لدينا عبارة إسناد في لغة Cx = x * 10 ، تُغير هذه العبارة القيمة المُسندة إلى المتغير x. لنفترض أن القيمة الابتدائية للمتغير xهي 0 1، فإن تقييمين متتاليين للمتغير xيُعطيان 0 10و0 100على التوالي. من الواضح أن استبدال x = x * 100 بـ 0 10أو 1000 يُعطي البرنامج معنى مختلفًا، وبالتالي فإن التعبير ليس شفافًا من حيث المرجعية. في الواقع، عبارات الإسناد ليست شفافة من حيث المرجعية أبدًا.
والآن، لننظر إلى دالة أخرى شفافة ، لأنها لا تُغير المدخل x ضمنيًا، وبالتالي ليس لها مثل هذه الآثار الجانبية . تستخدم البرامج الوظيفية هذا النوع من الدوال حصريًا، ولذلك فهي شفافة مرجعيًا.intplusOne(intx){returnx+1;}
هياكل البيانات
غالبًا ما تُمثَّل هياكل البيانات الوظيفية البحتة بطريقة مختلفة عن نظيراتها الإجرائية . [ 80 ] على سبيل المثال، تُعدّ المصفوفة ذات أوقات الوصول والتحديث الثابتة عنصرًا أساسيًا في معظم اللغات الإجرائية، وتعتمد العديد من هياكل البيانات الإجرائية، مثل جدول التجزئة والكومة الثنائية ، على المصفوفات. يمكن استبدال المصفوفات بالخرائط أو قوائم الوصول العشوائي، والتي تسمح بالتنفيذ الوظيفي البحت، ولكن بأوقات وصول وتحديث لوغاريتمية . تتميز هياكل البيانات الوظيفية البحتة بالاستمرارية ، وهي خاصية الاحتفاظ بالإصدارات السابقة من هيكل البيانات دون تعديل. في لغة كلوجر، تُستخدم هياكل البيانات المستمرة كبدائل وظيفية لنظيراتها الإجرائية. تستخدم المتجهات المستمرة، على سبيل المثال، الأشجار للتحديث الجزئي. سيؤدي استدعاء دالة الإدراج إلى إنشاء بعض العقد وليس جميعها. [ 81 ]
مقارنة بالبرمجة الإجرائية
تختلف البرمجة الوظيفية اختلافًا كبيرًا عن البرمجة الإجرائية . ويكمن الاختلاف الأهم في أن البرمجة الوظيفية تتجنب الآثار الجانبية ، التي تُستخدم في البرمجة الإجرائية لتنفيذ الحالة والإدخال/الإخراج. فالبرمجة الوظيفية الخالصة تمنع الآثار الجانبية تمامًا وتوفر شفافية مرجعية.
نادرًا ما تُستخدم الدوال ذات الرتبة العليا في البرمجة الإجرائية القديمة. قد يستخدم برنامج إجرائي تقليدي حلقة تكرارية لاجتياز قائمة وتعديلها. أما البرنامج الوظيفي، فمن المرجح أن يستخدم دالة "map" ذات رتبة عليا تأخذ دالة وقائمة، وتُنشئ قائمة جديدة وتُعيدها بتطبيق الدالة على كل عنصر من عناصر القائمة.
البرمجة الإجرائية مقابل البرمجة الوظيفية
يحقق المثالان التاليان (المكتوبان بلغة جافا ) نفس التأثير: فهما يضربان جميع الأعداد الزوجية في مصفوفة في 10 ويجمعانها جميعًا، ويخزنان المجموع النهائي في المتغير result.
حلقة الأوامر التقليدية:
int [] numList = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; int result = 0 ; for ( int i : numList ) { if ( i % 2 == 0 ) { result += i * 10 ; } }البرمجة الوظيفية باستخدام الدوال ذات الرتبة العليا:
استيراد java.util.Arrays ؛int [ ] numList = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ; int result = Arrays.stream ( numList ) .filter ( n - > n % 2 == 0 ) .map ( n - > n * 10 ) .reduce ( 0 , Integer :: sum ) ;في بعض الأحيان، قد تؤدي التجريدات التي توفرها البرمجة الوظيفية إلى تطوير كود أكثر قوة يتجنب بعض المشكلات التي قد تنشأ عند البناء على كمية كبيرة من الكود الإجرائي المعقد، مثل أخطاء الخطأ بمقدار واحد (انظر القاعدة العاشرة لـ Greenspun ).
محاكاة الحالة
هناك مهام (مثل إدارة رصيد الحساب البنكي) تبدو في كثير من الأحيان وكأنها تُنفذ بشكل طبيعي باستخدام الحالة. أما البرمجة الوظيفية البحتة فتؤدي هذه المهام، ومهام الإدخال والإخراج مثل استقبال مدخلات المستخدم والطباعة على الشاشة، بطريقة مختلفة.
تُطبّق لغة البرمجة الوظيفية البحتة هاسكل هذه المفاهيم باستخدام المونادات ، المُستمدة من نظرية الفئات . [ 82 ] تُتيح المونادات طريقةً لتجريد أنواع مُحددة من الأنماط الحسابية، بما في ذلك (على سبيل المثال لا الحصر) نمذجة العمليات الحسابية ذات الحالة القابلة للتغيير (وغيرها من الآثار الجانبية مثل الإدخال/الإخراج) بطريقة إجرائية دون المساس بنقاء النموذج. على الرغم من سهولة تطبيق المونادات الموجودة في البرنامج، عند توفر القوالب والأمثلة المناسبة، إلا أن العديد من الطلاب يجدون صعوبة في فهمها من الناحية المفاهيمية، على سبيل المثال، عند مطالبتهم بتعريف مونادات جديدة (وهو أمر ضروري أحيانًا لأنواع مُعينة من المكتبات). [ 83 ]
تحاكي اللغات الوظيفية أيضًا الحالات من خلال تمرير حالات غير قابلة للتغيير. ويمكن تحقيق ذلك بجعل دالة تقبل الحالة كأحد معامِلاتها، وتعيد حالة جديدة مع النتيجة، مع الإبقاء على الحالة القديمة دون تغيير. [ 84 ]
تتضمن لغات البرمجة الوظيفية غير النقية عادةً طريقةً أكثر مباشرةً لإدارة الحالة القابلة للتغيير. على سبيل المثال، تستخدم لغة كلوجر مراجع مُدارة يمكن تحديثها بتطبيق دوال نقية على الحالة الحالية. يُمكّن هذا النوع من الأساليب من إمكانية التغيير مع الاستمرار في تشجيع استخدام الدوال النقية باعتبارها الطريقة المُفضلة للتعبير عن العمليات الحسابية. [ 85 ]
طُوِّرت أساليب بديلة، مثل منطق هوار والتفرد ، لتتبع الآثار الجانبية في البرامج. وتستخدم بعض لغات البحث الحديثة أنظمة التأثيرات لجعل وجود الآثار الجانبية واضحًا. [ 86 ]
مشاكل الكفاءة
تُعدّ لغات البرمجة الوظيفية عادةً أقل كفاءة في استخدام وحدة المعالجة المركزية والذاكرة مقارنةً باللغات الإجرائية مثل C وباسكال . [ 87 ] ويرجع ذلك إلى سهولة تنفيذ بعض هياكل البيانات القابلة للتغيير، كالمصفوفات، باستخدام الأجهزة الحالية. إذ يُمكن الوصول إلى المصفوفات المسطحة بكفاءة عالية باستخدام وحدات المعالجة المركزية ذات البنية المتوازية، أو جلبها مسبقًا بكفاءة عبر الذاكرة المؤقتة (دون الحاجة إلى تتبع المؤشرات المعقدة ) ، أو معالجتها باستخدام تعليمات SIMD. كما يصعب إنشاء نظائرها غير القابلة للتغيير ذات الكفاءة المماثلة في الأغراض العامة. بالنسبة للغات الوظيفية البحتة، يكون التباطؤ في أسوأ الحالات لوغاريتميًا بالنسبة لعدد خلايا الذاكرة المستخدمة، لأن الذاكرة القابلة للتغيير يُمكن تمثيلها بهيكل بيانات وظيفي بحت ذي زمن وصول لوغاريتمي (مثل الشجرة المتوازنة). [ 88 ] مع ذلك، لا يُعدّ هذا التباطؤ عامًا. فبالنسبة للبرامج التي تُجري عمليات حسابية عددية مكثفة، تُعتبر اللغات الوظيفية مثل OCaml و Clean أبطأ بقليل فقط من لغة C وفقًا لـ The Computer Language Benchmarks Game . [ 89 ] بالنسبة للبرامج التي تتعامل مع المصفوفات الكبيرة وقواعد البيانات متعددة الأبعاد ، تم تصميم لغات البرمجة الوظيفية للمصفوفات (مثل J و K ) مع تحسينات السرعة.
قد يؤدي ثبات البيانات في كثير من الحالات إلى تحسين كفاءة التنفيذ، إذ يسمح للمترجم بوضع افتراضات غير آمنة في لغة برمجة إجرائية، مما يزيد من فرص التوسيع المضمن . [ 90 ] حتى وإن بدت عملية النسخ المتضمنة، والتي قد تبدو ضمنية عند التعامل مع هياكل البيانات الثابتة والمستمرة، مكلفة حسابيًا، فإن بعض لغات البرمجة الوظيفية، مثل كلوجر، تحل هذه المشكلة بتطبيق آليات لمشاركة الذاكرة الآمنة بين البيانات الثابتة رسميًا . [ 91 ] تتميز لغة رست بنهجها في التعامل مع ثبات البيانات، والذي يتضمن مراجع ثابتة [ 92 ] ومفهومًا يُسمى دورات الحياة. [ 93 ]
قد تكون البيانات غير القابلة للتغيير، مع فصل الهوية عن الحالة، وأنظمة عدم المشاركة، أكثر ملاءمةً للبرمجة المتزامنة والمتوازية، وذلك بفضل تقليل أو إزالة مخاطر التزامن، حيث أن العمليات المتزامنة عادةً ما تكون ذرية ، مما يُغني عن الحاجة إلى الأقفال. هكذا java.util.concurrentتُنفَّذ الفئات، على سبيل المثال، حيث تكون بعضها نسخًا غير قابلة للتغيير من الفئات المقابلة غير المناسبة للاستخدام المتزامن. [ 94 ] غالبًا ما تمتلك لغات البرمجة الوظيفية نموذج تزامن يعتمد على آليات تمرير الرسائل (مثل نموذج الممثل ، حيث يُمثِّل كل ممثل حاويةً للحالة والسلوك والممثلين الفرعيين وقائمة انتظار الرسائل) بدلاً من الحالة المشتركة والتزامن. [ 95 ] [ 96 ] هذا النهج شائع في لغات إرلانج / إليكسير وأكا .
قد يُسرّع التقييم الكسول البرنامج، حتى بشكلٍ تقاربي، بينما قد يُبطئه في أقصى الأحوال بمعامل ثابت (مع ذلك، قد يُسبب تسريبات للذاكرة إذا استُخدم بشكلٍ غير صحيح). يناقش لانشبري (1993) [ 68 ] المسائل النظرية المتعلقة بتسريبات الذاكرة الناتجة عن التقييم الكسول، ويُقدم أوسوليفان وآخرون (2008 ) [ 97 ] بعض النصائح العملية لتحليلها وإصلاحها. مع ذلك، فإنّ أكثر تطبيقات التقييم الكسول عموميةً، والتي تستخدم بكثرة التعليمات والبيانات المُفكّكة، تُعاني من ضعف الأداء على المعالجات الحديثة ذات خطوط الأنابيب العميقة وذاكرة التخزين المؤقت متعددة المستويات (حيث قد يُكلّف عدم العثور على البيانات في ذاكرة التخزين المؤقت مئات الدورات). [ 98 ]
تكلفة الاستخلاص
قد لا تُحسّن بعض لغات البرمجة الوظيفية عمليات التجريد، مثل الدوال ذات الرتبة العليا كـ " map " أو " filter "، بنفس كفاءة العمليات الإجرائية الأساسية. على سبيل المثال، إليك طريقتان للتحقق مما إذا كان العدد 5 زوجيًا في لغة Clojure :
( زوجي؟ 5 ) ( يساوي ( باقي القسمة على 5 هو 2 ) 0 )عند إجراء اختبار الأداء باستخدام أداة Criterium على جهاز كمبيوتر يعمل بنظام GNU/Linux ومعالج Ryzen 7900X في بيئة Leiningen REPL 2.11.2، والتي تعمل على Java VM الإصدار 22 و Clojure الإصدار 1.11.1، فإن التنفيذ الأول، والذي تم تنفيذه على النحو التالي:
( defn even? "يُرجع القيمة true إذا كان n زوجيًا، ويُطلق استثناءً إذا لم يكن n عددًا صحيحًا" { :added "1.0" :static true } [ n ] ( if ( integer? n ) ( zero? ( bit-and ( clojure.lang.RT/uncheckedLongCast n ) 1 )) ( throw ( IllegalArgumentException. ( str "يجب أن يكون الوسيط عددًا صحيحًا: " n )))))يبلغ متوسط زمن التنفيذ 4.76 مللي ثانية، بينما يبلغ متوسط زمن التنفيذ للدالة الثانية، التي .equalsتُمثل استدعاءً مباشرًا لدالة Java الأساسية ، 2.8 ميكروثانية، أي أسرع بحوالي 1700 مرة. يُعزى جزء من ذلك إلى فحص الأنواع ومعالجة الاستثناءات المُتضمنة في تنفيذ الدالة even?. على سبيل المثال، مكتبة lo للغة Go ، التي تُنفذ العديد من الدوال عالية الرتبة الشائعة في لغات البرمجة الوظيفية باستخدام الأنواع العامة . في اختبار معياري قدمه مُطور المكتبة، mapكان استدعاء الدالة أبطأ بنسبة 4% من forحلقة مكافئة، وله نفس ملف تعريف تخصيص الذاكرة ، [ 99 ] وهو ما يُعزى إلى تحسينات المُترجم المختلفة، مثل التضمين . [ 100 ]
إحدى السمات المميزة للغة Rust هي التجريدات عديمة التكلفة . وهذا يعني أن استخدامها لا يفرض أي تكلفة إضافية على وقت التشغيل. ويتحقق ذلك بفضل استخدام المُصرّف لتقنية فك الحلقات ، حيث يتم تحويل كل تكرار للحلقة، سواء كانت حلقة تنفيذية أو تستخدم مُكرِّرات، إلى تعليمة تجميع مستقلة، دون تكلفة إضافية ناتجة عن كود التحكم في الحلقة. إذا كتبت عملية تكرارية إلى مصفوفة، فسيتم تخزين عناصر المصفوفة الناتجة في سجلات وحدة المعالجة المركزية المحددة ، مما يسمح بالوصول إليها في وقت ثابت أثناء التشغيل. [ 101 ]
البرمجة الوظيفية في لغات غير وظيفية
من الممكن استخدام أسلوب البرمجة الوظيفية في لغات لا تُعتبر تقليديًا لغات وظيفية. [ 102 ] على سبيل المثال، تدعم كل من لغة D [ 103 ] ولغة Fortran 95 [ 61 ] الدوال النقية بشكل صريح.
كانت لغات جافا سكريبت ، ولوا ، [ 104 ] وبايثون ، وجو [ 105 ] تتمتع بوظائف من الدرجة الأولى منذ نشأتها. [ 106 ] دعمت بايثون دوال " lambda " و" map " و" reduce " و" filter " في عام 1994، بالإضافة إلى الدوال المغلقة في بايثون 2.2، [ 107 ] على الرغم من أن بايثون 3 نقلت دالة "reduce" إلى functoolsوحدة المكتبة القياسية. [ 108 ] أُدخلت دوال الدرجة الأولى في لغات برمجة شائعة أخرى مثل بيرل 5.0 في عام 1994، وبي إتش بي 5.3، وفيجوال بيسك 9 ، وسي شارب 3.0، وسي++11 ، وكوتلن . [ 28 ]
في لغة بيرل، تُدعم دوال لامدا ، و map ، و reduce ، و filter ، والإغلاقات بشكل كامل وتُستخدم بكثرة. وقد كُتب كتاب Higher-Order Perl ، الذي صدر عام 2005، ليكون دليلاً شاملاً حول استخدام بيرل في البرمجة الوظيفية.
في لغة PHP، تُدعم الفئات المجهولة والإغلاقات وتعبيرات لامدا بشكل كامل. ويجري تطوير مكتبات وامتدادات لغوية لهياكل البيانات غير القابلة للتغيير للمساعدة في البرمجة بأسلوب البرمجة الوظيفية.
في لغة جافا ، يمكن أحيانًا استخدام الفئات المجهولة لمحاكاة الدوال المغلقة؛ [ 109 ] ومع ذلك، لا تُعدّ الفئات المجهولة دائمًا بدائل مناسبة للدوال المغلقة نظرًا لقدراتها المحدودة. [ 110 ] يدعم الإصدار 8 من جافا تعابير لامدا كبديل لبعض الفئات المجهولة. [ 111 ]
في لغة C# ، لا حاجة إلى الفئات المجهولة، لأن الدوال المغلقة وتعبيرات لامدا مدعومة بالكامل. ويجري تطوير مكتبات وامتدادات لغوية لهياكل البيانات غير القابلة للتغيير للمساعدة في البرمجة بأسلوب البرمجة الوظيفية في C#.
يمكن التعبير عن العديد من أنماط التصميم الموجهة للكائنات بمصطلحات البرمجة الوظيفية: على سبيل المثال، نمط الاستراتيجية ببساطة يملي استخدام دالة من الدرجة العليا، ونمط الزائر يتوافق تقريبًا مع التحويل أو الطي .
وبالمثل، فإن فكرة البيانات غير القابلة للتغيير من البرمجة الوظيفية غالباً ما تُدرج في لغات البرمجة الإجرائية، [ 112 ] على سبيل المثال tuple في بايثون، وهو عبارة عن مصفوفة غير قابلة للتغيير، و Object.freeze() في جافا سكريبت. [ 113 ]
مقارنة بالبرمجة المنطقية
يمكن اعتبار البرمجة المنطقية تعميمًا للبرمجة الوظيفية، حيث تُعدّ الدوال حالة خاصة من العلاقات. [ 114 ] على سبيل المثال، يمكن تمثيل الدالة mother(X) = Y (لكل X أم واحدة فقط Y) بالعلاقة mother(X, Y). بينما تتميز الدوال بنمط إدخال وإخراج صارم، يمكن الاستعلام عن العلاقات بأي نمط من المدخلات والمخرجات. لننظر إلى برنامج المنطق التالي:
الأم ( تشارلز ، إليزابيث ). الأم ( هاري ، ديانا ).يمكن الاستعلام عن البرنامج، مثل البرنامج الوظيفي، لتوليد الأمهات من الأطفال:
?- والدة ( هاري ، X ). X = ديانا . ?- والدة ( تشارلز ، X ). X = إليزابيث .لكن يمكن أيضًا الاستعلام عنها بشكل عكسي ، لتوليد الأبناء:
?- mother ( X , elizabeth ). X = charles . ?- mother ( X , diana ). X = harry .بل ويمكن استخدامه لإنشاء جميع حالات العلاقة الأم:
?- الأم ( X , Y ). س = تشارلز ، ص = إليزابيث . س = هاري ، ص = ديانا .بالمقارنة مع الصيغة العلائقية، تُعدّ الصيغة الوظيفية طريقةً أكثر إيجازًا لتمثيل الدوال المتداخلة. على سبيل المثال، يمكن كتابة تعريف الجدة لأم في الصيغة الوظيفية بالشكل المتداخل التالي:
mother_grandmother ( X ) = mother ( mother ( X )).يجب كتابة التعريف نفسه في صيغة العلاقات في شكل غير متداخل:
mother_grandmother ( X , Y ) :- mother ( X , Z ), mother ( Z , Y ).هنا :-تعني إذا و , تعني و .
مع ذلك، فإن الفرق بين التمثيلين هو فرق نحوي بحت. في لغة Ciao Prolog، يمكن تداخل العلاقات، مثل الدوال في البرمجة الوظيفية: [ 115 ]
الجد ( س ) := الوالد ( الوالد ( س )). الوالد ( س ) := الأم ( س ). الوالد ( س ) := الأب ( س ).الأم ( تشارلز ) := إليزابيث . الأب ( تشارلز ) := فيليب . الأم ( هاري ) := ديانا . الأب ( هاري ) := تشارلز .?- الجد/الجدة ( س ، ص ). س = هاري ، ص = إليزابيث . س = هاري ، ص = فيليب .يقوم برنامج Ciao بتحويل الترميز الشبيه بالدالة إلى شكل علائقي وينفذ برنامج المنطق الناتج باستخدام استراتيجية تنفيذ Prolog القياسية.
التطبيقات
محررات النصوص
يستخدم برنامج Emacs ، وهو عائلة محررات نصوص قابلة للتوسيع بدرجة كبيرة، لهجةً خاصةً به من لغة Lisp لكتابة الإضافات. ويعتبر ريتشارد ستالمان، المؤلف الأصلي لأشهر إصدارات Emacs، وهو GNU Emacs وEmacs Lisp، لغة Lisp إحدى لغات البرمجة المفضلة لديه. [ 116 ]
جداول البيانات
يمكن اعتبار جداول البيانات شكلاً من أشكال أنظمة البرمجة الوظيفية البحتة، من الرتبة الصفرية ، ذات التقييم الصارم. [ 117 ] ومع ذلك، تفتقر جداول البيانات عمومًا إلى الدوال من الرتبة العليا، وكذلك إلى إمكانية إعادة استخدام التعليمات البرمجية، وفي بعض التطبيقات، تفتقر أيضًا إلى الاستدعاء الذاتي. وقد طُوّرت العديد من الإضافات لبرامج جداول البيانات لتمكين الدوال من الرتبة العليا والقابلة لإعادة الاستخدام، ولكنها لا تزال حتى الآن ذات طابع أكاديمي في المقام الأول. [ 118 ]
الخدمات المصغرة
نظراً لقابليتها للتركيب ، يمكن أن تكون نماذج البرمجة الوظيفية مناسبة للبنى القائمة على الخدمات المصغرة . [ 119 ]
الأوساط الأكاديمية
تُعدّ البرمجة الوظيفية مجالاً بحثياً نشطاً في نظرية لغات البرمجة . وتوجد العديد من المجلات العلمية المحكمة التي تُعنى بالبرمجة الوظيفية، بما في ذلك المؤتمر الدولي للبرمجة الوظيفية ، ومجلة البرمجة الوظيفية ، وندوة الاتجاهات في البرمجة الوظيفية .
صناعة
استُخدمت البرمجة الوظيفية في نطاق واسع من التطبيقات الصناعية. فعلى سبيل المثال، طُوّرت لغة إرلانج من قِبل شركة إريكسون السويدية في أواخر ثمانينيات القرن الماضي، واستُخدمت في الأصل لتنفيذ أنظمة اتصالات مقاومة للأعطال ، [ 11 ] ولكنها أصبحت منذ ذلك الحين شائعة الاستخدام في بناء مجموعة متنوعة من التطبيقات في شركات مثل نورتل ، وفيسبوك ، وكهرباء فرنسا ، وواتساب . [ 10 ] [ 12 ] [ 120 ] [ 121 ] [ 122 ] أما لغة سكيم ، وهي لهجة من لغة ليسب ، فقد استُخدمت كأساس للعديد من التطبيقات على أجهزة كمبيوتر أبل ماكنتوش المبكرة ، [ 3 ] [ 4 ] وطُبّقت على مشاكل مثل برامج محاكاة التدريب، [ 5 ] والتحكم في التلسكوبات . [ 6 ] وشهدت لغة أوكاميل ، التي طُرحت في منتصف تسعينيات القرن الماضي، استخدامًا تجاريًا في مجالات مثل التحليل المالي، [ 14 ] والتحقق من برامج التشغيل ، وبرمجة الروبوتات الصناعية ، والتحليل الثابت للبرمجيات المدمجة . [ 15 ] على الرغم من أن لغة هاسكل صُممت في البداية كلغة بحثية، [ 17 ] فقد طُبقت أيضًا في مجالات مثل أنظمة الفضاء الجوي، وتصميم الأجهزة، وبرمجة الويب. [ 16 ] [ 17 ]
تشمل لغات البرمجة الوظيفية الأخرى المستخدمة في الصناعة: سكالا [ 123 ] ، وإف شارب [ 18 ] [ 19 ] ، ولغة وولفرام [ 7 ] ، وليسب [ 124 ] ، وستاندرد إم إل [ 125 ] [ 126 ] ، وكلوجر [ 127 ] . وقد شاع استخدام سكالا في علم البيانات [ 128 ] ، بينما تُعدّ كلوجر سكريبت [ 129 ] ، وإلم [ 130 ] ، وبيور سكريبت [ 131 ] من لغات البرمجة الوظيفية للواجهات الأمامية المستخدمة في بيئات الإنتاج. كما يُستخدم إطار عمل فينيكس الخاص بلغة إليكسير في بعض المشاريع التجارية الشائعة نسبيًا، مثل فونت أوسوم ، ومنصة الإعلانات المبوبة أليجرو لوكالني التابعة لشركة أليجرو ( إحدى أكبر منصات التجارة الإلكترونية في بولندا) [ 132 ] . [ 133 ]
حظيت "المنصات" الوظيفية بشعبية واسعة في مجال التمويل لتحليل المخاطر (خاصةً لدى البنوك الاستثمارية الكبرى). تُبرمج عوامل المخاطر كدوال تُشكل رسومًا بيانية مترابطة (فئات) لقياس الارتباطات في تحولات السوق، على غرار تحسينات أساس غروبنر ، وكذلك في الأطر التنظيمية مثل مراجعة وتحليل رأس المال الشامل . ونظرًا لاستخدام لغة OCaml ومشتقاتها في التمويل، تُعتبر هذه الأنظمة أحيانًا مرتبطة بآلة مجردة فئوية . وتتأثر البرمجة الوظيفية بشكل كبير بنظرية الفئات .
تعليم
تُدرّس العديد من الجامعات البرمجة الوظيفية. [ 134 ] [ 135 ] [ 136 ] [ 137 ] ويعتبرها البعض مفهومًا تمهيديًا في البرمجة [ 137 ] بينما يُدرّس البعض الآخر أساليب البرمجة الإجرائية أولًا. [ 136 ] [ 138 ]
خارج نطاق علوم الحاسوب، تُستخدم البرمجة الوظيفية لتدريس حل المشكلات والمفاهيم الجبرية والهندسية. [ 139 ] كما استُخدمت لتدريس الميكانيكا الكلاسيكية، كما في كتاب " بنية وتفسير الميكانيكا الكلاسيكية" .
على وجه الخصوص، لطالما كانت لغة Scheme خيارًا شائعًا نسبيًا لتدريس البرمجة لسنوات. [ 140 ] [ 141 ]
انظر أيضاً
ملاحظات ومراجع
- ↑ هوداك، بول (سبتمبر 1989). "مفهوم لغات البرمجة الوظيفية وتطورها وتطبيقها" (ملف PDF) . مجلة ACM Computing Surveys . 21 (3): 359-411 . doi : 10.1145/72551.72554 . S2CID 207637854. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 31 يناير 2016. تم الاطلاع عليه بتاريخ 10 أغسطس 2013 .
- 1 2 هيوز، جون (1984). "لماذا البرمجة الوظيفية مهمة" .
- 1 2 كلينجر، ويل (1987). "تعدد المهام وماك سكيم" . ماك تك . 3 (12) . تم الاسترجاع في 28-08-2008 .
- 1 2 هارتهايمر، آن (1987). "برمجة محرر نصوص باستخدام MacScheme+Toolsmith" . ماك تك . 3 (1). مؤرشف من الأصل بتاريخ 29-06-2011 . تم الاسترجاع بتاريخ 28-08-2008 .
- 1 2 كيد، إريك. التدريب على الاستجابة للإرهاب في سكيم . CUFP 2007. مؤرشف من الأصل في 21-12-2010 . تم الاسترجاع في 26-08-2009 .
- 1 2 كليس، ريتشارد. مخطط في الفضاء . CUFP 2006. مؤرشف من الأصل في 27-05-2010 . تم الاسترجاع في 26-08-2009 .
- 1 2 "دليل لغة وولفرام: البرمجة الوظيفية" . 2015. تم الاطلاع عليه بتاريخ 24-08-2015 .
- ↑ "لغات البرمجة الوظيفية مقابل لغات البرمجة الإجرائية" . قسم الرياضيات التطبيقية . جامعة كولورادو. مؤرشف من الأصل بتاريخ 13 نوفمبر 2007. تم الاطلاع عليه بتاريخ 28 أغسطس 2006 .
- ↑ "البرمجة القائمة على الحالة في لعبة أنشارتد 2" (ملف PDF) . مؤرشف من النسخة الأصلية (PDF) بتاريخ 15 ديسمبر 2012. تم الاطلاع عليه بتاريخ 8 أغسطس 2011 .
- 1 2 "من يستخدم إرلانج لتطوير المنتجات؟" . أسئلة شائعة حول إرلانج . تم الاطلاع عليه بتاريخ 27 أبريل 2018 .
- 1 2 أرمسترونغ، جو (يونيو 2007). "تاريخ إرلانج". وقائع المؤتمر الثالث لجمعية ACM SIGPLAN حول تاريخ لغات البرمجة . المؤتمر الثالث لجمعية ACM SIGPLAN حول تاريخ لغات البرمجة. سان دييغو، كاليفورنيا. doi : 10.1145/1238844.1238850 . ISBN 9781595937667.
- 1 2 لارسون، جيم (مارس 2009). "إرلانج للبرمجة المتزامنة" . اتصالات ACM . 52 (3): 48. doi : 10.1145/1467247.1467263 . S2CID 524392 .
- ↑ "لغة برمجة إليكسير" . تم الاطلاع عليه بتاريخ 14-02-2021 .
- 1 2 مينسكي، يارون؛ ويكس، ستيفن (يوليو 2008). "تداول كاميل - تجارب مع البرمجة الوظيفية في وول ستريت" . مجلة البرمجة الوظيفية . 18 (4): 553-564 . doi : 10.1017/S095679680800676X . S2CID 30955392 .
- 1 2 ليروي، خافيير. بعض استخدامات كاميل في الصناعة (ملف PDF) . CUFP 2007. مؤرشف من الأصل (ملف PDF) بتاريخ 2011-10-08 . تم الاطلاع عليه بتاريخ 2009-08-26 .
- 1 2 "هاسكل في الصناعة" . ويكي هاسكل . تم الاسترجاع في 26 أغسطس 2009.
تتمتع لغة هاسكل بمجموعة متنوعة من الاستخدامات التجارية، من الطيران والدفاع، إلى التمويل، إلى الشركات الناشئة على الإنترنت، وشركات تصميم الأجهزة، ومصنعي جزازات العشب.
- 1 2 3 هوداك، بول ؛ هيوز، ج.؛ جونز، إس. بي.؛ وادلر، ب. (يونيو 2007). تاريخ لغة هاسكل: الكسل مع الفئة . المؤتمر الثالث لجمعية آلات الحوسبة SIGPLAN حول تاريخ لغات البرمجة. سان دييغو، كاليفورنيا. doi : 10.1145/1238844.1238856 . تاريخ الاسترجاع: 26 سبتمبر 2013 .
- 1 2 مانسيل، هوارد (2008). التمويل الكمي في لغة F# . مؤتمر CUFP 2008. مؤرشف من الأصل بتاريخ 2015-07-08 . تم الاطلاع عليه بتاريخ 2009-08-29 .
- 1 2 بيك، أليكس (2009). أول تطبيق عملي جوهري في مجال الأعمال باستخدام لغة F# . مؤتمر CUFP 2009. مؤرشف من الأصل بتاريخ 17 أكتوبر 2009. تم الاطلاع عليه بتاريخ 29 أغسطس 2009 .
- ↑ دي مورا، ليوناردو؛ أولريش، سيباستيان (يوليو 2021). "مُثبت نظرية Lean 4 ولغة البرمجة". سلسلة محاضرات في الذكاء الاصطناعي . مؤتمر الاستدلال الآلي. المجلد 12699. الصفحات 625-635 . doi : 10.1007/978-3-030-79876-5_37 . ISSN 1611-3349 .
- ↑ بانز، مات (27-06-2017). "مقدمة في البرمجة الوظيفية في جافا سكريبت" . Opensource.com . تم الاطلاع عليه بتاريخ 09-01-2021 .
- ↑ "يتضمن جدول أعمال مؤتمر useR! لعام 2006 أوراقًا بحثية حول الاستخدام التجاري للغة R" . R-project.org. 2006-06-08 . تم الاطلاع عليه بتاريخ 2011-06-20 .
- ↑ تشامبرز، جون م. (1998). البرمجة باستخدام البيانات: دليل إلى لغة S. سبرينغر فيرلاغ. ص 67-70 . ISBN 978-0-387-98503-9.
- ↑ نوفاتشيف، ديميتري. "لغة البرمجة الوظيفية XSLT - برهان من خلال الأمثلة" . تم الاطلاع عليه في 27 مايو 2006 .
- ↑ ميرتز، ديفيد. "نماذج برمجة XML (الجزء الرابع): منهج البرمجة الوظيفية لمعالجة XML" . IBM developerWorks . تم الاطلاع عليه بتاريخ 27 مايو 2006 .
- ↑ تشامبرلين، دونالد د .؛ بويس، ريموند ف. (1974). "SEQUEL: لغة استعلام إنجليزية منظمة". وقائع مؤتمر ACM SIGFIDET لعام 1974 : 249-264 .
- ↑ البرمجة الوظيفية باستخدام لغة C# - سيمون بينتر - مؤتمر NDC أوسلو 2020 ، 8 أغسطس 2021، مؤرشف من الأصل بتاريخ 30 أكتوبر 2021 ، تم الاطلاع عليه بتاريخ 23 أكتوبر 2021
- 1 2 "البرمجة الوظيفية - لغة برمجة كوتلن" . كوتلن . تم الاسترجاع في 1 مايو 2019 .
- ↑ دومينوس، مارك ج. (2005). بيرل من الرتبة العليا . مورغان كوفمان . ISBN 978-1-55860-701-9.
- ^ هوليويل ، سيمون (2014). البرمجة الوظيفية في PHP . بي إتش بي [مهندس معماري]. رقم ISBN 9781940111056.
- ↑ شركة كاين غانغ المحدودة. "فئات بايثون الفوقية: من؟ لماذا؟ متى؟" (ملف PDF) . مؤرشف من الأصل (ملف PDF) في 30 مايو 2009. تم الاطلاع عليه في 27 يونيو 2009 .
- ↑ "GopherCon 2020: Dylan Meeus - البرمجة الوظيفية باستخدام Go" . يوتيوب . 22 ديسمبر 2020.
- ↑ "ميزات اللغة الوظيفية: المُكرِّرات والإغلاقات - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 9 يناير 2021 .
- ↑ فاندرباوهيد، ويم (18 يوليو 2020). "كود أنظف باستخدام البرمجة الوظيفية" . مؤرشف من الأصل في 28 يوليو 2020. تم الاطلاع عليه في 6 أكتوبر 2020 .
- ↑ "Effective Scala" . Scala Wiki . مؤرشف من الأصل بتاريخ 19-06-2012 . تم الاطلاع عليه بتاريخ 21-02-2012 .
Effective Scala.
- ↑ "توثيق حزمة java.util.function منذ Java 8 (المعروفة أيضًا باسم Java 1.8)" . تم الاطلاع عليه بتاريخ 16-06-2021 .
- ↑ تورينج، أ.م. (1937). " قابلية الحوسبة وقابلية تعريف لامدا". مجلة المنطق الرمزي . 2 (4). مطبعة جامعة كامبريدج: 153-163 . doi : 10.2307/2268280 . JSTOR 2268280. S2CID 2317046 .
- ↑ هاسكل بروكس كاري؛ روبرت فيس (1958). المنطق التوافقي . شركة نورث هولاند للنشر . تم الاطلاع عليه بتاريخ 10 فبراير 2013 .
- ↑ تشرش، أ. ( 1940). "صياغة نظرية الأنواع البسيطة". مجلة المنطق الرمزي . 5 (2): 56-68 . doi : 10.2307/2266170 . JSTOR 2266170. S2CID 15889861 .
- ↑ مكارثي، جون (يونيو 1978). "تاريخ لغة ليسب". المؤتمر الأول لجمعية آلات الحوسبة (ACM) حول تاريخ لغات البرمجة - HOPL-1 (ملف PDF) . لوس أنجلوس، كاليفورنيا. الصفحات 173-185 . doi : 10.1145/800025.808387 .
{{cite book}}: CS1 maint: موقع الناشر مفقود ( رابط ) - ↑ جون مكارثي (1960). "الدوال التكرارية للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول." (ملف PDF) . مجلة اتصالات رابطة آلات الحوسبة . 3 (4): 184-195 . doi : 10.1145/367177.367199 . S2CID 1489409 .
- ↑ جاي إل. ستيل؛ ريتشارد ب. غابرييل (فبراير 1996). "تطور لغة ليسب". تاريخ لغات البرمجة - الجزء الثاني (ملف PDF) . الصفحات 233-330 . doi : 10.1145/234286.1057818 . ISBN 978-0-201-89502-5. S2CID 47047140 .
- ↑ مذكرات هربرت أ. سيمون (1991)، نماذج من حياتي، الصفحات 189-190، رقم ISBN 0-465-04640-1يدّعي أنه، إلى جانب آل نيويل وكليف شو، يُعتبرون "بشكل عام آباء مجال الذكاء الاصطناعي"، وذلك لكتابتهم برنامج "لوجيك ثيورست " ، وهو برنامج أثبت نظريات من كتاب "برينسيبيا ماثيماتيكا" تلقائيًا. ولتحقيق ذلك، كان عليهم ابتكار لغة ونموذج، يُنظر إليهما اليوم على أنهما يجسدان البرمجة الوظيفية.
- ↑ لاندين، بيتر ج. (1964). "التقييم الميكانيكي للتعبيرات" . مجلة الحاسوب . 6 (4). الجمعية البريطانية للحاسوب : 308-320 . doi : 10.1093/comjnl/6.4.308 .
- ↑ ديل، ستيفان؛ هارتل، بيتر؛ سيستوفت، بيتر (2000). "آلات مجردة لتنفيذ لغات البرمجة". أنظمة حاسوب الجيل القادم . المجلد 16. الصفحات 739-751 .
- ↑ لاندين، بيتر ج. (فبراير 1965أ). "المراسلات بين لغة ALGOL 60 ورمز لامدا لتشرش: الجزء الأول" . مجلة اتصالات رابطة آلات الحوسبة . 8 (2). رابطة آلات الحوسبة : 89-101 . doi : 10.1145/363744.363749 . S2CID 6505810 .
- ↑ لاندين، بيتر ج. (مارس 1965ب). "مراسلة بين لغة ALGOL 60 ورمز لامدا لتشرش: الجزء الثاني" . اتصالات رابطة آلات الحوسبة . 8 (3). رابطة آلات الحوسبة : 158-165 . doi : 10.1145/363791.363804 . S2CID 15781851 .
- ↑ لاندين، بيتر ج. (مارس 1966ب). "لغات البرمجة الـ 700 التالية" . اتصالات رابطة آلات الحوسبة . 9 (3). رابطة آلات الحوسبة : 157-166 . doi : 10.1145/365230.365257 . S2CID 13409665 .
- ↑ باكوس، ج. (1978). "هل يمكن تحرير البرمجة من أسلوب فون نيومان؟: أسلوب وظيفي وجبر برامجه" . اتصالات رابطة آلات الحوسبة . 21 (8): 613-641 . doi : 10.1145/359576.359579 .
- ↑ باكوس، جون (1978-08-01). "هل يمكن تحرير البرمجة من أسلوب فون نيومان؟ أسلوب وظيفي وجبر برامجه" . مجلة الاتصالات ACM . 21 (8): 613-641 . doi : 10.1145/359576.359579 . ISSN 0001-0782 .
- ↑ آر إم بورستال. اعتبارات التصميم للغة برمجة وظيفية. ورقة بحثية مدعوة، وقائع مؤتمر تكنولوجيا المعلومات حول أحدث التقنيات "ثورة البرمجيات"، كوبنهاغن، 45-57 (1977)
- ↑ آر إم بورستال وجيه دارلينجتون. نظام تحويل لتطوير البرامج المتكررة. مجلة رابطة آلات الحوسبة 24(1):44–67 (1977)
- ↑ آر إم بورستال، دي بي ماكوين ودي تي سانيلا. هوب: لغة تطبيقية تجريبية. وقائع مؤتمر ليسب لعام 1980، ستانفورد، 136-143 (1980).
- ↑ تشنجيانغ هو وجون هيوز ومينغ وانغ (2015). "أهمية البرمجة الوظيفية". مجلة العلوم الوطنية . 2 : 349-370 . doi : 10.1093/NSR/NWV042 .
- ↑ "اجعل اكتشاف دالة assign() أسهل!" . OpenSCAD . مؤرشف من الأصل بتاريخ 19-04-2023.
- ↑ بيتر برايت (13 مارس 2018). "المطورون يعشقون لغات البرمجة الجديدة الرائجة، لكنهم يكسبون أكثر باستخدام البرمجة الوظيفية" . آرس تكنيكا .
- ↑ جون ليونارد (24 يناير 2017). "الصعود الخفي للبرمجة الوظيفية" . الحوسبة.
- ↑ ليو تشيونغ (9 مايو 2017). "هل البرمجة الوظيفية أفضل لشركتك الناشئة؟" . إنفوورلد .
- ↑ شون تول - الفئات المونويدية لتحليل المفاهيم الرسمية.
- ↑ باونتين، ديك. "البرمجة الوظيفية تبلغ سن الرشد" . بايت (أغسطس 1994) . مؤرشف من الأصل في 27 أغسطس 2006. تم الاطلاع عليه في 31 أغسطس 2006 .
- 1 2 "ISO/IEC JTC 1/SC 22/WG5/N2137 – Fortran 2015 Committee Draft (J3/17-007r2)" (PDF) . المنظمة الدولية للتوحيد القياسي. 6 يوليو 2017. الصفحات 336-338 .
- ↑ "تقرير منقح^6 حول مخطط لغة الخوارزميات" . R6rs.org . تم الاطلاع عليه بتاريخ 21-03-2013 .
- ↑ "تقرير منقح^6 حول مخطط لغة الخوارزميات - الأساس المنطقي" . R6rs.org . تم الاطلاع عليه بتاريخ 21-03-2013 .
- ↑ كلينجر، ويليام (1998). "الاستدعاء الذاتي الأمثل وكفاءة استخدام المساحة". وقائع مؤتمر ACM SIGPLAN 1998 حول تصميم لغات البرمجة وتنفيذها - PLDI '98 . الصفحات 174-185 . doi : 10.1145/277650.277719 . ISBN 0897919874. S2CID 16812984 .
- ↑ بيكر، هنري (1994). "لا ينبغي للمعارضين أن يعارضوا حججهم، الجزء الثاني: تشيني بشأن هيئة النقل الحضري". مؤرشف من الأصل بتاريخ 3 مارس 2006. تم الاطلاع عليه بتاريخ 29 أبريل 2020 .
- ↑ تيرنر، د.أ. (2004-07-28). "البرمجة الوظيفية الكاملة" . مجلة علوم الحاسوب العالمية . 10 (7): 751-768 . doi : 10.3217/jucs-010-07-0751 .
- ↑ تطبيق لغات البرمجة الوظيفية . سيمون بيتون جونز، منشورات برنتيس هول، 1987
- 1 2 لانشبري، جون (مارس 1993). دلالات طبيعية للتقييم الكسول . ندوة حول مبادئ لغات البرمجة. تشارلستون، كارولاينا الجنوبية: ACM . ص 144-154 . doi : 10.1145/158511.158618 .
- ↑ روبرت دبليو. هاربر (2009). الأسس العملية للغات البرمجة (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2016-04-07.
- ↑ هويه، جيرار ب. (1973). "عدم قابلية الحسم في التوحيد في منطق الرتبة الثالثة". المعلومات والتحكم . 22 (3): 257-267 . doi : 10.1016/s0019-9958(73)90301-x .
- ^ هيوت ، جيرار (سبتمبر 1976). قرار المعادلات في اللغات الذهبية 1،2،...ω (دكتوراه) (بالفرنسية). جامعة باريس السابعة.
- ↑ هويه، جيرار (2002). "توحيد الرتبة العليا بعد 30 عامًا" (ملف PDF) . في: كارينيو، ف.؛ مونيوز، س.؛ طاهر، س. (محررون). وقائع المؤتمر الدولي الخامس عشر TPHOL . سلسلة محاضرات في علوم الحاسوب. المجلد 2410. سبرينغر. الصفحات 3-12 .
- ↑ ويلز، جيه بي (1993). "قابلية الكتابة والتحقق من النوع في حساب لامدا من الدرجة الثانية متكافئان وغير قابلين للتقرير". تقرير فني 93-011 : 176-185 . CiteSeerX 10.1.1.31.3590 .
- ↑ ليروي، خافيير (17 سبتمبر 2018). "المترجم المعتمد من Compcert" .
- ↑ بيتون جونز، سيمون؛ فيتينيوتيس، ديميتريوس؛ ويريش، ستيفاني ؛ جيفري واشبورن (أبريل 2006). "استدلال بسيط للأنواع قائم على التوحيد لأنواع البيانات الجبرية المعممة" . المؤتمر الدولي للبرمجة الحاسوبية 2006 : 50-61 .
- ↑ "دليل OCaml" . caml.inria.fr . تم الاطلاع عليه بتاريخ 2021-03-08 .
- ↑ "أنواع البيانات الجبرية" . وثائق سكالا . تم الاطلاع عليه بتاريخ 2021-03-08 .
- ↑ كينيدي، أندرو؛ روسو، كلاوديو ف. (أكتوبر 2005). أنواع البيانات الجبرية المعممة والبرمجة كائنية التوجه (ملف PDF) . OOPSLA. سان دييغو، كاليفورنيا: ACM . doi : 10.1145/1094811.1094814 . ISBN 9781595930316تمت أرشفة النسخة الأصلية بتاريخ 29-12-2006.
- ↑ هيوز، جون. "لماذا البرمجة الوظيفية مهمة" (ملف PDF) . جامعة تشالمرز للتكنولوجيا .
- ↑ هياكل البيانات الوظيفية البحتة ، تأليف كريس أوكازاكي ، مطبعة جامعة كامبريدج ، 1998، رقم ISBN 0-521-66350-4
- ↑ لورانج، جان نيكلاس. "بوليماتيا - فهم المتجه المستمر في كلوجر، الجزء 1" . بوليماتيا . تم الاسترجاع في 13 نوفمبر 2018 .
- ↑ مايكل بار، تشارلز ويل - نظرية الفئات لعلوم الحاسوب.
- ↑ نيوبيرن، ج. "كل شيء عن المونادات: دليل شامل لنظرية وممارسة البرمجة المونادية في هاسكل" . تم الاسترجاع في 14 فبراير 2008 .
- ↑ "ثلاث عشرة طريقة للنظر إلى سلحفاة" . fF# للمتعة والربح . تم الاسترجاع في 13 نوفمبر 2018 .
- ↑ "القيم والتغيير: منهج كلوجر للهوية والحالة" . Clojure.org . تم الاطلاع عليه بتاريخ 22-06-2026 .
- ↑ هارتمانيس، جوريس؛ هيماشاندرا، لين (1986). "فئات التعقيد بدون آلات: حول اللغات الكاملة لـ UP". الأوتوماتا واللغات والبرمجة . سلسلة محاضرات في علوم الحاسوب. المجلد 226. برلين، هايدلبرغ: سبرينغر برلين هايدلبرغ. الصفحات 123-135 . doi : 10.1007/3-540-16761-7_62 . ISBN 978-3-540-16761-7تم الاطلاع عليه بتاريخ 12 ديسمبر 2024 .
- ↑ بولسون، لاري سي. (28 يونيو 1996). لغة ML للمبرمج العامل . مطبعة جامعة كامبريدج. ISBN 978-0-521-56543-1تم الاطلاع عليه بتاريخ 10 فبراير 2013 .
- ↑ سبيواك، دانيال (26 أغسطس 2008). "تنفيذ المتجهات المستمرة في سكالا" . كود كوميت . مؤرشف من الأصل في 23 سبتمبر 2015. تم الاسترجاع في 17 أبريل 2012 .
- ↑ "ما هي أسرع البرامج؟ | لعبة قياس أداء لغات البرمجة" . benchmarksgame.alioth.debian.org. مؤرشف من الأصل بتاريخ 20 مايو 2013. تم الاطلاع عليه بتاريخ 20 يونيو 2011 .
- ↑ إيغور بيشتشانسكي؛ فيفيك ساركار (2005). "مواصفات عدم قابلية التغيير وتطبيقاتها". التزامن والحوسبة: الممارسة والتجربة . 17 ( 5-6 ): 639-662 . doi : 10.1002/cpe.853 . S2CID 34527406 .
- ↑ "نظرة معمقة على مجموعات Clojure" . InfoQ . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "المراجع والاقتراض - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "التحقق من صحة المراجع ذات فترات الصلاحية - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "المجموعات المتزامنة (دروس جافا™ > فئات جافا الأساسية > التزامن)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "فهم نموذج الممثل لبناء أنظمة موزعة عالية الإنتاجية وغير متزامنة - Scaleyourapp" . scaleyourapp.com . 2023-01-28 . تم الاطلاع عليه بتاريخ 2024-04-29 .
- ↑ سيزاريني، فرانشيسكو؛ طومسون، سيمون (2009). برمجة إرلانج: منهج متزامن لتطوير البرمجيات ( الطبعة الأولى). دار نشر أورايلي ميديا (نُشر في 11 يونيو 2009). ص 6. ISBN 978-0-596-55585-6.
- ↑ "الفصل 25. التنميط والتحسين" . Book.realworldhaskell.org . تم الاطلاع عليه بتاريخ 20-06-2011 .
- ↑ نذركوت، نيكولاس؛ مايكروفت، آلان (16 يونيو 2002). "سلوك ذاكرة التخزين المؤقت للبرامج الوظيفية الكسولة الكبيرة على الأجهزة القياسية" . إشعارات ACM SIGPLAN . 38 (ملحق 2): 44-55 . doi : 10.1145/773039.773044 . ISSN 0362-1340 .
- ^ بيرث ، صموئيل (29/04/2024)، سامبر / لو ، استرجاعها 2024/04/29
- ↑ "ويكي Go: تحسينات المُصرّف ووقت التشغيل - لغة برمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "مقارنة الأداء: الحلقات مقابل المُكرِّرات - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ هارتل، بيتر؛ هينك مولر؛ هيو جلاسر (مارس 2004). "تجربة لغة C الوظيفية" (ملف PDF) . مجلة البرمجة الوظيفية . 14 (2): 129-135 . doi : 10.1017/S0956796803004817 . S2CID 32346900. مؤرشف من النسخة الأصلية (PDF) بتاريخ 19 يوليو 2011. تم الاطلاع عليه بتاريخ 28 مايو 2006 . ديفيد ميرتز. "البرمجة الوظيفية في بايثون، الجزء 3" . IBM developerWorks . مؤرشف من الأصل بتاريخ 16 أكتوبر 2007. تم الاطلاع عليه بتاريخ 17 سبتمبر 2006 .( الجزء 1 ، الجزء 2 )
- ↑ "الدوال - لغة البرمجة D 2.0" . ديجيتال مارس. 30 ديسمبر 2012.
- ↑ "أسئلة وأجوبة غير رسمية حول لغة Lua (uFAQ)" .
- ↑ "الوظائف من الدرجة الأولى في لغة البرمجة Go - لغة البرمجة Go" . golang.org . تم الاطلاع عليه بتاريخ 4 يناير 2021 .
- ↑ إيتش، بريندان (3 أبريل 2008). "الشعبية" .
- ↑ فان روسوم، غيدو (21-04-2009). "أصول ميزات بايثون "الوظيفية"" . تم الاسترجاع في 27-09-2012 .
- ↑ "functools — الدوال والعمليات ذات الرتبة العليا على الكائنات القابلة للاستدعاء" . مؤسسة برمجيات بايثون. 31 يوليو 2011. تم الاطلاع عليه بتاريخ 31 يوليو 2011 .
- ↑ سكارسون، مارتن (2008). مشروع SICS Java Port: الترجمة الآلية لنظام كبير موجه للكائنات من Smalltalk إلى Java .
- ↑ جوسلينج، جيمس. "الإغلاقات" . جيمس جوسلينج: على طريق جافا . أوراكل. مؤرشف من الأصل في 14 أبريل 2013. تم الاسترجاع في 11 مايو 2013 .
- ↑ ويليامز، مايكل (8 أبريل 2013). "البداية السريعة لـ Java SE 8 Lambda" .
- ↑ بلوخ، جوشوا (2008). "البند 15: تقليل قابلية التغيير". جافا الفعالة ( الطبعة الثانية). أديسون-ويسلي. ISBN 978-0321356680.
- ↑ "Object.freeze() - JavaScript | MDN" . developer.mozilla.org . تاريخ الاسترجاع: 4 يناير 2021.
تقوم الدالة Object.freeze() بتجميد كائن. لا يمكن تغيير الكائن المُجمّد؛ إذ يمنع تجميد الكائن إضافة خصائص جديدة إليه، أو إزالة الخصائص الموجودة، أو تغيير قابلية تعداد الخصائص الموجودة أو تكوينها أو الكتابة إليها، كما يمنع تغيير قيم الخصائص الموجودة. بالإضافة إلى ذلك، يمنع تجميد الكائن تغيير نموذجه الأولي. تُعيد الدالة freeze() نفس الكائن الذي تم تمريره إليها.
- ↑ دانيال فريدمان؛ ويليام بيرد؛ أوليغ كيسليوف؛ جيسون هيمان (2018). المخطط العقلاني، الطبعة الثانية . مطبعة معهد ماساتشوستس للتكنولوجيا.
- ↑ أ. كاساس، د. كابيزا، م. ف. هيرمينجيلدو. منهج نحوي لدمج الترميز الوظيفي والتقييم الكسول والترتيب الأعلى في أنظمة البرمجة الخطية. الندوة الدولية الثامنة حول البرمجة الوظيفية والمنطقية (FLOPS'06)، الصفحات 142-162، أبريل 2006.
- ↑ "كيف أقوم بأعمالي الحاسوبية" . stallman.org . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ ويكلينج، ديفيد (2007). "البرمجة الوظيفية باستخدام جداول البيانات" (ملف PDF) . مجلة البرمجة الوظيفية . 17 (1): 131-143 . doi : 10.1017/S0956796806006186 . ISSN 0956-7968 . S2CID 29429059 .
- ↑ بيتون جونز، سيمون ؛ بورنيت، مارغريت ؛ بلاكويل، آلان (مارس 2003). "تحسين لغة البرمجة الوظيفية الأكثر شيوعًا في العالم: الدوال المعرفة من قبل المستخدم في إكسل" . مؤرشف من الأصل بتاريخ 16 أكتوبر 2005.
- ↑ رودجر، ريتشارد (11 ديسمبر 2017). فن الخدمات المصغرة . مانينغ. ISBN 9781638351733.
- ↑ بيرو، كريستوفر (2009). البرمجة الوظيفية في فيسبوك . مؤتمر CUFP 2009. مؤرشف من الأصل بتاريخ 17 أكتوبر 2009. تم الاطلاع عليه بتاريخ 29 أغسطس 2009 .
- ↑ "Sim-Diasca: محرك محاكاة متزامن للأحداث المنفصلة واسع النطاق بلغة إرلانج" . نوفمبر 2011. مؤرشف من الأصل في 17 سبتمبر 2013. تم الاطلاع عليه في 8 نوفمبر 2011 .
- ↑ مليون هو شيء قديم جدًا 2011 مؤرشف في 19-02-2014 في Wayback Machine // مدونة واتساب، 06-01-2012: "آخر قطعة مهمة من بنيتنا التحتية هي إرلانج"
- ↑ مومتاهان، لي (2009). سكالا في شركة EDF للتداول: تطبيق لغة خاصة بالمجال لتسعير المشتقات باستخدام سكالا . مؤتمر CUFP 2009. مؤرشف من الأصل بتاريخ 17 أكتوبر 2009. تم الاطلاع عليه بتاريخ 29 أغسطس 2009 .
- ↑ غراهام، بول (2003). "التفوق على المتوسطات" . تم الاسترجاع في 29-08-2009 .
- ↑ سيمز، ستيف (2006). بناء شركة ناشئة باستخدام Standard ML (ملف PDF) . CUFP 2006. تم الاطلاع عليه بتاريخ 29 أغسطس 2009 .
- ↑ لوريكاري، فيل (2007). البرمجة الوظيفية في أمن الاتصالات . مؤتمر CUFP 2007. مؤرشف من الأصل بتاريخ 21-12-2010 . تم الاطلاع عليه بتاريخ 29-08-2009 .
- ↑ لوريمر، آر جيه (19 يناير 2009). "الإعلان عن تطبيق كلوجر للإنتاج المباشر" . إنفو كيو .
- ↑ بوغنيون، باسكال (2016). سكالا لعلوم البيانات ( الطبعة الأولى). باكت . ISBN 9781785281372.
- ↑ "لماذا يُفضّل المطورون لغة ClojureScript؟" . StackShare . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ هيريك، جاستن (29-04-2024)، jah2488/elm-companies ، تم الاطلاع عليه بتاريخ 29-04-2024
- ↑ "لماذا يُفضّل المطورون PureScript؟" . StackShare . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ فريق التحرير (2019-01-08). "أليغرو - كل ما تحتاج معرفته عن أفضل سوق إلكتروني بولندي" . أخبار التجارة الإلكترونية في ألمانيا . تاريخ الاسترجاع: 2024-04-29 .
- ↑ "مواقع الويب التي تستخدم إطار عمل Phoenix - Wappalyzer" . www.wappalyzer.com . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ "البرمجة الوظيفية: 2019-2020" . قسم علوم الحاسوب، جامعة أكسفورد . تم الاطلاع عليه بتاريخ 28 أبريل 2020 .
- ↑ "البرمجة 1 (هاسكل)" . قسم علوم الحاسوب، إمبريال كوليدج لندن . تم الاطلاع عليه بتاريخ 28 أبريل 2020 .
- 1 2 "بكالوريوس علوم الحاسوب - الوحدات الدراسية" . تم الاطلاع عليه بتاريخ 28 أبريل 2020 .
- 1 2 أبيلسون، هال ؛ سوسمان، جيرالد جاي (1985). "مقدمة الطبعة الثانية" . بنية وتفسير برامج الحاسوب ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا. رمز Bibcode : 1985sicp.book.....A .
- ↑ جون دينيرو (خريف 2019). "علوم الحاسوب 61A، بيركلي" . قسم الهندسة الكهربائية وعلوم الحاسوب، بيركلي . تاريخ الاسترجاع: 14 أغسطس 2020 .
- ↑ مقابلة مع إيمانويل شانزر من شركة Bootstrap في برنامج Triangulation التلفزيوني على شبكة TWiT.tv
- ↑ "لماذا لغة Scheme للبرمجة التمهيدية؟" . home.adelphi.edu . تم الاطلاع عليه بتاريخ 29-04-2024 .
- ↑ فريق عمل IMACS (2011-06-03). "ما هو البرنامج ولماذا هو مفيد للطلاب؟" . IMACS - بناء مفكرين أفضل مدى الحياة . تاريخ الاسترجاع: 2024-04-29 .
للمزيد من القراءة
- أبيلسون، هال ؛ سوسمان، جيرالد جاي (1985). بنية وتفسير برامج الحاسوب . مطبعة معهد ماساتشوستس للتكنولوجيا. رمز Bibcode : 1985sicp.book.....A . رقم ISBN 978-0-262-51036-3.
- كوسينو، جاي وميشيل موني. المنهج الوظيفي للبرمجة . كامبريدج، المملكة المتحدة: مطبعة جامعة كامبريدج ، 1998.
- كاري، هاسكل بروكس وفيس، روبرت وكريج، ويليام. المنطق التوافقي . المجلد الأول. شركة نورث هولاند للنشر، أمستردام، 1958.
- كاري، هاسكل ب .؛ هيندلي، ج. روجر ؛ سيلدين، جوناثان ب. (1972). المنطق التوافقي . المجلد الثاني. أمستردام: نورث هولاند. ISBN 978-0-7204-2208-5.
- دومينوس، مارك جيسون. بيرل من الرتبة العليا . مورغان كوفمان . 2005.
- فيليسين، ماتياس؛ فيندلر، روبرت؛ فلات، ماثيو؛ كريشنامورثي، شري رام (2018). كيفية تصميم البرامج . مطبعة معهد ماساتشوستس للتكنولوجيا.
- غراهام، بول. لغة ANSI Common LISP . إنجلوود كليفس، نيو جيرسي: برنتيس هول ، 1996.
- ماكلينان، بروس ج. البرمجة الوظيفية: الممارسة والنظرية . أديسون-ويسلي، 1990.
- مايكلسون، جريج (10 أبريل 2013). مقدمة في البرمجة الوظيفية من خلال حساب لامدا . شركة كورير. ISBN 978-0-486-28029-5.
- أوسوليفان، برايان؛ ستيوارت، دون؛ غورزن، جون (2008). هاسكل في العالم الحقيقي . أورايلي.
- برات، تيرينس دبليو ومارفن فيكتور زيلكوفيتز . لغات البرمجة: التصميم والتنفيذ . الطبعة الثالثة. إنجلوود كليفس، نيو جيرسي: برنتيس هول ، 1996.
- سالوس، بيتر هـ. لغات البرمجة الوظيفية والمنطقية . المجلد 4 من دليل لغات البرمجة. إنديانابوليس، إنديانا: ماكميلان للنشر التقني ، 1998.
- تومسون، سيمون. هاسكل: فن البرمجة الوظيفية . هارلو، إنجلترا: أديسون-ويسلي لونجمان المحدودة ، 1996.
روابط خارجية
- فورد، نيل. "التفكير الوظيفي" . تم الاسترجاع بتاريخ 10-11-2021 .
- أخميتشيت، سلافا (19-06-2006). "defmacro - البرمجة الوظيفية للجميع" . تم الاطلاع عليه بتاريخ 24-02-2013 .مقدمة
- البرمجة الوظيفية في بايثون (بقلم ديفيد ميرتز): الجزء 1 ، الجزء 2 ، الجزء 3
- البرمجة الوظيفية
- نماذج البرمجة
- مقارنات لغات البرمجة
