Laisk väärtustamine

Laisk väärtustamine (inglise keeles lazy evaluation) ehk mitterange väärtustamine on programmeerimiskeelte teoorias väärtustamismeetod, kus avaldis väärtustatakse hetkel, kui avaldise väärtust vajatakse. Samuti väldib laisk väärtustamine korduvaid väärtustamisi, mis võib aidata funktsioonide tööaega eksponentsiaalselt vähendada võrreldes mitterangete väärtustamismeetoditega. Laisa väärtustamisega on võimalus defineerida potentsiaalselt lõpmatuid andmestruktuure, mis võib lihtsustada teatud algoritmide teostamist; suureneb jõudlus tarbetute arvutuste tegematajätmise arvelt. Laisk väärtustamine aitab ka mälu kokku hoida, sest väärtused leitakse nende vajamise hetkel. Siiski on laiska väärtustamist keeruline kombineerida imperatiivse programmeerimise võimalustega nagu näiteks erinditöötlus ja sisend/väljund, sest operatsioonide järjekord pole enam deterministlik. Laisa väärtustamise tõttu võivad tekkida mälulekked. Laisa väärtustamise vastand on agar väärtustamine, tuntud ka kui range väärtustamine. Agarat väärtustamist kasutatakse enamikus programmeerimiskeeltes. Viivitusega väärtustamist kasutatakse tihti funktsionaalsetes programmeerimiskeeltes. Viivitusega väärtustamisel ei väärtustata avaldist selle muutjaga sidumise hetkel, vaid kui väärtustaja on sunnitud avaldise väärtust kasutama. Näiteks avaldises x = avaldis (avaldise väärtuse omistamine muutujale x) on selgelt vaja, et avaldis väärtustataks ning siis omistataks muutujale x, kuid mida tegelikult muutujas x hoitakse, on tähtsusetu, kuni on reaalne vajadus selle muutuja väärtuse järele. Hilise väärtustamise eelis on lõpmatute massiivide loomine ilma lõpmatute tsükliteta. Näiteks võimaldab see luua funktsioon Fibonacci jada genereerimiseks, mis koostab lõpmatu arvujada (tihti kutsutakse seda vooks). Positsioonil n asuva Fibonacci arvu saamiseks on lõpmatust massiivist vaja võtta vastaval kohal asuv element ja selleks on vaja massiivis väärtustada n esimest elementi. Näiteks programmeerimiskeeles Haskell on võimalik täielikku Fibonacci jada koostada järgmiselt: fibs = 0 : 1 : zipWith (+) fibs (tail fibs) Haskelli süntaksis : lisab elemendi massiivi, tail tagastab massiivi ilma esimese elemendita ning zipWith võtab argumendiks funktsiooni (praegusel juhul liitmise), et kombineerida vastava kahe massiivi elemendid kolmandaks. Laiskades programmeerimiskeeltes nagu Haskell on vaikeväärtustamismeetod laisk väärtustamine, aga teatud juhtudel on võimalik koodi muuta agaramaks või vastupidi – muuta koodi laisemaks pärast selle eelnevalt agaramaks muutmist. Seda saab teha, kui programmeerida midagi, mis sunnib väärtustama (teeb koodi agaramaks) või väldib väärtustamist (teeb koodi laisemaks). Range väärtustamine tähendab tavaliselt agarust, aga need on tehniliselt erinevad mõisted. Programmeerimiskeele Python teises versioonis on funktsioon range(), mis tagastab täisarvude loendi. Terve loend on salvestatud mällu, kui esimene omistuslause on väärtustatud, nii et see on näide agarast või kohesest väärtustamisest: >>> r = range(10) >>> print r [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print r[3] 3 Pythoni kolmandas versioonis on funktsioon range(), mis tagastab spetsiaalse vahemiku objekti ja mis arvutab loendi elemendi ainult siis, kui seda on vaja teha. Vahemiku objekti elemendid genereeritakse ainult siis, kui neid on vaja (näiteks print(r[3]) järgnevas koodilõigus), nii et see on näide laisast väärtustamisest. >>> r = range(10) >>> print(r) range(0, 10) >>> print(r[3]) 3 John Reynolds (1998). Theories of programming languages. Cambridge University Press. Vaadatud 23. veebruaril 2016. David Anthony Watt, William Findlay (2004). Programming language design concepts. John Wiley and Sons: 367–368. Vaadatud 30. novembril 2018. Portland Pattern Repository. Kättesaadav: Lazy Evaluation. Vaadatud 30. novembril 2018. John Launchbury (1993). A Natural Semantics for Lazy Evaluation. Proceedings of the 20th ACM SIGPLAN-SIGACT symposium on Principles of programming languages. Vaadatud 30. novembril 2018. Edward Z. Yang. Kättesaadav: Space leak zoo. Vaadatud 30. novembril 2018. Masami Hagiya, Philip Wadler (2006). Functional and logic programming: 8th international symposium, FLOPS 2006. Springer: 149. Vaadatud 30. novembril 2018. Association for Computing Machinery; ACM Special Interest Group on Programming Languages (2002). Proceedings of the 2002 ACM SIGPLAN Haskell Workshop (Haskell '02). Association for Computing Machinery: 40. Vaadatud 30. novembril 2018. Haskelli Wiki. Kättesaadav: Fibonacci jada. Vaadatud 30. novembril 2018. Haskelli Wiki. Kättesaadav: Laisk mustrisobitus. Vaadatud 30. novembril 2018. Pythoni dokumentatsioon. Kättesaadav: "Sisseehitatud funktsioonid. Python 2.7.11 dokumentatsioon". Vaadatud 30. novembril 2018. Pythoni dokumentatsioon. Kättesaadav: "Sisseehitatud funktsioonid. Python 3.5.1 dokumentatsioon". Vaadatud 30. novembril 2018.