Кіріспе
Бағдарламалау тілдерін бағалау ережесі Бағдарламалау тілінде бағалау стратегиясы - өрнектерді бағалау ережесінің жиынтығы. Термин көбінесе әрбір параметр үшін функцияға берілетін мәннің түрін анықтайтын параметрлерді өткізу стратегиясының нақты түсінігіне сілтеме жасау үшін қолданылады (байланысты стратегия) және функция шақыруының параметрлерін бағалау керек пе, жоқ па және егер болса қандай тәртіппен (бағалау тәртібі). Кемелерді қысқарту стратегиясы түсінігі бөлек, бірақ кейбір авторлар екі терминді біріктіреді және әр терминнің анықтамасы кеңінен келісілмейді. Мысалы, f ((a,b) функциясын шақыруды орындау алдымен a және b аргументтерін бағалап, нәтижелерді сілтемелерде немесе ref a және ref b жады орындарында сақтай алады, содан кейін функцияның денесін осы сілтемелермен бағалайды. Бұл функцияға аргумент мәндерін іздеу, оларды жергілікті айнымалылар болғандай тағайындау арқылы өзгерту және сілтемелер арқылы мәндерді қайтару мүмкіндігін береді. Бұл - анықтамалық бағалау стратегиясы бойынша шақыру. Бағалау стратегиясы бағдарламалау тілінің анықтамасының семантикасының бір бөлігі болып табылады. Кейбір тілдерде, мысалы PureScript-те, әр түрлі бағалау стратегиялары бар нұсқалар бар. Кейбір декларативтік тілдер, мысалы Datalog, бірнеше бағалау стратегиясын қолдайды. Кейбір тілдерде шақыру конвенциясы анықталады.
In a programming language, an evaluation strategy is a set of rules for evaluating expressions. The term is often used to refer to the more specific notion of a parameter passing strategy that defines the kind of value that is passed to the function for each parameter (the binding strategy) and whether to evaluate the parameters of a function call, and if so in what order (the evaluation order). The notion of reduction strategy is distinct, although some authors conflate the two terms and the definition of each term is not widely agreed upon. To illustrate, executing a function call f(a,b) may first evaluate the arguments a and b, store the results in references or memory locations ref a and ref b, then evaluate the function's body with those references passed in. This gives the function the ability to look up the argument values, to modify them via assignment as if they were local variables, and to return values via the references. This is the call by reference evaluation strategy. Evaluation strategy is part of the semantics of the programming language definition. Some languages, such as PureScript, have variants with different evaluation strategies. Some declarative languages, such as Datalog, support multiple evaluation strategies. Some languages define a calling convention.
Қатаң бағалау
Аппликативтік тәртіп - функцияларды қолдану алдында функцияның аргументтері толықтай бағаланатын бағалау тәртібі. Бұл функцияны қатаң етудің әсерін тигізеді, яғни функцияның нәтижесі анықталмаған болса, егер кез-келген аргумент анықталмаған болса, онда қолданбалы реттік бағалауды көбірек қатаң бағалау деп атайды. Сонымен қатар, функция шақыру процедурада кездескен кезде орындалады, сондықтан оны құлшынысты бағалау немесе ашкөз бағалау деп те атайды. Кейбір авторлар қатаң бағалауды талап ететін құндылықпен байланыстыру стратегиясына байланысты қатаң бағалауды "баға бойынша шақыру" деп атайды. Схема орындау реті аргументтердің белгіленбеген пермутациясының ретті орындалуын талап етеді. OCaml осыған ұқсас ретін нақтыламайды, бірақ іс жүзінде абстрактілік машинаның дизайнынан пайдаланып оңнан солға қарай аргументтерді бағалайды. Бұлардың барлығы қатаң бағалау.
Қатаң емес бағалау
Қатаң емес бағалау тәртібі - қатаң емес бағалау тәртібі, яғни функция барлық аргументтері толықтай бағаланбастан нәтиже қайтаруы мүмкін. Прототипі мысал - қалыпты реттік бағалау, ол функцияның денесінде қажет болғанға дейін аргументтердің ешқайсысын бағаламайды. Қалыпты реттік бағалау кез келген басқа бағалау реті қатесіз аяқталатын кез келген уақытта қатесіз аяқталатын қасиетке ие. "Нормалды реттік" атауы ламбдалық есептеуден алынған, онда нормалды реттік азайту, егер ол болса, қалыпты нысанды табады (бұл "нормалдастыру" азайту стратегиясы). Жалқау бағалау осы мақалада бағалау тәртібіне қарағанда, міндетті әдіс ретінде жіктеледі. Бірақ бұл айырмашылық әрқашанда сақталмайды және кейбір авторлар жалколық бағалауды қалыпты тәртіпті бағалау деп немесе керісінше анықтайды немесе қатаңдықты жалколық бағалаумен шатастырады. Қалыпты тәртіпті бағалаудың күрделілігіне байланысты тарихи түрде жарамды жөндеу құралдары жетіспейді.
Біріктіру арқылы шақыру
Логикалық бағдарламалауда өрнекті бағалау қарапайым түрде қатысатын терминдерді біріктірумен және шешімнің қандай да бір түрін қолданумен сәйкес келуі мүмкін. Біріктіруді қатаң түрде міндетті стратегия ретінде жіктеуге болады, өйткені ол толық орындалады. Алайда, біріктіру шектелмеген айнымалыларға да орындалуы мүмкін, сондықтан шақырулар барлық айнымалылар үшін соңғы мәндерге міндетті түрде берілмеуі мүмкін.
Атын атап шақыру
Call by name - функцияның аргументтері функцияны шақырғанға дейін бағаланбайтын бағалау стратегиясы, олар тікелей функцияның денесіне ауыстырылады (алмастырудан аулақ болу үшін тұтқындауды қолданады) және функцияда пайда болған кезде бағалануға қалдырылады. Егер аргумент функцияның құрамында қолданылмаса, онда ол ешқашан бағаланбайды; егер ол бірнеше рет қолданылса, ол пайда болған сайын қайта бағаланады. (Бұл әдісті пайдаланған бағдарламалау техникасы үшін Дженсеннің құрылғысын қараңыз.) Кейде құндылық бағалауға қарағанда, атау бойынша бағалауды таңдау артық. Егер функция аргументі функцияда қолданылмаса, онда аты бойынша шақыру аргументті бағаламау арқылы уақытты үнемдейді, ал мәні бойынша шақыру оны бағалайды. Егер аргумент аяқталмайтын есептеу болса, артықшылық өте зор. Алайда, функция аргументі қолданылған кезде, атымен шақыру жиі баяу жүреді, сондықтан thunk сияқты механизм қажет. NET тілдері делегаттар немесе Expression<T> параметрлерін қолдана отырып, атау арқылы шақыруды симуляциялай алады. Соңғысы функцияға берілген абстрактілік синтаксистік ағашты береді. Эйфел агенттерді ұсынады, олар қажет болған кезде бағаланатын операцияны білдіреді. Seed7 функцияның параметрлері бойынша атауды ұсынады. Java бағдарламалары ламбда өрнектері мен java-ны қолдана отырып, ұқсас жалколық бағалауды орындай алады. пайдаланған. функциясы. Жеткізуші<T> интерфейсі.
Қажеттілік бойынша хабарласыңыз
Қажеттілік бойынша шақыру - бұл атау бойынша шақырудың мемориалды нұсқасы, онда егер функция аргументі бағаланса, бұл мән кейінгі пайдалану үшін сақталады. Егер аргумент таза болса (яғни, жанама әсерлерсіз болса), бұл атымен шақыру сияқты нәтиже береді, бұл аргументті қайта есептеудің құнын үнемдейді. Haskell - қажеттілік бойынша шақыруды пайдаланатын белгілі тіл. Экспрессияларды бағалау есептеудің кездейсоқ ұзақ уақытында болуы мүмкін болғандықтан, Хаскелл монодаларды пайдалану арқылы тек қана жанама әсерлерді (мысалы, мутацияны) қолдайды. Бұл олардың кідірілген бағалау алдында мәндері өзгерген айнымалылардан кез келген күтпеген мінез-құлықты жояды. R-дің қажеттілік бойынша шақыруды іске асыруында барлық аргументтер беріледі, яғни R кездейсоқ жанама әсерлерге жол береді. Жалқау бағалау қажеттілік семантикасы бойынша шақырудың ең көп таралған жүзеге асырылуы, бірақ оптимистік бағалау сияқты нұсқалар бар. NET тілдері Lazy<T> түрін пайдалану арқылы қажеттілік бойынша шақыруды іске асырады. Графикті қысқарту - жалқау бағалаудың тиімді жүзеге асырылуы.
Макро кеңейту бойынша шақыру
Макролық кеңейту арқылы шақыру атаумен шақыруға ұқсас, бірақ алмастырудан аулақ болу үшін аулаудың орнына мәтіндік алмастыруды қолданады. Макроны ауыстыру өзгермелі тұтқындауға әкелуі мүмкін, бұл қателерге және жағымсыз мінез-құлыққа әкелуі мүмкін. Гигиеналық макростар бұл мәселені параметр емес көлеңкелі айнымалыларды тексеру және ауыстыру арқылы болдырмайды.