Строгость функций в программировании: определение и анализ
Strict function
Строгие и нестрогие функции в программировании: определение, семантика, влияние на завершение вычислений и языки программирования. Объяснение "bottom".
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
В информатике и компьютерном программировании функция f считается строгой, если при применении к выражению, не завершающемуся в конечном времени, она также не завершается. Строгая функция в денотационной семантике языков программирования – это функция f, где сущность, называемая «bottom», обозначает выражение, которое не возвращает нормальное значение, либо из-за бесконечного цикла, либо из-за прерывания из-за ошибки, такой как деление на ноль. Функция, которая не является строгой, называется нестрогой. Строгий язык программирования – это язык, в котором пользовательские функции всегда строги. Интуитивно, нестрогие функции соответствуют управляющим структурам. Операционно, строгая функция всегда вычисляет свой аргумент; нестрогая функция может не вычислять некоторые из своих аргументов. Функции, имеющие более одного параметра, могут быть строгими или нестрогими по каждому параметру независимо, а также совместно строгими по нескольким параметрам одновременно. Например, выражение «if-then-else» во многих языках программирования, обозначаемое как «?:» в языках, вдохновленных C, можно рассматривать как функцию трех параметров. Эта функция строга по своему первому параметру, поскольку функция должна знать, вычисляется ли ее первый аргумент как true или false, прежде чем она сможет вернуть результат; но она нестрога по своему второму параметру, потому что, например, if(false, , 1) = 1, а также нестрога по своему третьему параметру, потому что, например, if(true, 2, ) = 2. Однако она совместно строга по своим второму и третьему параметрам, поскольку if(true, , ) = и if(false, , ) = .
В нестрогом функциональном языке программирования анализ строгости относится к любому алгоритму, используемому для доказательства строгости функции по отношению к одному или нескольким ее аргументам. Такие функции могут быть скомпилированы с использованием более эффективной конвенции вызова, такой как передача по значению, без изменения смысла окружающей программы.
In computer science and computer programming, a function f is said to be strict if, when applied to a non terminating expression, it also fails to terminate. A strict function in the denotational semantics of programming languages is a function f where The entity , called bottom, denotes an expression that does not return a normal value, either because it loops endlessly or because it aborts due to an error such as division by zero. A function that is not strict is called non strict. A strict programming language is one in which user defined functions are always strict. Intuitively, non strict functions correspond to control structures. Operationally, a strict function is one that always evaluates its argument; a non strict function is one that might not evaluate some of its arguments. Functions having more than one parameter can be strict or non strict in each parameter independently, as well as jointly strict in several parameters simultaneously. As an example, the if then else expression of many programming languages, called ? : in languages inspired by C, may be thought of as a function of three parameters. This function is strict in its first parameter, since the function must know whether its first argument evaluates to true or to false before it can return; but it is non strict in its second parameter, because (for example) if(false,,1) = 1, as well as non strict in its third parameter, because (for example) if(true,2,) = 2. However, it is jointly strict in its second and third parameters, since if(true,,) = and if(false,,) =
In a non strict functional programming language, strictness analysis refers to any algorithm used to prove the strictness of a function with respect to one or more of its arguments. Such functions can be compiled to a more efficient calling convention, such as call by value, without changing the meaning of the enclosing program.