Programmation de flux de données - Dataflow programming

En programmation informatique , la programmation par flux de données est un paradigme de programmation qui modélise un programme sous la forme d'un graphe orienté des données circulant entre les opérations, mettant ainsi en œuvre les principes et l'architecture du flux de données . Les langages de programmation Dataflow partagent certaines fonctionnalités des langages fonctionnels et ont généralement été développés afin d'apporter certains concepts fonctionnels à un langage plus adapté au traitement numérique. Certains auteurs utilisent le terme datastream au lieu de dataflow pour éviter toute confusion avec le dataflow computing ou l' architecture de dataflow , basé sur un paradigme de machine indéterministe. La programmation Dataflow a été lancée par Jack Dennis et ses étudiants diplômés du MIT dans les années 1960.

Propriétés des langages de programmation de flux de données

Traditionnellement, un programme est modélisé comme une série d'opérations se déroulant dans un ordre spécifique ; cela peut être appelé flux de contrôle séquentiel, procédural (indiquant que le programme choisit un chemin spécifique) ou programmation impérative . Le programme se concentre sur les commandes, conformément à la vision de von Neumann de la programmation séquentielle, où les données sont normalement "au repos".

En revanche, la programmation de flux de données met l'accent sur le mouvement des programmes de données et de modèles comme une série de connexions. Des entrées et des sorties explicitement définies connectent des opérations, qui fonctionnent comme des boîtes noires . Une opération s'exécute dès que toutes ses entrées deviennent valides. Ainsi, les langages de flux de données sont intrinsèquement parallèles et peuvent bien fonctionner dans de grands systèmes décentralisés.

État

L'un des concepts clés de la programmation informatique est l'idée d' état , essentiellement un instantané de diverses conditions dans le système. La plupart des langages de programmation nécessitent une quantité considérable d'informations d'état, qui sont généralement cachées au programmeur. Souvent, l'ordinateur lui-même n'a aucune idée de l'élément d'information qui code l'état durable. C'est un problème sérieux, car les informations d'état doivent être partagées entre plusieurs processeurs dans des machines de traitement parallèles . La plupart des langages obligent le programmeur à ajouter du code supplémentaire pour indiquer quelles données et parties du code sont importantes pour l'État. Ce code a tendance à être à la fois coûteux en termes de performances et difficile à lire ou à déboguer. Le parallélisme explicite est l'une des principales raisons des faibles performances des Enterprise Java Beans lors de la création d' applications non OLTP et gourmandes en données .

Là où un programme séquentiel peut être imaginé comme un seul travailleur se déplaçant entre les tâches (opérations), un programme de flux de données ressemble davantage à une série de travailleurs sur une chaîne de montage , chacun effectuant une tâche spécifique chaque fois que des matériaux sont disponibles. Étant donné que les opérations ne concernent que la disponibilité des entrées de données, elles n'ont pas d'état caché à suivre et sont toutes "prêtes" en même temps.

Représentation

Les programmes de flux de données sont représentés de différentes manières. Un programme traditionnel est généralement représenté par une série d'instructions textuelles, ce qui est raisonnable pour décrire un système série qui achemine les données entre de petits outils à usage unique qui reçoivent, traitent et renvoient. Les programmes de flux de données commencent par une entrée, peut-être les paramètres de ligne de commande , et illustrent comment ces données sont utilisées et modifiées. Le flux de données est explicite, souvent illustré visuellement sous la forme d'une ligne ou d'un tuyau.

En termes d'encodage, un programme de flux de données peut être implémenté sous la forme d'une table de hachage , avec des entrées identifiées de manière unique comme clés, utilisées pour rechercher des pointeurs vers les instructions. Lorsqu'une opération est terminée, le programme parcourt la liste des opérations jusqu'à ce qu'il trouve la première opération où toutes les entrées sont actuellement valides, et l'exécute. Lorsque cette opération se termine, elle génère généralement des données, rendant ainsi une autre opération valide.

Pour un fonctionnement en parallèle, seule la liste doit être partagée ; c'est l'état de tout le programme. Ainsi, la tâche de maintenir l'état est supprimée du programmeur et confiée au runtime du langage . Sur les machines avec un seul cœur de processeur où une implémentation conçue pour un fonctionnement parallèle introduirait simplement une surcharge, cette surcharge peut être complètement supprimée en utilisant un environnement d'exécution différent.

Histoire

Un langage de flux de données pionnier était BLODI (BLOck DIagram), développé par John Larry Kelly, Jr. , Carol Lochbaum et Victor A. Vyssotsky pour spécifier les systèmes de données échantillonnés . Une spécification BLODI des unités fonctionnelles (amplificateurs, additionneurs, lignes à retard, etc.) et de leurs interconnexions a été compilée en une seule boucle qui a mis à jour l'ensemble du système pour un coup d'horloge.

Dans un doctorat de 1966. Dans le cadre de sa thèse, The On-line Graphical Specification of Computer Procedures , Bert Sutherland a créé l'un des premiers frameworks de programmation de flux de données graphiques afin de faciliter la programmation parallèle. Les langages de flux de données ultérieurs ont souvent été développés dans les grands laboratoires de superordinateurs . POGOL, un langage de traitement de données par ailleurs conventionnel développé à la NSA , a compilé des applications à grande échelle composées de plusieurs opérations de fichier à fichier, par exemple fusionner, sélectionner, résumer ou transformer, en un code efficace qui éliminait la création ou l'écriture de fichiers intermédiaires. fichiers dans la mesure du possible. SISAL , un langage de flux de données populaire développé au Lawrence Livermore National Laboratory , ressemble à la plupart des langages basés sur des instructions, mais les variables doivent être affectées une seule fois . Cela permet au compilateur d'identifier facilement les entrées et les sorties. Un certain nombre de ramifications de SISAL ont été développées, y compris SAC , Single Assignment C , qui essaie de rester aussi proche que possible du langage de programmation C populaire .

La marine des États-Unis a financé le développement de l'ACOS et du SPGN (notation graphique de traitement du signal) à partir du début des années 1980. Ceci est utilisé sur un certain nombre de plates-formes dans le domaine aujourd'hui.

Un concept plus radical est Prograph , dans lequel les programmes sont construits sous forme de graphiques à l'écran, et les variables sont entièrement remplacées par des lignes reliant les entrées aux sorties. Soit dit en passant, Prograph a été écrit à l'origine sur le Macintosh , qui est resté monoprocesseur jusqu'à l'introduction du DayStar Genesis MP en 1996.

Il existe de nombreuses architectures matérielles orientées vers la mise en œuvre efficace de modèles de programmation de flux de données. L'architecture de flux de données de jetons balisés du MIT a été conçue par Greg Papadopoulos .

Le flux de données a été proposé comme une abstraction pour spécifier le comportement global des composants du système distribué : dans le modèle de programmation d' objets distribués en direct , les flux de données distribués sont utilisés pour stocker et communiquer l'état, et en tant que tels, ils jouent le rôle analogue aux variables, champs , et les paramètres dans les langages de programmation de type Java.

Langues

Les langages de programmation de flux de données incluent :

Interfaces de programmation d'applications

  • Apache Beam : SDK Java/Scala qui unifie le traitement en streaming (et batch) avec plusieurs moteurs d'exécution supportés (Spark, Flink, Google dataflow...)
  • Apache Flink : bibliothèque Java/Scala qui permet d'exécuter des calculs en streaming (et batch) sur un cluster Hadoop (ou autre) distribué
  • SystemC : Bibliothèque pour C++, principalement destinée à la conception matérielle.
  • TensorFlow : Une bibliothèque de machine learning basée sur la programmation de flux de données.

Voir également

Les références

Liens externes