Futuros y promesas


En informática , futuro , promesa , retraso y diferido se refieren a construcciones utilizadas para sincronizar la ejecución de programas en algunos lenguajes de programación concurrentes . Describen un objeto que actúa como representante de un resultado inicialmente desconocido, generalmente porque el cálculo de su valor aún no está completo.

El término promesa fue propuesto en 1976 por Daniel P. Friedman y David Wise, [1] y Peter Hibbard lo llamó eventual . [2] Un concepto de futuro algo similar se introdujo en 1977 en un artículo de Henry Baker y Carl Hewitt . [3]

Los términos futuro , promesa , demora y diferido a menudo se usan indistintamente, aunque a continuación se tratan algunas diferencias en el uso entre futuro y promesa . Específicamente, cuando se distingue el uso, un futuro es una vista de marcador de posición de solo lectura de una variable, mientras que una promesa es una asignación única en la que se puede escribir.contenedor que establece el valor del futuro. En particular, un futuro puede definirse sin especificar qué promesa específica establecerá su valor, y diferentes promesas posibles pueden establecer el valor de un futuro determinado, aunque esto solo se puede hacer una vez para un futuro determinado. En otros casos, un futuro y una promesa se crean juntos y se asocian entre sí: el futuro es el valor, la promesa es la función que establece el valor, esencialmente el valor de retorno (futuro) de una función asíncrona (promesa). Establecer el valor de un futuro también se denomina resolverlo , cumplirlo o vincularlo .

Los futuros y las promesas se originaron en la programación funcional y los paradigmas relacionados (como la programación lógica ) para desvincular un valor (un futuro) de cómo se calculaba (una promesa), lo que permitía que el cálculo se hiciera de forma más flexible, en particular al paralelizarlo. Más tarde, encontró uso en la computación distribuida , para reducir la latencia de los viajes de ida y vuelta de la comunicación. Más tarde aún, ganó más uso al permitir escribir programas asincrónicos en estilo directo , en lugar de en estilo de paso de continuación .

El uso de futuros puede ser implícito (cualquier uso del futuro obtiene automáticamente su valor, como si fuera una referencia ordinaria ) o explícito (el usuario debe llamar a una función para obtener el valor, como el getmétodo de java.util.concurrent.Futureen Java ). Obtener el valor de un futuro explícito puede llamarse pinchar o forzar . Los futuros explícitos se pueden implementar como una biblioteca, mientras que los futuros implícitos generalmente se implementan como parte del lenguaje.

El artículo original de Baker y Hewitt describía futuros implícitos, que naturalmente se admiten en el modelo de actor de computación y lenguajes de programación puros orientados a objetos como Smalltalk . El artículo de Friedman y Wise describió solo futuros explícitos, lo que probablemente refleja la dificultad de implementar de manera eficiente futuros implícitos en hardware de stock. La dificultad es que el hardware de stock no se ocupa de futuros para tipos de datos primitivos como los números enteros. Por ejemplo, una instrucción de adición no sabe cómo tratar con . En lenguajes puros de actor u objeto, este problema se puede resolver enviando el mensaje , que le pide al futuro que agregue3 + future factorial(100000)future factorial(100000)+[3]3a sí mismo y devolver el resultado. Tenga en cuenta que el enfoque de paso de mensajes funciona independientemente de cuándo factorial(100000)finalice el cálculo y que no se necesita picar/forzar.