La evaluación perezosa o call-by-need es una estrategia de evaluación en la que una expresión no se evalúa hasta su primer uso, es decir, para posponer la evaluación hasta su demanda. Los lenguajes de programación funcional como Haskell usan esta estrategia ampliamente. C, C++ se denominan lenguajes estrictos que evalúan la expresión tan pronto como se declara. Luego están los lenguajes como Scala que son estrictos por defecto pero pueden ser perezosos si se especifican explícitamente, es decir, de tipo mixto.
Veamos un ejemplo en Scala:
sin pereza:
val geeks = List(1, 2, 3, 4, 5) val output = geeks.map(l=> l*2) println(output)
El valor de la salida se calcula tan pronto como se aplica la operación.
Con perezoso:
val geeks = List(1, 2, 3, 4, 5) lazy val output2 = geeks.map(l=> l*5) println(output2)
El valor no se calcula hasta que usamos output2, es decir, hasta println(output2).
En el ejemplo, ¿qué pasa si nunca usamos el valor de salida? Desperdiciamos nuestra operación de mapa (cálculos de CPU), lo que puede ser muy costoso cuando escribimos código más complejo y más grande. Aquí la evaluación perezosa nos ayuda a optimizar el proceso evaluando la expresión solo cuando es necesaria y evitando gastos generales innecesarios.
Ventajas:
- Optimiza el proceso de cálculo. Spark, un motor de computación de big data, utiliza esta técnica en su esencia.
- La evaluación perezosa puede ayudarnos a resolver dependencias circulares.
- Da acceso a una estructura de datos infinita.
- Permite la modularidad del código en partes.
- El programador pierde el control sobre la secuencia en que se ejecuta su código, ya que algunas expresiones se evalúan y otras no, según la necesidad.
Contras:
- Encontrar errores puede ser complicado ya que el programador no tiene control sobre la ejecución del programa.
- Puede aumentar la complejidad del espacio ya que todas las instrucciones (operaciones) deben almacenarse.
- Más difícil de codificar en contraste con el enfoque convencional.