تثمين كسول: الفرق بين النسختين

من ويكيبيديا، الموسوعة الحرة
[نسخة منشورة][نسخة منشورة]
تم حذف المحتوى تمت إضافة المحتوى
وسمان: تحرير من المحمول تعديل ويب محمول
لا ملخص تعديل
وسمان: تحرير من المحمول تعديل ويب محمول
سطر 19: سطر 19:
==التطبيقات==
==التطبيقات==
يُستخدم التثمين المؤجَّل(Delayed evaluation) تحديدًا في لُغات [[برمجة وظيفية|البرمجة الوظيفيَّة]]. فعند استخدام التثمين المؤجَّل، لا يتم تثمين التعبير عند إسناده إلى مُتَغَيِّر بل يُثَمَّن عند الحاجة لإنتاج قيمة التعبير. هذه إفادة كمثال، <code>x:=expression;</code> (إسناد نتيجة التعبير إلى مُتَغَيِّر). بوضوحٍ، تَمَّ استدعاء التعبير بُغية تثمينه وَوُضِعَت النتيجة في <code>x</code>، لكن يتم تعليق ما بداخل <code>x</code> لِحين احتياج قيمته وذلك باستخدام فهرس يقود إلى <code>x</code> في تعبيرٍ ما لاحِقٍ وقد يكون هذا التعبير أيضًا مؤجّلًا، وأخيرًا تُشَذَّب شجرة الاعتماديَّات النامية هذه لإنتاج بعض الرموز الّتي يُفَضَّل رؤيتها.<ref name="Wadler2006">{{cite book|author=Philip Wadler|title=Functional and logic programming: 8th international symposium, FLOPS 2006, Fuji-Susono, Japan, April 24-26, 2006 : proceedings|url=https://books.google.com/books?id=gZzLFFZfc1sC&pg=PA149|accessdate=14 January 2011|year=2006|publisher=Springer|isbn=978-3-540-33438-5|page=149}}</ref>
يُستخدم التثمين المؤجَّل(Delayed evaluation) تحديدًا في لُغات [[برمجة وظيفية|البرمجة الوظيفيَّة]]. فعند استخدام التثمين المؤجَّل، لا يتم تثمين التعبير عند إسناده إلى مُتَغَيِّر بل يُثَمَّن عند الحاجة لإنتاج قيمة التعبير. هذه إفادة كمثال، <code>x:=expression;</code> (إسناد نتيجة التعبير إلى مُتَغَيِّر). بوضوحٍ، تَمَّ استدعاء التعبير بُغية تثمينه وَوُضِعَت النتيجة في <code>x</code>، لكن يتم تعليق ما بداخل <code>x</code> لِحين احتياج قيمته وذلك باستخدام فهرس يقود إلى <code>x</code> في تعبيرٍ ما لاحِقٍ وقد يكون هذا التعبير أيضًا مؤجّلًا، وأخيرًا تُشَذَّب شجرة الاعتماديَّات النامية هذه لإنتاج بعض الرموز الّتي يُفَضَّل رؤيتها.<ref name="Wadler2006">{{cite book|author=Philip Wadler|title=Functional and logic programming: 8th international symposium, FLOPS 2006, Fuji-Susono, Japan, April 24-26, 2006 : proceedings|url=https://books.google.com/books?id=gZzLFFZfc1sC&pg=PA149|accessdate=14 January 2011|year=2006|publisher=Springer|isbn=978-3-540-33438-5|page=149}}</ref>

من فوائد التثمين المؤجَّل قدرته على إنشاء قوائم لانهائيَّة قابلة للحِساب بدون تداخل الحلقات اللَّانهائيَّة أو الحجم في الحِساب. كمثال، يُمكن إنشاء دالَّة تُنشِئ قائمة لانهائيَّة (تُدعى غالبًا «[[جريان (حوسبة)|جريان]]») من [[عدد فيبوناتشي|أعداد فيبوناتشي]]. إنَّ حِساب عدد فيبوناتشيّ ما -وليكن «ن»- سيكون بكلّ بساطة استخلاصًا لهذا العنصر -الّذي هو العدد «ن»- من القائمة اللَّانهائيَّة، مُجبرًا بذلك على تثمين أوَّل ن عنصر من القائمة.<ref name="Métayer2002">{{cite book|author=Daniel Le Métayer|title=Programming languages and systems: 11th European Symposium on Programming, ESOP 2002, held as part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2002, Grenoble, France, April 8-12, 2002 : proceedings|url=https://books.google.com/books?id=dYZyzp-I9hQC&pg=PA129|accessdate=14 January 2011|year=2002|publisher=Springer|isbn=978-3-540-43363-7|pages=129–132}}</ref><ref name="MachineryLanguages2002">{{cite book|author1=Association for Computing Machinery|author2=ACM Special Interest Group on Programming Languages|title=Proceedings of the 2002 ACM SIGPLAN Haskell Workshop (Haskell '02): Pittsburgh, Pennsylvania, USA ; October 3, 2002|url=https://books.google.com/books?id=hsBQAAAAMAAJ|accessdate=14 January 2011|date=1 January 2002|publisher=Association for Computing Machinery|isbn=978-1-58113-605-0|page=40}}</ref>


==المراجع==
==المراجع==

نسخة 18:29، 9 مارس 2017

إنَّ نظرية لغة البرمجة أو التثمين الكسول أو الاستدعاء عند الحاجة(call-by-need)[1] هي استراتيجية تثمين تؤخِّر تثمين التعبير لحين احتياج قيمته (تثمين غير صارم) وَتتجنّب بذلك -مُشاركة- التَثمينات المُتكرِّرة.[2][3] يُمكن للمُشاركة إنقاص وقت تشغيل دوال مُعيَّنة بعاملٍ خَطِّي(أُسِّي) على استراتيجيَّات التثمين غير الصارم، مثل الاستدعاء بالاسم.[بحاجة لمصدر]

تتضمَّن منافع التثمين الكسول:

  • القدرة على تعريف بُنى تدفق السيطرة بتجريدٍ بدلًا من أن تكون مُدمجة.
  • القدرة على تعريف بُنى بيانات مُمكنة الأزليَّة، يسمح هذا بتنفيذ دقيق للمزيد من الخوارزميَّات.
  • زيادة الأداء بتجنُّب الحسابات غير الضروريَّة وَالأخطاء في حالة تثمين التعابير المُركَّبة.

غالبًا ما يُدمَج التثمين الكسول مع استحضار الذاكرة[4](memoization أو memoisation)، كما قد ذُكِر في «كتابة برامج كفء»(Writing Efficient Programs) لِـجون بينتلي، غالبًا ما يُدمَج التثمين الكسول مع التذكُّر.[5] بعد أن تُحوسب قيمة الدالَّة من أجل مُعطىً أو مجموعة من المُعطيات، فإنَّ النَّتيجة تُخَزَّن في جدول المُشاهدات المُفَهرَس وفق قيم المُعطيات؛ وفي المرَّة القادمة الَّتي سَتُستَدعى فيها الدالَّة سيتم تفقُّد الجدول لتحديد فيما إذا كانت نتيجة قيم المُعطيات متوفِّرةً بالفعل أم لا. عندها وببساطة سَتُعاد قيمة النتيجة المُخَزَّنة وَإن كان العكس فَسيتم تثمين الدالَّة وَيُضاف مُدخَل جديد إلى جدول المُشاهدات لِيُعاد استخدامه لاحقًا.

قد يؤدِّي التثمين الكسول إلى نقص في الذكرة اللّازمة للبرامج(المحجوزة لها)؛ لأنَّ القيم تُنسَئ عند الحاجة إليها.[6] ومن الصَّعب دمج التثمين الكسول مع المَزايا الأمريَّة مثل استيعاب الأخطاء وَالدخل/الخرج، لأنّ ترتيب العمليّات يصبح غيرَ مُحدَّدٍ. وَقد يسبّب التثمين الكسول تسرب الذاكرة.[7]

عكس التثمين الكسول هو «التثمين اللَّهوف»(eager evaluation)؛ وَأحيانًا يُعرَف باسم التثمين الصارم(strict evaluation). ولقد وظِّف التثمين اللَّهوف كاستراتيجيّة تثمين في أغلب لُغات البرمجة.

لمحة تاريخيّة

قُدِّمَ التثمين الكسول من أجل حسابات اللامدا من قِبَل كريستوفر وادز-ورث[8] وَباستقلالٍ من أجل لُغات البرمجة من قِبَل بيتر هيندرسن وَجيمس حيرم موريس[9] وَدانيال بول فريدمان وَديفيد س. وايز.[10][11]

التطبيقات

يُستخدم التثمين المؤجَّل(Delayed evaluation) تحديدًا في لُغات البرمجة الوظيفيَّة. فعند استخدام التثمين المؤجَّل، لا يتم تثمين التعبير عند إسناده إلى مُتَغَيِّر بل يُثَمَّن عند الحاجة لإنتاج قيمة التعبير. هذه إفادة كمثال، x:=expression; (إسناد نتيجة التعبير إلى مُتَغَيِّر). بوضوحٍ، تَمَّ استدعاء التعبير بُغية تثمينه وَوُضِعَت النتيجة في x، لكن يتم تعليق ما بداخل x لِحين احتياج قيمته وذلك باستخدام فهرس يقود إلى x في تعبيرٍ ما لاحِقٍ وقد يكون هذا التعبير أيضًا مؤجّلًا، وأخيرًا تُشَذَّب شجرة الاعتماديَّات النامية هذه لإنتاج بعض الرموز الّتي يُفَضَّل رؤيتها.[12]

من فوائد التثمين المؤجَّل قدرته على إنشاء قوائم لانهائيَّة قابلة للحِساب بدون تداخل الحلقات اللَّانهائيَّة أو الحجم في الحِساب. كمثال، يُمكن إنشاء دالَّة تُنشِئ قائمة لانهائيَّة (تُدعى غالبًا «جريان») من أعداد فيبوناتشي. إنَّ حِساب عدد فيبوناتشيّ ما -وليكن «ن»- سيكون بكلّ بساطة استخلاصًا لهذا العنصر -الّذي هو العدد «ن»- من القائمة اللَّانهائيَّة، مُجبرًا بذلك على تثمين أوَّل ن عنصر من القائمة.[13][14]

المراجع

  1. ^ Hudak 1989، صفحة 384
  2. ^ David Anthony Watt؛ William Findlay (2004). Programming language design concepts. John Wiley and Sons. ص. 367–368. ISBN:978-0-470-85320-7. اطلع عليه بتاريخ 2010-12-30.
  3. ^ Reynolds 1998، صفحة 307
  4. ^ مَجمع اللُّغة العربيَّة على الشَّبكة العالميَّة، الفتوى: 1120.
  5. ^ Bentley, Jon Louis. Writing Efficient Programs. Prentice-Hall, 1985. ISBN 978-0139702440
  6. ^ Chris Smith (22 أكتوبر 2009). Programming F#. O'Reilly Media, Inc. ص. 79. ISBN:978-0-596-15364-9. اطلع عليه بتاريخ 2010-12-31.
  7. ^ Edward Z. Yang. "Space leak zoo".
  8. ^ (Wadsworth 1971)
  9. ^ (Henderson & Morris 1976)
  10. ^ (Friedman & Wise 1976)
  11. ^ Reynolds 1998، صفحة 312
  12. ^ Philip Wadler (2006). Functional and logic programming: 8th international symposium, FLOPS 2006, Fuji-Susono, Japan, April 24-26, 2006 : proceedings. Springer. ص. 149. ISBN:978-3-540-33438-5. اطلع عليه بتاريخ 2011-01-14.
  13. ^ Daniel Le Métayer (2002). Programming languages and systems: 11th European Symposium on Programming, ESOP 2002, held as part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2002, Grenoble, France, April 8-12, 2002 : proceedings. Springer. ص. 129–132. ISBN:978-3-540-43363-7. اطلع عليه بتاريخ 2011-01-14.
  14. ^ Association for Computing Machinery؛ ACM Special Interest Group on Programming Languages (1 يناير 2002). Proceedings of the 2002 ACM SIGPLAN Haskell Workshop (Haskell '02): Pittsburgh, Pennsylvania, USA ; October 3, 2002. Association for Computing Machinery. ص. 40. ISBN:978-1-58113-605-0. اطلع عليه بتاريخ 2011-01-14.