Evaluación perezosa

En la teoría de lenguajes de programación, la evaluación perezosa (del inglés lazy evaluation) o llamada por necesidad es una estrategia de evaluación que retrasa el cálculo de una expresión hasta que su valor sea necesario, y que también evita repetir la evaluación en caso de ser necesaria en posteriores ocasiones. Esta compartición del cálculo puede reducir el tiempo de ejecución de ciertas funciones de forma exponencial, comparado con otros tipos de evaluación.

Los beneficios de la evaluación perezosa son:

  • El incremento en el rendimiento al evitar cálculos innecesarios, y en tratar condiciones de error al evaluar expresiones compuestas.
  • La capacidad de definir estructuras de control como abstracciones, en lugar de operaciones primitivas.

Este método de evaluación se implementa comúnmente encapsulando cada expresión en una función que, cuando sea computada, devolverá el valor deseado de la expresión. De esta manera, cuando se necesite el resultado, se ejecutará la función creada para conseguirlo.

La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que los valores se crean solo cuando se necesitan. Sin embargo, es difícil de combinar con las operaciones típicas de programación imperativa, como el manejo de excepciones o las operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado. Además, la evaluación perezosa puede conducir a fragmentar la memoria.

La evaluación perezosa se combina frecuentemente con memorización, tal y como lo describe Jon Bentley en Writing Efficient Programs[1]​ (Escribiendo Programas Eficientes). Después de que se compute el valor de una función para un parámetro o una serie de éstos, el resultado se almacena en una tabla de consulta que está organizada según los valores de estos parámetros; la siguiente vez que se le llame a la función, antes se consulta la tabla para determinar si ya está disponible el resultado para esa combinación de parámetros. Si es el caso, la función devuelve el resultado almacenado previamente. Si no, la se evalúa la función y se añade el resultado a la tabla para una posterior reutilización.

Lo contrario de la evaluación perezosa es la evaluación acaparadora, o evaluación estricta, que es el modo de evaluación por defecto en la mayoría de los lenguajes de programación.

Referencias

  1. Bentley, Jon Louis. Writing Efficient Programs. Prentice-Hall, 1985. ISBN 978-0139702440