Evaluación perezosa


En la teoría del lenguaje de programación , la evaluación perezosa , o call-by-need , [1] es una estrategia de evaluación que retrasa la evaluación de una expresión hasta que se necesita su valor ( evaluación no estricta ) y que también evita evaluaciones repetidas ( compartir ). [2] [3]

La evaluación perezosa a menudo se combina con la memorización , como se describe en Writing Efficient Programs de Jon Bentley . [4] Después de calcular el valor de una función para ese parámetro o conjunto de parámetros, el resultado se almacena en una tabla de búsqueda indexada por los valores de esos parámetros; la próxima vez que se llame a la función, se consultará la tabla para determinar si el resultado de esa combinación de valores de parámetros ya está disponible. Si es así, simplemente se devuelve el resultado almacenado. De lo contrario, se evalúa la función y se agrega otra entrada a la tabla de búsqueda para su reutilización.

La evaluación perezosa es difícil de combinar con funciones imperativas como el manejo de excepciones y la entrada/salida , porque el orden de las operaciones se vuelve indeterminado.

Lo opuesto a la evaluación perezosa es la evaluación ansiosa , a veces conocida como evaluación estricta. La evaluación ansiosa es la estrategia de evaluación empleada en la mayoría de los lenguajes de programación [ cuantificados ] .

Christopher Wadsworth [5] introdujo la evaluación perezosa para el cálculo lambda y la empleó Plessey System 250 como una parte fundamental de una metamáquina de cálculo lambda, lo que reduce la sobrecarga de resolución para acceder a objetos en un espacio de direcciones de capacidad limitada. [6] Para los lenguajes de programación, fue introducido de forma independiente por Peter Henderson y James H. Morris [7] y por Daniel P. Friedman y David S. Wise. [8] [9]

La evaluación retrasada se usa particularmente en lenguajes de programación funcionales . Cuando se usa la evaluación retrasada, una expresión no se evalúa tan pronto como se vincula a una variable, sino cuando el evaluador se ve obligado a producir el valor de la expresión. Es decir, una declaración como x = expression;(es decir, la asignación del resultado de una expresión a una variable) requiere claramente que se evalúe la expresión y se coloque el resultado en x, pero lo que realmente está en xes irrelevante hasta que se necesite su valor. a través de una referencia a xen alguna expresión posterior cuya evaluación podría aplazarse, aunque eventualmente el árbol de dependencias en rápido crecimiento se podaría para producir algún símbolo en lugar de otro para que el mundo exterior lo vea. [10]