Programação de fluxo de dados

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Na programação de computadores, a programação de fluxo de dados é um paradigma de programação que modela um programa como um gráfico direcionado dos dados que fluem entre as operações, implementando assim os princípios e a arquitetura de fluxo de dados. As linguagens de programação Dataflow compartilham alguns recursos das linguagens funcionais , e geralmente foram desenvolvidas com o objetivo de trazer alguns conceitos funcionais para uma linguagem mais adequada ao processamento numérico. Alguns autores usam o termo fluxo de dados em vez de fluxo de dados para evitar confusão com computação de fluxo de dados ou arquitetura de fluxo de dados, baseado em um paradigma de máquina indeterminístico. A programação de fluxo de dados foi iniciada por Jack Dennis e seus alunos de pós-graduação no MIT na década de 1960.

Propriedades das linguagens de programação de fluxo de dados

Tradicionalmente, um programa é modelado como uma série de operações que ocorrem em uma ordem específica; isso pode ser referido como sequencial, [1] : p.3  procedimental, [2] fluxo de controle [2] (indicando que o programa escolhe um caminho específico) ou programação imperativa . O programa foca em comandos, de acordo com a visão de von Neumann [1] : p.3  de programação sequencial, onde os dados normalmente estão "em repouso". [2] : p.7 

Em contraste, a programação de fluxo de dados enfatiza o movimento de programas de dados e modelos como uma série de conexões. Entradas e saídas explicitamente definidas conectam operações, que funcionam como caixas pretas . [2] : p.2  Uma operação é executada assim que todas as suas entradas se tornam válidas. [3] Assim, as linguagens de fluxo de dados são inerentemente paralelas e podem funcionar bem em sistemas grandes e descentralizados. [1] : p.3  [4] [5]

Estado

Um dos conceitos-chave na programação de computadores é a ideia de estado , essencialmente um instantâneo de várias condições no sistema. A maioria das linguagens de programação requer uma quantidade considerável de informações de estado, que geralmente são ocultadas do programador. Muitas vezes, o próprio computador não tem ideia de qual parte da informação codifica o estado duradouro. Este é um problema sério, pois as informações de estado precisam ser compartilhadas entre vários processadores em máquinas de processamento paralelo . A maioria das linguagens força o programador a adicionar código extra para indicar quais dados e partes do código são importantes para o estado. Esse código tende a ser caro em termos de desempenho e difícil de ler ou depurar. Paralelismo explícitoé uma das principais razões para o baixo desempenho do Enterprise Java Beans ao construir aplicativos não OLTP com uso intenso de dados . [ citação necessária ]

Enquanto um programa sequencial pode ser imaginado como um único trabalhador movendo-se entre tarefas (operações), um programa de fluxo de dados é mais como uma série de trabalhadores em uma linha de montagem , cada um realizando uma tarefa específica sempre que os materiais estão disponíveis. Como as operações se preocupam apenas com a disponibilidade de entradas de dados, elas não têm estado oculto para rastrear e estão todas "prontas" ao mesmo tempo.

Representação

Os programas de fluxo de dados são representados de maneiras diferentes. Um programa tradicional geralmente é representado como uma série de instruções de texto, o que é razoável para descrever um sistema serial que canaliza dados entre pequenas ferramentas de propósito único que recebem, processam e retornam. Os programas de fluxo de dados começam com uma entrada, talvez os parâmetros da linha de comando , e ilustram como esses dados são usados ​​e modificados. O fluxo de dados é explícito, muitas vezes ilustrado visualmente como uma linha ou tubulação.

Em termos de codificação, um programa de fluxo de dados pode ser implementado como uma tabela de hash , com entradas identificadas exclusivamente como chaves, usadas para procurar ponteiros para as instruções. Quando qualquer operação é concluída, o programa varre a lista de operações até encontrar a primeira operação em que todas as entradas são válidas no momento e a executa. Quando essa operação terminar, ela normalmente produzirá dados, tornando assim outra operação válida.

Para operação paralela, apenas a lista precisa ser compartilhada; é o estado de todo o programa. Assim, a tarefa de manter o estado é removida do programador e entregue ao tempo de execução da linguagem . Em máquinas com um único núcleo de processador em que uma implementação projetada para operação paralela simplesmente introduziria sobrecarga, essa sobrecarga pode ser removida completamente usando um tempo de execução diferente.

História

Uma linguagem de fluxo de dados pioneira foi BLODI (BLOck DIagram), desenvolvida por John Larry Kelly, Jr. , Carol Lochbaum e Victor A. Vyssotsky para especificar sistemas de dados amostrados . [6] Uma especificação BLODI de unidades funcionais (amplificadores, somadores, linhas de atraso, etc.) e suas interconexões foi compilada em um único loop que atualizou todo o sistema por um pulso de clock.

Em um doutorado de 1966. tese, The On-line Graphical Specification of Computer Procedures , [7] Bert Sutherland criou um dos primeiros frameworks de programação de fluxo de dados gráficos para tornar a programação paralela mais fácil. As linguagens de fluxo de dados subsequentes eram frequentemente desenvolvidas nos grandes laboratórios de supercomputadores . POGOL, uma linguagem de processamento de dados convencional desenvolvida na NSA , compilou aplicativos em larga escala compostos de várias operações de arquivo para arquivo, por exemplo, mesclar, selecionar, resumir ou transformar em código eficiente que eliminou a criação ou gravação de arquivos intermediários. arquivos na medida do possível. [8] SISAL , uma linguagem de fluxo de dados popular desenvolvida naLawrence Livermore National Laboratory , parece com a maioria das linguagens orientadas a instruções, mas as variáveis ​​devem ser atribuídas uma vez . Isso permite que o compilador identifique facilmente as entradas e saídas. Várias ramificações do SISAL foram desenvolvidas, incluindo SAC , Single Assignment C , que tenta permanecer o mais próximo possível da popular linguagem de programação C.

A Marinha dos Estados Unidos financiou o desenvolvimento de ACOS e SPGN (notação gráfica de processamento de sinal) começando no início de 1980. Isso está em uso em várias plataformas no campo hoje. [9]

Um conceito mais radical é o Prograph , no qual os programas são construídos como gráficos na tela e as variáveis ​​são substituídas inteiramente por linhas que ligam as entradas às saídas. Aliás, Prograph foi originalmente escrito no Macintosh , que permaneceu com um único processador até a introdução do DayStar Genesis MP em 1996.

Existem muitas arquiteturas de hardware orientadas para a implementação eficiente de modelos de programação de fluxo de dados. A arquitetura de fluxo de dados de token marcado do MIT foi projetada por Greg Papadopoulos .

O fluxo de dados foi proposto como uma abstração para especificar o comportamento global dos componentes do sistema distribuído: no modelo de programação de objetos distribuídos ao vivo , os fluxos de dados distribuídos são usados ​​para armazenar e comunicar o estado e, como tal, desempenham o papel análogo às variáveis, campos , e parâmetros em linguagens de programação semelhantes a Java.

Idiomas

As linguagens de programação do Dataflow incluem:

Interfaces de programação de aplicativos

  • Apache Beam : Java/Scala SDK que unifica o processamento de streaming (e batch) com vários mecanismos de execução suportados (Spark, Flink, Google dataflow...)
  • Apache Flink : biblioteca Java/Scala que permite que cálculos de streaming (e lote) sejam executados em um cluster distribuído do Hadoop (ou outro)
  • SystemC : Biblioteca para C++, voltada principalmente para o design de hardware.
  • TensorFlow : uma biblioteca de aprendizado de máquina baseada em programação de fluxo de dados.

Veja também

Referências

  1. ^ a b c Johnston, Wesley M.; JR Paul Hanna; Richard J. Millar (março de 2004). "Avanços em linguagens de programação de fluxo de dados" (PDF) . Pesquisas de Computação ACM . 36 : 1–34. doi : 10.1145/1013208.1013209 . S2CID  5257722 . Recuperado em 15 de agosto de 2013 .
  2. ^ a b c d e Wadge, William W.; Edward A. Ashcroft (1985). Lucid, a linguagem de programação do Dataflow (ed ilustrada). Imprensa da Academia. ISBN 9780127296500. Recuperado em 15 de agosto de 2013 .
  3. ^ a b "Noções básicas de programação de fluxo de dados" . Introdução aos produtos da NI . Corporação Nacional de Instrumentos . Recuperado em 15 de agosto de 2013 .
  4. ^ Harter, Ricardo. "Linguagens e programação de fluxo de dados - Parte I" . O mundo de Richard Harter . Arquivado a partir do original em 8 de dezembro de 2015 . Recuperado em 15 de agosto de 2013 .
  5. ^ "Por que as linguagens de programação Dataflow são ideais para programação de hardware paralelo" . Série de whitepapers de fundamentos de programação multinúcleo . Corporação Nacional de Instrumentos . Recuperado em 15 de agosto de 2013 .
  6. ^ John L. Kelly Jr.; Carol Lochbaum; VA Vyssotsky (1961). "Um compilador de diagrama de blocos". Tecnologia do Sistema Bell. J. _ 40 (3): 669-678. doi : 10.1002/j.1538-7305.1961.tb03236.x .
  7. ^ WR Sutherland (1966). "A Especificação Gráfica On-line de Procedimentos de Computador". MIT. {{cite journal}}:Cite journal requer |journal=( ajuda )
  8. ^ Glória Lambert (1973). "Processamento de arquivo em grande escala: POGOL". POPL '73: Anais do 1º simpósio anual ACM SIGACT-SIGPLAN sobre Princípios de linguagens de programação . ACM . págs. 226-234.
  9. ^ Processamento de dados acústicos subaquáticos, YT Chan

Links externos