J'ai récemment trouvé un framework nommé ecto .
Dans ce cadre, un composant de base nommé "plasm" , qui est le graphique acyclique dirigé ecto. Dans ecto, le plasma peut être exploité par l'ecto scheduler.
Je me demande quel est l'avantage de ce mécanisme, et dans quelles autres situations peut-on exploiter le concept de DAG?
Belle question.
MODIFIER:
Bonnes ressources:
La réponse est que cela n'a pas grand-chose à voir avec la programmation. Cela a à voir avec la résolution de problèmes.
Tout comme les listes chaînées sont des structures de données utilisées pour certaines classes de problèmes, les graphiques sont utiles pour représenter certaines relations. Les listes, arborescences, graphiques et autres structures abstraites liées ont uniquement une connexion à la programmation dans la mesure où vous pouvez les implémenter dans du code. Ils existent à un niveau d'abstraction plus élevé. Il ne s'agit pas de programmation, il s'agit d'appliquer des structures de données pour résoudre des problèmes.
Si vous voulez toujours une relation avec la programmation, veuillez considérer les points suivants:
D'autres personnes ont appliqué le DAG aux données, mais je pense qu'il est au moins aussi applicable (sinon plus) au code. Mahbubur R Aaman le mentionne, il s'agit donc plus d'un addendum à sa réponse que d'une réponse complète à elle seule.
Il me vient à l'esprit que tout programme informatique impératif qui est exempt de boucles infinies (merci @AndresF.) Est un graphique acyclique dirigé (DAG). Cela signifie que les chemins possibles d'exécution du code sont dirigés (d'abord ceci, puis cela), et acycliques (ne formant pas de boucles infinies). Ils sont un graphique car le chemin à travers un code significatif est rarement aussi simple qu'une liste ou un arbre.
J'ai travaillé dans XSLT pendant peut-être 4 ans. J'ai eu beaucoup de mal à expliquer pourquoi ce n'était pas un bon langage de programmation à usage général, mais DAG en est la raison. Plus précisément, XSLT est un langage piloté par les données. Vous définissez des fonctions (oui, au sens de la programmation fonctionnelle) mais vous n'appelez pas nécessairement ces fonctions à partir de votre code. XSLT définit plutôt une combinaison de sélection et d'itération dans les nœuds d'un document XML d'entrée. Cela permet à la structure des données d'entrée de déterminer quelles fonctions sont appelées et dans quel ordre.
C'était très intéressant et très cool jusqu'à ce que votre programme rencontre une condition de données que vous n'avez pas testée à 2h30 et que vous deviez vous réveiller et la réparer. Lorsque vous laissez les données définir le DAG, la définition du DAG devient toutes les conditions d'entrée possibles - qui, pour toute application métier non triviale, sont incalculables; ils sont inimaginables.
Au début, je pensais que la programmation fonctionnelle n'était peut-être pas un DAG car l'ordre d'exécution n'était parfois pas clair pour le programmeur, ni même envisagé par lui. Mais un programme fonctionnel définit des dépendances. En fait, la nature déclarative de la programmation fonctionnelle pourrait être considérée comme définissant uniquement les dépendances (a ^ 2 = b ^ 2 + c ^ 2) sans spécifier l'ordre d'exécution (peu importe si 'b' ou 'c' est au premier carré , tant qu'ils sont tous les deux au carré avant d'être additionnés).
Mais alors que la programmation fonctionnelle peut être délibérément vague sur l'ordre des opérations à un niveau détaillé, elle est extrêmement claire sur les dépendances. Ce sont ces mêmes caractéristiques qui le rendent si accessible à la concurrence. Dans tous les cas, il y a toujours un graphe de chemins à travers le code, et ce graphe est toujours dirigé (les dépendances doivent être évaluées avant les tâches dépendantes), donc je pense que DAG s'applique là aussi.
Belle question - merci d'avoir posté!
Actuellement, DAG est sous-estimé dans la programmation. Historiquement, beaucoup de choses liées au développement ont été faites avec des arbres et des hiérarchies parce que déplacer quelque chose dans une boîte est pratique pour notre cerveau pour rendre les choses complexes plus faciles à gérer. Mais si vous regardez les événements et comment ils dépendent d'autres événements et états, vous obtiendrez DAG parce que tout dans notre vie et dans le programme peut dépendre de tout dans le passé mais pas dans le futur, vous obtiendrez donc parfaitement "acyclique" relations à appliquer au concept DAG. Bien que cela soit rarement utilisé explicitement dans le développement, avoir cela à l'esprit aiderait à mieux comprendre les choses
Je me demande quel est l'avantage de Plasm dans Ecto ...
DAG peut être utilisé pour modéliser une collection de tâches dans une séquence avec la contrainte que certaines tâches doivent être effectuées avant les autres. Ecto est un framework de traitement et il utilise DAG pour modéliser les graphes de traitement afin que les graphes ordonnent une exécution synchrone. Plasm in Ecto est le DAG et Scheduler fonctionne dessus.
dans quelles autres situations peut-on exploiter le concept de DAG?
À titre d'exemple réel, notre logiciel est similaire à un IDE où l'utilisateur final peut définir une série d'opérations à effectuer sur une image (inspection de vision industrielle). Ces inspections peuvent avoir des dépendances sur d'autres inspections ou dont les inspections peuvent dépendre. Étant donné que tout cela est configurable par l'utilisateur final, nous ne pouvons pas optimiser le traitement parallèle au moment de la conception. En représentant ces inspections et dépendances en tant que DAG, nous pouvons optimiser le parallélisme de l'inspection globale. pour des performances maximales au moment de l'exécution.