stringtranslate.com

Computación incremental

La computación incremental , también conocida como cómputo incremental , es una característica del software que, siempre que cambia un dato , intenta ahorrar tiempo recalculando solo aquellas salidas que dependen de los datos modificados. [1] [2] [3] Cuando la computación incremental tiene éxito, puede ser significativamente más rápida que calcular nuevas salidas de manera ingenua. Por ejemplo, un paquete de software de hojas de cálculo podría usar computación incremental en sus características de recálculo, para actualizar solo aquellas celdas que contienen fórmulas que dependen (directa o indirectamente) de las celdas modificadas.

Cuando la computación incremental se implementa mediante una herramienta que puede implementarla para una variedad de diferentes piezas de código de manera automática, esa herramienta es un ejemplo de una herramienta de análisis de programas para optimización .

La computación incremental proporciona un medio para calcular un nuevo par de entrada/salida (I2, O2), basado en un par de entrada/salida anterior (I1, O1). La técnica clave está representada por una función ΔP, que relaciona los cambios en la entrada con los cambios en la salida.
La computación incremental deriva un nuevo par de entrada/salida a partir de una o más relaciones de entrada/salida antiguas. Para ello, ΔP debe relacionar un cambio en la entrada con un cambio en la salida. El consumidor del resultado puede estar interesado en la salida completa actualizada, o en la salida delta, o en ambas.

Estático versus dinámico

Las técnicas de computación incremental se pueden dividir en dos tipos de enfoques:

Los enfoques estáticos intentan derivar un programa incremental a partir de un programa convencional P mediante, por ejemplo, diseño y refactorización manuales o transformaciones automáticas del programa. Estas transformaciones del programa se producen antes de que se proporcionen entradas o cambios de entrada.

Los enfoques dinámicos registran información sobre la ejecución del programa P en una entrada particular (I1) y utilizan esta información cuando la entrada cambia (a I2) para actualizar la salida (de O1 a O2). La figura muestra la relación entre el programa P, la función de cálculo de cambio ΔP, que constituye el núcleo del programa incremental, y un par de entradas y salidas, I1, O1 e I2, O2.

Enfoques especializados versus enfoques de propósito general

Algunos enfoques de computación incremental son especializados, mientras que otros son de propósito general. Los enfoques especializados requieren que el programador especifique explícitamente los algoritmos y las estructuras de datos que se utilizarán para preservar los subcálculos sin cambios. Los enfoques de propósito general, por otro lado, utilizan técnicas de lenguaje, compilador o algorítmicas para dar un comportamiento incremental a programas que de otro modo no serían incrementales. [4]

Métodos estáticos

Derivados del programa

Dado un cálculo y un cambio potencial , podemos insertar código antes de que se produzca el cambio (la prederivada) y después del cambio (la postderivada) para actualizar el valor de más rápido que si se vuelve a ejecutar . Paige ha escrito una lista de reglas para la diferenciación formal de programas en SUBSETL. [5]

Ver mantenimiento

En sistemas de bases de datos como DBToaster, las vistas se definen con álgebra relacional. El mantenimiento incremental de la vista analiza estáticamente el álgebra relacional para crear reglas de actualización que mantienen rápidamente la vista en presencia de pequeñas actualizaciones, como la inserción de una fila. [6]

Métodos dinámicos

El cálculo incremental se puede lograr mediante la construcción de un gráfico de dependencia de todos los elementos de datos que pueden necesitar ser recalculados y sus dependencias. Los elementos que necesitan ser actualizados cuando un solo elemento cambia están dados por el cierre transitivo de la relación de dependencia del gráfico. En otras palabras, si hay una ruta desde el elemento modificado a otro elemento, este último puede ser actualizado (dependiendo de si el cambio finalmente alcanza al elemento). El gráfico de dependencia puede necesitar ser actualizado a medida que cambian las dependencias, o a medida que se agregan o eliminan elementos del sistema. Lo utiliza internamente la implementación y, por lo general, no necesita ser mostrado al usuario.

La captura de dependencias entre todos los valores posibles se puede evitar identificando un subconjunto de valores importantes (por ejemplo, resultados de agregación) entre los cuales se pueden rastrear las dependencias y recalculando de manera incremental otras variables dependientes, equilibrando así la cantidad de información de dependencia a rastrear con la cantidad de recálculo a realizar ante un cambio de entrada. [7]

La evaluación parcial puede considerarse un método para automatizar el caso más simple posible de computación incremental, en el que se intenta dividir los datos del programa en dos categorías: los que pueden variar en función de la entrada del programa y los que no pueden (y la unidad de cambio más pequeña es simplemente "todos los datos que pueden variar"). La evaluación parcial puede combinarse con otras técnicas de computación incremental.

En el caso de los ciclos en el gráfico de dependencia, una sola pasada por el gráfico puede no ser suficiente para alcanzar un punto fijo. En algunos casos, la reevaluación completa de un sistema es semánticamente equivalente a la evaluación incremental y puede ser más eficiente en la práctica, si no en la teoría. [8]

Sistemas existentes

Compilador y soporte de lenguaje

Marcos y bibliotecas

Aplicaciones

Véase también

Referencias

  1. ^ Carlsson, Magnus (2002). "Mónadas para computación incremental". Actas de la séptima conferencia internacional ACM SIGPLAN sobre programación funcional . Nueva York: ACM . págs. 26–35. doi :10.1145/581478.581482. ISBN. 1-58113-487-8.
  2. ^ Umut A. Acar (2005). Computación autoajustable (PDF) (tesis doctoral).
  3. ^ Camil Demetrescu; Irene Finocchi; Andrea Ribichini (2011). "Programación imperativa reactiva con restricciones de flujo de datos". Actas de la 26.ª Conferencia internacional de la ACM sobre lenguajes y aplicaciones de sistemas de programación orientados a objetos (OOPSLA 2011) . ACM . pp. 407–426. arXiv : 1104.2293 . doi :10.1145/2048066.2048100. ISBN . 978-1-4503-0940-0.
  4. ^ Yan Chen; Joshua Dunfield; Matthew A. Hammer; Umut A. Acar. Cálculo autoajustable implícito para programas puramente funcionales. ICFP '11. págs. 129–141. Archivado desde el original el 2016-10-30 . Consultado el 2018-03-12 .
  5. ^ Paige, Robert (1981). Diferenciación formal: una técnica de síntesis de programas . UMI Research Press. ISBN 978-0-8357-1213-2.
  6. ^ Ahmad, Yanif; Kennedy, Oliver; Koch, Christoph; Nikolic, Milos (1 de junio de 2012). "DBToaster: procesamiento delta de orden superior para vistas dinámicas y frecuentemente actualizadas". Proc. VLDB Endowment . 5 (10): 968–979. arXiv : 1207.0137 . doi :10.14778/2336664.2336670. ISSN  2150-8097.
  7. ^ Mugilan Mariappan; Keval Vora (2019). "GraphBolt: procesamiento sincrónico basado en dependencias de gráficos en streaming". En la Conferencia Europea sobre Sistemas Informáticos (EuroSys'19) . págs. 25:1–25:16. doi :10.1145/3302424.3303974.
  8. ^ Kimberley Burchett; Gregory H. Cooper; Shriram Krishnamurthi (2007). "Lowering: Una técnica de optimización estática para la reactividad funcional transparente". En Simposio ACM SIGPLAN sobre evaluación parcial y manipulación de programas basada en semántica . pp. 71–80. CiteSeerX 10.1.1.90.5866 . ISBN.  978-1-59593-620-2.
  9. ^ Hammer, Matthew A.; Acar, Umut A.; Chen, Yan (2009). "CEAL". Actas de la conferencia ACM SIGPLAN de 2009 sobre diseño e implementación de lenguajes de programación - PLDI '09 . p. 25. doi :10.1145/1542476.1542480. ISBN 9781605583921.S2CID11058228  .​
  10. ^ Reps, Thomas; Teitelbaum, Tim (1984). "El generador de sintetizadores". Actas del primer simposio de ingeniería de software ACM SIGSOFT/SIGPLAN sobre entornos prácticos de desarrollo de software - SDE 1 . págs. 42–48. doi :10.1145/800020.808247. ISBN 978-0897911313.
  11. ^ "Adapton: abstracciones de lenguajes de programación para computación incremental". adapton.org . Consultado el 7 de octubre de 2016 .
  12. ^ Saha, Diptikalyan; Ramakrishnan, CR (2005). "Evaluación incremental de Prolog en tablas: más allá de los programas de lógica pura". Aspectos prácticos de los lenguajes declarativos . Apuntes de clase en informática. Vol. 3819. págs. 215–229. CiteSeerX 10.1.1.111.7484 . doi :10.1007/11603023_15. ISBN .  978-3-540-30947-5. ISSN  0302-9743.
  13. ^ Hammer, Matthew; Phang, Khoo; Hicks, Michael; Foster, Jeffrey (2014). ADAPTON: Composable, computación incremental basada en la demanda (PDF) . PLDI.