Outras pessoas aplicaram o DAG aos dados, mas acho que é pelo menos tão aplicável (se não mais) ao código. Mahbubur R Aaman menciona isso, então realmente isso é mais um adendo à sua resposta do que uma resposta completa por si só.
Ocorre-me que qualquer programa de computador obrigatório que esteja livre de loops infinitos (obrigado @AndresF.) É um gráfico acíclico direcionado (DAG). Significando que os possíveis caminhos de execução do código são direcionados (primeiro isso, depois aquilo) e acíclicos (não formando loops infinitos). Eles são um gráfico porque o caminho através de qualquer código significativo raramente é tão simples quanto uma lista ou uma árvore.
Trabalhei em XSLT por talvez 4 anos. Eu tive um tempo terrível tentando explicar por que não era uma boa linguagem de programação de uso geral, mas o DAG é o motivo. Especificamente, XSLT é uma linguagem orientada a dados. Você define funções (sim, no sentido de programação funcional), mas não necessariamente as chama no seu código. Em vez disso, o XSLT configura uma combinação de seleção e iteração através dos nós de um documento XML de entrada. Isso permite que a estrutura dos dados de entrada determine quais funções são chamadas e em que ordem.
Isso foi muito interessante e interessante até que seu programa encontrou uma condição de dados que você não testou às 2:30 da manhã e teve que acordar e corrigi-lo. Quando você deixa os dados definirem o DAG, a definição do DAG se torna todas as condições de entrada possíveis - o que para qualquer aplicativo de negócios não trivial está além de incalculável; eles são inimagináveis.
No começo, eu pensei que a programação funcional pode não ser um DAG, porque a ordem de execução às vezes não é clara ou até é pensada pelo programador. Mas um programa funcional define dependências. De fato, a natureza declarativa da programação funcional pode ser considerada como definindo apenas dependências (a ^ 2 = b ^ 2 + c ^ 2) sem especificar a ordem de execução (não importa se 'b' ou 'c' é quadrado primeiro , desde que os dois sejam ao quadrado antes de serem adicionados juntos).
Mas, embora a programação funcional possa ser deliberadamente vaga sobre a ordem das operações em um nível detalhado, é extremamente clara sobre as dependências. Esses são os próprios recursos que o tornam tão favorável à concorrência. De qualquer forma, ainda existe um gráfico de caminhos através do código, e esse gráfico ainda é direcionado (as dependências devem ser avaliadas antes das tarefas dependentes), então acho que o DAG se aplica a ele também.
Boa pergunta - obrigado por postar!