Ich habe kürzlich ein Framework namens ecto gefunden .
In diesem Framework gibt es eine Basiskomponente namens "plasm" , die ecto Directed Acyclic Graph ist. In ecto kann das Plasma von ecto scheduler bedient werden.
Ich frage mich, was der Vorteil dieses Mechanismus ist und in welchen anderen Situationen können wir das Konzept der DAG nutzen?
algorithms
data-structures
frameworks
graph
Po-Jen Lai
quelle
quelle
Antworten:
Gute Frage.
EDIT:
Gute Ressourcen:
quelle
Die Antwort ist, dass es nicht viel mit Programmierung zu tun hat. Es hat mit Problemlösung zu tun.
Genauso wie verknüpfte Listen Datenstrukturen sind, die für bestimmte Problemklassen verwendet werden, sind Diagramme nützlich, um bestimmte Beziehungen darzustellen. Verknüpfte Listen, Bäume, Diagramme und andere abstrakte Strukturen haben nur insofern eine Verbindung zur Programmierung, als Sie sie in Code implementieren können. Sie existieren auf einer höheren Abstraktionsebene. Es geht nicht um Programmierung, sondern um die Anwendung von Datenstrukturen bei der Lösung von Problemen.
Wenn Sie dennoch eine Beziehung zur Programmierung haben möchten, beachten Sie bitte folgende Punkte:
quelle
Andere Leute haben DAG auf Daten angewendet, aber ich denke, es ist mindestens genauso anwendbar (wenn nicht mehr) auf Code. Mahbubur R Aaman erwähnt dies, daher ist dies in Wirklichkeit eher ein Nachtrag zu seiner Antwort als eine vollständige Antwort für sich.
Mir fällt ein, dass jedes zwingende Computerprogramm, das frei von Endlosschleifen ist (danke @AndresF.), Ein gerichteter azyklischer Graph (DAG) ist. Dies bedeutet, dass die möglichen Wege zur Ausführung des Codes gerichtet sind (zuerst dies, dann das) und azyklisch (keine Endlosschleifen bilden). Sie sind ein Diagramm, weil der Pfad durch einen signifikanten Code selten so einfach ist wie eine Liste oder ein Baum.
Ich habe vielleicht 4 Jahre in XSLT gearbeitet. Ich hatte eine schreckliche Zeit, um zu erklären, warum es keine gute Allzweck-Programmiersprache war, aber DAG ist der Grund. Insbesondere ist XSLT eine datengetriebene Sprache. Sie definieren Funktionen (ja im Sinne der funktionalen Programmierung), rufen diese Funktionen jedoch nicht unbedingt aus Ihrem Code auf. Vielmehr richtet XSLT eine Kombination aus Auswahl und Iteration der Knoten eines XML-Eingabedokuments ein. Dadurch kann die Struktur der Eingabedaten bestimmen, welche Funktionen in welcher Reihenfolge aufgerufen werden.
Dies war sehr interessant und sehr cool, bis Ihr Programm auf eine Datenbedingung stieß, auf die Sie nicht um 02:30 Uhr testeten und die Sie aufwachen und beheben mussten. Wenn Sie die Daten die DAG definieren lassen, werden aus der Definition der DAG alle möglichen Eingabebedingungen - die für jede nicht triviale Geschäftsanwendung unkalkulierbar sind. sie sind unvorstellbar.
Zuerst dachte ich, dass funktionale Programmierung möglicherweise keine DAG ist, da die Ausführungsreihenfolge manchmal für den Programmierer nicht klar ist oder sogar nicht klar ist. Ein Funktionsprogramm definiert jedoch Abhängigkeiten. Tatsächlich könnte die deklarative Natur der funktionalen Programmierung so verstanden werden, dass sie nur Abhängigkeiten definiert (a ^ 2 = b ^ 2 + c ^ 2), ohne die Ausführungsreihenfolge anzugeben (es spielt keine Rolle, ob 'b' oder 'c' zuerst quadriert wird , solange beide quadratisch sind, bevor sie addiert werden).
Obwohl die Funktionsprogrammierung die Reihenfolge der Operationen auf einer detaillierten Ebene möglicherweise absichtlich vage beschreibt, sind Abhängigkeiten äußerst klar. Dies sind genau die Funktionen, die es so zugänglich machen, dass es gleichzeitig verwendet werden kann. In jedem Fall gibt es immer noch ein Diagramm mit Pfaden durch den Code, und dieses Diagramm ist weiterhin gerichtet (Abhängigkeiten müssen vor abhängigen Tasks ausgewertet werden), sodass ich denke, dass die DAG auch dort gilt.
Schöne Frage - danke fürs posten!
quelle
while (true) { print("hi"); }
? Vielleicht möchten Sie nicht terminierende Programme ausschließen?Derzeit wird die DAG in der Programmierung unterschätzt. Historisch gesehen wurden viele Dinge im Zusammenhang mit der Entwicklung mit Bäumen und Hierarchien gemacht, da es für unser Gehirn praktisch ist, etwas in einer Kiste zu bewegen, um komplexe Dinge einfacher zu verwalten. Aber wenn Sie Ereignisse betrachten und wie sie von anderen Ereignissen und Zuständen abhängen, erhalten Sie DAG, weil alles in unserem Leben und im Programm von irgendetwas in der Vergangenheit abhängen kann, aber nicht in der Zukunft, so dass Sie perfekt "azyklisch" werden. Beziehungen, die für das DAG-Konzept gelten sollen. Obwohl dies in der Entwicklung nur selten explizit verwendet wird, würde es helfen, die Dinge besser zu verstehen, wenn dies berücksichtigt wird
quelle
Mit der DAG können Sie eine Auflistung von Aufgaben in einer Sequenz mit der Einschränkung modellieren, dass bestimmte Aufgaben vor den anderen erledigt werden müssen. Ecto ist ein Verarbeitungsframework und verwendet DAG, um Verarbeitungsdiagramme so zu modellieren, dass die Diagramme eine geordnete synchrone Ausführung ausführen. Plasm in Ecto ist die DAG und Scheduler arbeitet darauf.
quelle
In der Praxis ähnelt unsere Software einer IDE, in der der Endbenutzer eine Reihe von Vorgängen definieren kann, die an einem Bild ausgeführt werden sollen (Machine Vision Inspection). Diese Inspektionen können von anderen Inspektionen abhängig oder von diesen abhängig sein. Da dies alles vom Endbenutzer konfigurierbar ist, können wir zur Entwurfszeit keine Optimierungen für die Parallelverarbeitung vornehmen. Durch die Darstellung dieser Inspektionen und Abhängigkeiten als DAG können wir die Parallelität der Gesamtinspektion optimieren, um eine maximale Leistung zur Laufzeit zu erzielen.
quelle
Nur ein weiteres Beispiel: Die Speicherverwaltungsregeln in Cocoa-Apps sind so festgelegt, dass alle starken Referenzen einen gerichteten azyklischen Graphen bilden, um die Abwesenheit von Lecks zu gewährleisten.
quelle
Hinzufügen einer weiteren Antwort, da noch kein Verweis auf Build-Systeme vorhanden ist,
make
die DAG verwenden, um Abhängigkeiten für das Erstellen herauszufinden.Weitere Details hier
quelle
make