Введение
Правила оценки языка программирования В языке программирования стратегия оценки - это набор правил оценки выражений. Термин часто используется для обозначения более конкретного понятия стратегии передачи параметров, которая определяет тип значения, которое передается функции для каждого параметра (ввязывающая стратегия), и следует ли оценивать параметры вызова функции, и если да, то в каком порядке (порядок оценки). Понятие стратегии сокращения отличается, хотя некоторые авторы смешивают два термина, и определение каждого термина не является общепринятым. Для иллюстрации, выполнение вызова функции 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 могут выполнять аналогичную ленивую оценку, используя выражения lambda и java. - Да, конечно. Функция. Интерфейс поставщика.
Позвоните по необходимости
Call by need - это вариант call by name, в котором, если аргумент функции оценивается, то значение хранится для последующего использования. Если аргумент чистый (т.е. без побочных эффектов), это дает те же результаты, что и призыв по имени, сокращая затраты на перерасчет аргумента. Хаскелл - это хорошо известный язык, который использует оценку по запросу. Поскольку оценка выражений может происходить произвольно далеко в вычислениях, Хаскелл поддерживает только побочные эффекты (такие как мутация) с помощью монод. Это устраняет любое неожиданное поведение переменных, значения которых изменяются до их задержки оценки. В реализации R по вызову по необходимости все аргументы передаются, что означает, что R допускает произвольные побочные эффекты. Ленивая оценка является наиболее распространенной реализацией семантики по запросу по потребности, но существуют вариации, такие как оптимистическая оценка. Языки NET реализуют вызов по необходимости, используя тип Lazy<T>. Уменьшение графа является эффективной реализацией ленивой оценки.
Призыв по расширению макросов
Расширение по вызову по макросущности похоже на вызов по имени, но использует текстовую замену, а не захват, избегающий замены. Поэтому замена макросов может привести к захвату переменных, что приводит к ошибкам и нежелательному поведению. Гигиенические макросы избегают этой проблемы, проверяя и заменяя затененные переменные, которые не являются параметрами.