En programación informática , la programación de flujo de datos es un paradigma de programación que modela un programa como un grafo dirigido de los datos que fluyen entre operaciones, implementando así los principios y la arquitectura del flujo de datos . [ 1 ] Los lenguajes de programación de flujo de datos comparten algunas características de los lenguajes funcionales y, en general, se desarrollaron para incorporar algunos conceptos funcionales a un lenguaje más adecuado para el procesamiento numérico. Algunos autores utilizan el término flujo de datos en lugar de flujo de datos para evitar confusiones con la computación de flujo de datos o la arquitectura de flujo de datos , basadas en un paradigma de máquina indeterminista. La programación de flujo de datos fue iniciada por Jack Dennis y sus estudiantes de posgrado en el MIT en la década de 1960.
Consideraciones
Tradicionalmente, un programa se modela como una serie de operaciones que ocurren en un orden específico; esto puede denominarse secuencial, [ 2 ] : p.3 procedimental, [ 3 ] de flujo de control [ 3 ] (que indica que el programa elige una ruta específica) o programación imperativa . El programa se centra en comandos, en línea con la visión de von Neumann [ 2 ] : p.3 de la programación secuencial, donde los datos normalmente están "en reposo". [ 3 ] : p.7
En contraste, la programación de flujo de datos enfatiza el movimiento de datos y modela los programas como una serie de conexiones. Las entradas y salidas definidas explícitamente conectan operaciones, que funcionan como cajas negras . [ 3 ] : p.2 Una operación se ejecuta tan pronto como todas sus entradas se vuelven válidas. [ 4 ] Por lo tanto, los lenguajes de flujo de datos son inherentemente paralelos y pueden funcionar bien en sistemas grandes y descentralizados. [ 2 ] : p.3 [ 5 ] [ 6 ]
Estado
Uno de los conceptos clave en la programación informática es el estado , que representa una instantánea de las distintas condiciones del sistema. La mayoría de los lenguajes de programación requieren una cantidad considerable de información de estado, que generalmente permanece oculta para el programador. A menudo, el propio ordenador desconoce qué información codifica el estado permanente. Esto supone un grave problema, ya que la información de estado debe compartirse entre múltiples procesadores en máquinas de procesamiento paralelo . La mayoría de los lenguajes obligan al programador a añadir código adicional para indicar qué datos y partes del código son importantes para el estado. Este código suele ser costoso en términos de rendimiento, además de difícil de leer y depurar. El paralelismo explícito es una de las principales razones del bajo rendimiento de los Enterprise Java Beans al crear aplicaciones intensivas en datos que no son OLTP .
Mientras que un programa secuencial puede imaginarse como un único trabajador que se mueve entre tareas (operaciones), un programa de flujo de datos se asemeja más a una serie de trabajadores en una cadena de montaje , cada uno realizando una tarea específica cuando hay materiales disponibles. Dado que las operaciones solo se ocupan de la disponibilidad de los datos de entrada, no tienen un estado oculto que controlar y todas están "listas" al mismo tiempo.
Representación
Los programas de flujo de datos se representan de diferentes maneras. Un programa tradicional suele representarse como una serie de instrucciones de texto, lo cual es adecuado para describir un sistema serial que transmite datos entre pequeñas herramientas de propósito específico que reciben, procesan y devuelven información. Los programas de flujo de datos comienzan con una entrada, por ejemplo, los parámetros de la línea de comandos , e ilustran cómo se utilizan y modifican esos datos. El flujo de datos es explícito y a menudo se representa visualmente mediante una línea o tubería.
En términos de codificación, un programa de flujo de datos podría implementarse como una tabla hash , donde las entradas, identificadas de forma única, actúan como claves para buscar punteros a las instrucciones. Cuando una operación finaliza, el programa recorre la lista de operaciones hasta encontrar la primera en la que todas las entradas son válidas y la ejecuta. Al finalizar dicha operación, normalmente genera datos, lo que permite que otra operación sea válida.
Para el funcionamiento en paralelo, solo es necesario compartir la lista, que representa el estado de todo el programa. De esta forma, la tarea de mantener el estado se libera del programador y se delega al entorno de ejecución del lenguaje . En máquinas con un solo núcleo de procesador, donde una implementación diseñada para el funcionamiento en paralelo simplemente generaría sobrecarga, esta puede eliminarse por completo utilizando un entorno de ejecución diferente.
Actualizaciones incrementales
Algunas bibliotecas de flujo de datos recientes, como Differential / Timely Dataflow, han utilizado computación incremental para un procesamiento de datos mucho más eficiente. [ 1 ] [ 7 ] [ 8 ]
Historia
Un lenguaje pionero de flujo de datos fue BLOck DIagram ( BLODI ), publicado en 1961 por John Larry Kelly, Jr. , Carol Lochbaum y Victor A. Vyssotsky para especificar sistemas de datos muestreados . [ 9 ] Una especificación BLODI de unidades funcionales (amplificadores, sumadores, líneas de retardo, etc.) y sus interconexiones se compiló en un solo bucle que actualizaba todo el sistema durante un ciclo de reloj.
En una tesis doctoral de 1966, The On-line Graphical Specification of Computer Procedures , [ 10 ] Bert Sutherland creó uno de los primeros marcos de programación de flujo de datos gráficos para facilitar la programación paralela. Los lenguajes de flujo de datos posteriores a menudo se desarrollaron en los grandes laboratorios de supercomputación . POGOL, un lenguaje de procesamiento de datos convencional desarrollado en la NSA , compilaba aplicaciones a gran escala compuestas por múltiples operaciones de archivo a archivo, por ejemplo, fusionar, seleccionar, resumir o transformar, en código eficiente que eliminaba la creación o escritura en archivos intermedios en la mayor medida posible. [ 11 ] SISAL , un popular lenguaje de flujo de datos desarrollado en el Laboratorio Nacional Lawrence Livermore , se parece a la mayoría de los lenguajes orientados a sentencias, pero las variables deben asignarse una sola vez . Esto permite al compilador identificar fácilmente las entradas y salidas. Se han desarrollado varias ramificaciones de SISAL, incluido SAC , Single Assignment C , que intenta mantenerse lo más cerca posible del popular lenguaje de programación C.
La Armada de los Estados Unidos financió el desarrollo de la notación gráfica para el procesamiento de señales (SPGN) y ACOS a partir de principios de la década de 1980. Actualmente se utiliza en varias plataformas en el campo. [ 12 ]
Un concepto más radical es Prograph , en el que los programas se construyen como gráficos en pantalla y las variables se reemplazan por completo con líneas que conectan las entradas con las salidas. Prograph se escribió originalmente para Macintosh , que siguió siendo de un solo procesador hasta la introducción del DayStar Genesis MP en 1996.
Existen numerosas arquitecturas de hardware orientadas a la implementación eficiente de modelos de programación de flujo de datos. La arquitectura de flujo de datos de token etiquetado del MIT fue diseñada por Greg Papadopoulos .
El flujo de datos se ha propuesto como una abstracción para especificar el comportamiento global de los componentes de sistemas distribuidos: en el modelo de programación de objetos distribuidos en tiempo real , los flujos de datos distribuidos se utilizan para almacenar y comunicar el estado y, como tales, desempeñan un papel análogo al de las variables, los campos y los parámetros en los lenguajes de programación tipo Java .
Idiomas
Los lenguajes de programación de flujo de datos incluyen:
- Céu (lenguaje de programación)
- ASCET
- Lenguaje de scripting AviSynth , para procesamiento de vídeo.
- Máquina de flujo de datos modular binaria (BMDFM)
- CALIFORNIA
- Cuneiforme , un lenguaje de flujo de trabajo funcional
- Tuberías de CMS
- Hume
- Joule
- Keysight VEE
- KNIME es una plataforma gratuita y de código abierto para análisis, generación de informes e integración de datos.
- LabVIEW , G [ 4 ]
- Linda
- Lúcido [ 3 ]
- Lustre
- Máximo/MSP
- Lenguaje de programación visual de Microsoft : un componente de Microsoft Robotics Studio diseñado para la programación de robots.
- N8n
- Nextflow : un lenguaje de flujo de trabajo
- Orange : una herramienta de programación visual de código abierto para minería de datos , análisis estadístico de datos y aprendizaje automático.
- Oz ahora también se distribuye desde la versión 1.4.0.
- Proyecto piloto de oleoducto
- Prografía
- Datos puros
- Quartz Composer – Diseñado por Apple ; utilizado para animaciones y efectos gráficos.
- Asignación Única C (SAC)
- SIGNAL : lenguaje síncrono orientado al flujo de datos que permite especificaciones multireloj.
- Simulink
- SISAL
- SystemVerilog : un lenguaje de descripción de hardware
- Verilog : un lenguaje de descripción de hardware incorporado al estándar SystemVerilog en 2009.
- VisSim : un lenguaje de diagramas de bloques para la simulación de sistemas dinámicos y la generación automática de firmware.
- VHDL – lenguaje de descripción de hardware
- Wapice IOT-TICKET implementa un lenguaje de programación de flujo de datos visual sin nombre para el análisis y la generación de informes de datos de IoT.
- Entorno de ingeniería XML XEE (Starlight)
- XProc
Bibliotecas
- Apache Beam : SDK de Java/Scala que unifica el procesamiento en tiempo real (y por lotes) con soporte para varios motores de ejecución (Apache Spark, Apache Flink, Google Dataflow, etc.).
- Apache Flink : biblioteca Java/Scala que permite ejecutar cálculos en tiempo real (y por lotes) sobre un clúster distribuido de Hadoop (u otro).
- Apache Spark
- SystemC : Biblioteca para C++, principalmente orientada al diseño de hardware.
- TensorFlow : Una biblioteca de aprendizaje automático basada en la programación de flujo de datos.
Véase también
- Actor y modelo
- Programación basada en datos
- Procesamiento digital de señales
- Programación basada en eventos
- Programación basada en flujo
- Programación reactiva funcional
- Glosario de computación reconfigurable
- Computación reconfigurable de alto rendimiento
- computación incremental
- Modelo de programación paralela
- Espacio de direcciones global particionado
- Tubería (Unix)
- Circuito cuántico
- Señales y ranuras : una construcción del lenguaje en el framework Qt.
- Procesamiento de flujos
- Tuberías de Yahoo
Referencias
- 1 2 Schwarzkopf, Malte (7 de marzo de 2020). "La notable utilidad de la computación de flujo de datos" . ACM SIGOPS . Recuperado el 31 de julio de 2022 .
- 1 2 3 Johnston, Wesley M.; JR Paul Hanna; Richard J. Millar (marzo de 2004). "Avances en lenguajes de programación de flujo de datos" (PDF) . ACM Computing Surveys . 36 : 1–34 . doi : 10.1145/1013208.1013209 . S2CID 5257722. Recuperado el 15 de agosto de 2013 .
- 1 2 3 4 5 Wadge, William W.; Edward A. Ashcroft (1985). Lucid, el lenguaje de programación de flujo de datos ( edición ilustrada). Academia Press. ISBN 9780127296500Consultado el 15 de agosto de 2013 .
- 1 2 "Conceptos básicos de programación de flujo de datos" . Introducción a los productos de NI . National Instruments Corporation . Consultado el 15 de agosto de 2013 .
- ↑ Harter, Richard. "Lenguajes y programación de flujo de datos - Parte I" . Richard Harter's World . Archivado del original el 8 de diciembre de 2015. Recuperado el 15 de agosto de 2013 .
- ↑ "Por qué los lenguajes de programación de flujo de datos son ideales para programar hardware paralelo" . Serie de documentos técnicos sobre fundamentos de programación multinúcleo . National Instruments Corporation . Consultado el 15 de agosto de 2013 .
- ↑ McSherry, Frank; Murray, Derek; Isaacs, Rebecca; Isard, Michael (5 de enero de 2013). "Flujo de datos diferencial" . Microsoft . Recuperado el 31 de julio de 2022 .
- ↑ "Flujo de datos diferencial" . Flujo de datos oportuno. 30 de julio de 2022. Consultado el 31 de julio de 2022 .
- ↑ John L. Kelly Jr.; Carol Lochbaum; VA Vyssotsky (1961). "Un compilador de diagramas de bloques". Bell System Tech. J. 40 ( 3): 669– 678. Bibcode : 1961BSTJ...40..669K . doi : 10.1002/j.1538-7305.1961.tb03236.x .
- ↑ Sutherland, William Robert (enero de 1966). La especificación gráfica en línea de procedimientos informáticos (tesis doctoral). MIT . hdl : 1721.1/13474 . Consultado el 25 de agosto de 2022 .
- ↑ Gloria Lambert (1973). "Procesamiento de archivos a gran escala: POGOL". POPL '73: Actas del primer simposio anual ACM SIGACT-SIGPLAN sobre principios de lenguajes de programación . ACM . págs. 226–234 .
- ↑ Procesamiento de datos acústicos subacuáticos, YT Chan
Enlaces externos
- Libro: Flujo de datos y sistemas de programación reactiva
- Conceptos básicos de programación de flujo de datos en F# y C#
- Programación de flujo de datos: conceptos, lenguajes y aplicaciones
- Planificación estática de programas de flujo de datos síncronos para el procesamiento digital de señales.
- Manejo de grandes cargas sin añadir complejidad: Los conceptos básicos de la programación de flujo de datos, Dr. Dobb's, septiembre de 2011.
- Lenguajes de programación concurrentes
- paradigmas de programación