En la programación de computadoras , la programación del flujo de datos es un paradigma de programación que modela un programa como un gráfico dirigido de los datos que fluyen entre las operaciones, implementando así los principios y la arquitectura del flujo de datos . Los lenguajes de programación de flujo de datos comparten algunas características de los lenguajes funcionales y, en general, se desarrollaron para llevar 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 del flujo de datos o la arquitectura del flujo de datos., basado en un paradigma de máquina indeterminista. La programación de flujo de datos fue pionera en Jack Dennis y sus estudiantes graduados en el MIT en la década de 1960.
Propiedades de los lenguajes de programación de flujo de datos
Tradicionalmente, un programa se modela como una serie de operaciones que ocurren en un orden específico; esto puede denominarse secuencial, [1] : p.3 procedimental, [2] control de flujo [2] (que indica que el programa elige una ruta específica) o programación imperativa . El programa se centra en los comandos, en línea con la visión de von Neumann [1] : p.3 de la programación secuencial, donde los datos normalmente están "en reposo". [2] : pág.7
En contraste, la programación de flujo de datos enfatiza el movimiento de datos y modela programas como una serie de conexiones. Las entradas y salidas explícitamente definidas conectan operaciones, que funcionan como cajas negras . [2] : p.2 Una operación se ejecuta tan pronto como todas sus entradas se vuelven válidas. [3] Por lo tanto, los lenguajes de flujo de datos son inherentemente paralelos y pueden funcionar bien en sistemas grandes y descentralizados. [1] : p.3 [4] [5]
Expresar
Uno de los conceptos clave en la programación de computadoras es la idea de estado , esencialmente una instantánea de varias condiciones en el sistema. La mayoría de los lenguajes de programación requieren una cantidad considerable de información de estado, que generalmente está oculta al programador. A menudo, la computadora en sí no tiene idea de qué información codifica el estado duradero. Este es un problema grave, ya que la información de estado debe compartirse entre varios procesadores en máquinas de procesamiento en paralelo . La mayoría de los lenguajes obligan al programador a agregar código adicional para indicar qué datos y partes del código son importantes para el estado. Este código tiende a ser caro en términos de rendimiento y difícil de leer o depurar. El paralelismo explícito es una de las principales razones del bajo rendimiento de los Enterprise Java Beans al crear aplicaciones no OLTP con un uso intensivo de datos . [ cita requerida ]
Donde un programa secuencial se puede imaginar como un solo trabajador moviéndose entre tareas (operaciones), un programa de flujo de datos es más como una serie de trabajadores en una línea de ensamblaje , cada uno haciendo una tarea específica cuando hay materiales disponibles. Dado que las operaciones solo se refieren a la disponibilidad de entradas de datos, no tienen un estado oculto para rastrear y están todas "listas" al mismo tiempo.
Representación
Los programas de flujo de datos se representan de diferentes formas. Un programa tradicional generalmente se representa como una serie de instrucciones de texto, lo cual es razonable para describir un sistema en serie que canaliza datos entre pequeñas herramientas de un solo propósito que reciben, procesan y devuelven. Los programas de flujo de datos comienzan con una entrada, tal vez 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, a menudo ilustrado visualmente como 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 , con entradas identificadas de forma única como claves, utilizadas para buscar punteros a las instrucciones. Cuando se completa cualquier operación, el programa escanea la lista de operaciones hasta que encuentra la primera operación donde todas las entradas son válidas actualmente y la ejecuta. Cuando esa operación finaliza, normalmente generará datos, lo que hará que otra operación sea válida.
Para el funcionamiento en paralelo, solo es necesario compartir la lista; es el estado de todo el programa. Por lo tanto, la tarea de mantener el estado se elimina del programador y se asigna al tiempo de ejecución del lenguaje . En máquinas con un solo núcleo de procesador donde una implementación diseñada para operación en paralelo simplemente introduciría sobrecarga, esta sobrecarga se puede eliminar por completo utilizando un tiempo de ejecución diferente.
Historia
Un lenguaje de flujo de datos pionero fue BLODI (BLOck DIagram), desarrollado por John Larry Kelly, Jr. , Carol Lochbaum y Victor A. Vyssotsky para especificar sistemas de datos muestreados . [6] Se compiló una especificación BLODI de unidades funcionales (amplificadores, sumadores, líneas de retardo, etc.) y sus interconexiones en un solo bucle que actualizaba todo el sistema para un tic del reloj.
En un doctorado de 1966. tesis, La especificación gráfica en línea de procedimientos informáticos , [7] 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 se desarrollaron a menudo en los grandes laboratorios de supercomputadoras . POGOL, un lenguaje de procesamiento de datos convencional desarrollado en la NSA , compiló aplicaciones a gran escala compuestas por múltiples operaciones de archivo a archivo, por ejemplo, fusionar, seleccionar, resumir o transformar en un código eficiente que eliminó la creación o escritura en intermedios. archivos en la mayor medida posible. [8] SISAL , un lenguaje de flujo de datos popular desarrollado en el Laboratorio Nacional Lawrence Livermore , se parece a la mayoría de los lenguajes basados en declaraciones, pero las variables deben asignarse una vez . Esto permite al compilador identificar fácilmente las entradas y salidas. Un número de vástagos de sisal se han desarrollado, incluyendo SAC , asignación individual C , que trata de mantenerse lo más cerca posible del popular lenguaje de programación C como sea posible.
La Marina de los Estados Unidos financió el desarrollo de ACOS y SPGN (notación gráfica de procesamiento de señales) a partir de principios de la década de 1980. En la actualidad, se utiliza en varias plataformas sobre el terreno. [9]
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 vinculan las entradas con las salidas. Por cierto, Prograph se escribió originalmente en Macintosh , que siguió siendo de un solo procesador hasta la introducción del DayStar Genesis MP en 1996.
Existen muchas 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 tokens etiquetados 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 del sistema distribuido: en el modelo de programación de objetos distribuidos en vivo , los flujos de datos distribuidos se utilizan para almacenar y comunicar el estado y, como tales, desempeñan un papel análogo a las variables, los campos y parámetros en lenguajes de programación similares a Java.
Idiomas
Los lenguajes de programación de flujo de datos incluyen:
- ASCET
- Lenguaje de scripting AviSynth , para procesamiento de video
- Máquina de flujo de datos modular binario BMDFM
- CALIFORNIA
- Cuneiforme , un lenguaje de flujo de trabajo funcional .
- Canalizaciones de CMS
- Hume
- Joule
- Keysight VEE
- KNIME es una plataforma de análisis, informes e integración de datos de código abierto y gratuita
- LabVIEW , G [3]
- linda
- Lúcido [2]
- Lustre
- Max / MSP
- Lenguaje de programación visual de Microsoft : un componente de Microsoft Robotics Studio diseñado para la programación robótica
- Naranja : una herramienta de programación visual de código abierto para la minería de datos , el análisis de datos estadísticos y el aprendizaje automático .
- Oz ahora también se distribuye desde 1.4.0
- Piloto de oleoductos
- Prograph
- Datos puros
- Quartz Composer : diseñado por Apple ; utilizado para animaciones gráficas y efectos
- SAC Asignación única C
- SIGNAL (un lenguaje síncrono orientado al flujo de datos que permite especificaciones de múltiples relojes)
- 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
- VHDL : un lenguaje de descripción de hardware
- Entorno de ingeniería XML XEE (Starlight)
- XProc
Interfaces de programación de aplicaciones
- Apache Beam : Java / Scala SDK que unifica el procesamiento de transmisión (y por lotes) con varios motores de ejecución compatibles (Spark, Flink, flujo de datos de Google ...)
- Apache Flink : biblioteca Java / Scala que permite ejecutar cálculos de transmisión (y por lotes) sobre un clúster distribuido de Hadoop (u otro)
- SystemC : Librería para C ++, principalmente orientada al diseño de hardware.
- TensorFlow : una biblioteca de aprendizaje automático basada en la programación del flujo de datos.
Ver también
- Modelo de actor
- Programación basada en datos
- Procesamiento de señales digitales
- Programación impulsada por eventos
- Programación basada en flujo
- Programación funcional reactiva
- Glosario de informática reconfigurable
- Computación reconfigurable de alto rendimiento
- Computación incremental
- Modelo de programación paralela
- Espacio de direcciones global particionado
- Canalización (Unix)
- Circuito cuántico
- Programación de señales
- Procesamiento de flujo
- Yahoo Pipes
Referencias
- ^ a b c Johnston, Wesley M .; JR Paul Hanna; Richard J. Millar (marzo de 2004). "Avances en lenguajes de programación de flujo de datos" (PDF) . Encuestas de computación ACM . 36 : 1–34. doi : 10.1145 / 1013208.1013209 . Consultado el 15 de agosto de 2013 .
- ^ a b c d e Wadge, William W .; Edward A. Ashcroft (1985). Lucid, el lenguaje de programación de flujo de datos (edición ilustrada). Academia Press. ISBN 9780127296500. Consultado el 15 de agosto de 2013 .
- ^ a b "Conceptos básicos de programación de flujo de datos" . Introducción a los productos de NI . Corporación Nacional de Instrumentos . Consultado el 15 de agosto de 2013 .
- ^ Harter, Richard. "Lenguajes y programación de Data Flow - Parte I" . El mundo de Richard Harter . Archivado desde el original el 8 de diciembre de 2015 . Consultado 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 básicos de programación multinúcleo . Corporación Nacional de Instrumentos . Consultado el 15 de agosto de 2013 .
- ^ John L. Kelly Jr .; Carol Lochbaum; VA Vyssotsky (1961). "Un compilador de diagrama de bloques". Bell System Tech. J . 40 (3): 669–678. doi : 10.1002 / j.1538-7305.1961.tb03236.x .
- ^ WR Sutherland (1966). "La especificación gráfica en línea de los procedimientos informáticos". MIT. Cite journal requiere
|journal=
( ayuda ) - ^ Gloria Lambert (1973). "Procesamiento de archivos a gran escala: POGOL". POPL '73: Actas del 1er 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 la programación de flujo de datos en F # y C #
- Programación de flujo de datos: concepto, lenguajes y aplicaciones
- Programación estática de programas de flujo de datos síncronos para el procesamiento de señales digitales
- Manejo de cargas enormes sin agregar complejidad Los conceptos básicos de la programación del flujo de datos, Dr. Dobb's, septiembre de 2011
- El flujo de datos de canalización de función pura