Altre persone hanno applicato il DAG ai dati, ma penso che sia almeno applicabile (se non di più) al codice. Mahbubur R Aaman menziona questo, quindi in realtà questo è più un addendum alla sua risposta che una risposta completa da sola.
Mi viene in mente che qualsiasi programma imperativo di computer privo di loop infiniti (grazie a @AndresF.) È un Directed Acyclic Graph (DAG). Significa che i possibili percorsi di esecuzione del codice sono diretti (prima questo, poi quello) e aciclici (non formano loop infiniti). Sono un grafico perché il percorso attraverso qualsiasi codice significativo è raramente semplice come un elenco o un albero.
Ho lavorato in XSLT per forse 4 anni. Ho avuto un periodo terribile nel tentativo di spiegare perché non fosse un buon linguaggio di programmazione per scopi generali, ma DAG è la ragione. In particolare, XSLT è un linguaggio basato sui dati. Definisci le funzioni (sì, nel senso della programmazione funzionale) ma non le chiami necessariamente dal tuo codice. Piuttosto, XSLT imposta una combinazione di selezione e iterazione attraverso i nodi di un documento XML di input. Ciò consente alla struttura dei dati di input di determinare quali funzioni vengono chiamate e in quale ordine.
Questo è stato molto interessante e interessante fino a quando il tuo programma ha riscontrato una condizione di dati che non hai verificato alle 2:30 del mattino e che hai dovuto svegliarti e risolverlo. Quando si lascia che i dati definiscano il DAG, la definizione del DAG diventa tutte le possibili condizioni di input - che per qualsiasi applicazione aziendale non banale sono al di là incalcolabili; sono inimmaginabili.
All'inizio ho pensato che la programmazione funzionale potrebbe non essere un DAG perché l'ordine di esecuzione a volte non è chiaro o addirittura pensato dal programmatore. Ma un programma funzionale definisce le dipendenze. In effetti, la natura dichiarativa della programmazione funzionale potrebbe essere pensata come definizione delle sole dipendenze (a ^ 2 = b ^ 2 + c ^ 2) senza specificare l'ordine di esecuzione (non importa se 'b' o 'c' sia al primo posto al quadrato , purché siano entrambi quadrati prima di essere sommati).
Ma mentre la programmazione funzionale può essere deliberatamente vaga sull'ordine delle operazioni a un livello dettagliato, è estremamente chiara sulle dipendenze. Queste sono le caratteristiche che lo rendono così suscettibile alla concorrenza. In ogni caso, esiste ancora un grafico dei percorsi attraverso il codice e quel grafico è ancora diretto (le dipendenze devono essere valutate prima delle attività dipendenti), quindi penso che DAG si applichi anche lì.
Bella domanda - grazie per la pubblicazione!