ارزیابی تنبل وارانه (Lazy Evaluation) در زبان ‌های برنامه ‌نویسی تابع گرا


ارزیابی تنبل وارانه یک استراتژی ارزیابی است که در آن ارزیابی یک دستور تا زمانی که مقدار آن مورد نیاز نباشد به تعویق می‌افتد. این موضوع از جهات مختلف مزیت دارد؛ اما یکی از مهمترین آنها این است که نیازی به ارزیابی چند باره یک دستور نداریم.

پزبان برنامه نویسی Haskell به عنوان یک زبان برنامه ‌نویسی تابع گرا یک مثال بسیار خوب از ویژگی یا Lazy Evaluation است. مفهوم یاLazy Evaluation نیز در LINQ بسیار پرکاربرد است. در این رابطه توصیه می کنیم از آموزش LINQ در سی شارپ و آموزش مباحث پیشرفته LINQ در سی شارپ استفاده کنید. علاوه بر این از Lazy Evaluation در Map Function های مربوط به Unix برای بهبود Performance یا کارایی آنها نیز استفاده می شود. این موضوع یک مقاله جداگانه را می‌ طلبد؛ بنابراین وارد جزئیات مربوط به آن نخواهیم شد. در ادامه در رابطه با مزیت های استراتژی Lazy Evaluation صحبت خواهیم کرد.

مزایای lazy evaluation

1. اجازه می دهد که محیط اجرا و یا Runtime زبان برنامه نویسی مورد نظر از اجرا کردن زیر دستوراتی که به طور مستقیم به نتیجه نهایی دستور اصلی ربطی ندارند جلوگیری کند.

2. پیچیدگی زمانی و یا Time Complexity یک الگوریتم را با از بین بردن محاسبات موقت و جملات شرطی کاهش می دهد.

3. اجازه می دهد که برنامه نویس به عناصر مربوط به ساختمان داده ها بدون در نظر گرفتن ترتیب آنها استفاده کند. به عبارت دیگر به شرط اینکه وابستگی چرخشی و یا Circular Dependency وجود نداشته باشد می‌توانیم بعد از راه اندازی و یا Initialize کردن آنها از آنها استفاده کنیم.

4. برای بارگذاری کردن داده هایی که به ندرت مورد ارزیابی قرار می گیرند بسیار مناسب است.

و اما استفاده کردن از Lazy Evaluation معایبی را نیز دارد که در قسمت زیر به آنها می پردازیم.

معایب Lazy Evaluation

1. یکی از معایب Lazy Evaluation این است که محیط اجرای زبان برنامه نویسی و یا همان Runtime ارزیابی زیر دستورات را تا زمان دسترسی به نتیجه نهایی با استفاده از Delayed Object ها و یا اصطلاحاً Thunk ها به تعویق می‌اندازد.

2. در برخی از شرایط پیچیدگی فضایی و یا Space Complexity یک الگوریتم افزایش پیدا می کند.

3. با استفاده از Lazy Evaluation به سادگی نمی توانیم کارآمد بودن و یا Performance یک تکه کد را بررسی کنیم؛ چرا که دستور مورد نظر قبل از اجرا شدن شامل Delayed Object ها خواهد بود.

استفاده از ارزیابی تنبل وارانه (Lazy Evaluation) با استفاده از زبان برنامه نویسی Python

متد Range در زبان برنامه نویسی Python از مفهوم Lazy Evaluation استفاده می‌کند. این متد باعث می‌شود که زمان اجرا و یا Execution Time مربوط به Range های بزرگتر که به مقادیر آنها در حال حاضر نیازی نیست صرفه جویی بگردد. بنابراین مصرف حافظه نیز کاهش پیدا می‌کند. مثالی از این موضوع در کد زیر نشان داده شده است.

[c++]

r = range(10)

print(r)

range(0, 10)

print(r[3])

[/c++]

خروجی این کد شبیه به قسمت زیر خواهد بود.

[output]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

3

[/output]

منبع:وبسایت پرووید