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!