Другие люди применяли DAG к данным, но я думаю, что это как минимум применимо (если не больше) к коду. Махбубур Р. Ааман упоминает об этом, так что на самом деле это скорее дополнение к его ответу, чем сам по себе полный ответ.
Мне кажется, что любая императивная компьютерная программа , свободная от бесконечных циклов (спасибо @AndresF.), Является Направленным ациклическим графом (DAG). Это означает, что возможные пути выполнения кода являются направленными (сначала то, потом то) и ациклическими (не образующими бесконечные циклы). Они представляют собой граф, потому что путь через любой значимый код редко бывает таким простым, как список или дерево.
Я работал в XSLT около 4 лет. Я ужасно пытался объяснить, почему это не был хороший язык программирования общего назначения, но причина в DAG. В частности, XSLT является языком данных. Вы определяете функции (да, в смысле функционального программирования), но вы не обязательно вызываете эти функции из своего кода. Скорее, XSLT устанавливает комбинацию выбора и итерации узлов входного XML-документа. Это позволяет структуре входных данных определять, какие функции вызываются и в каком порядке.
Это было очень интересно и очень круто, пока ваша программа не столкнулась с состоянием данных, которое вы не проверяли в 2:30, и вам не пришлось проснуться и исправить его. Когда вы позволяете данным определять DAG, тогда определение DAG становится всеми возможными входными условиями, которые для любого нетривиального бизнес-приложения не поддаются исчислению; они невообразимы.
Сначала я подумал, что функциональное программирование не может быть DAG, потому что программист иногда не понимает порядок выполнения или даже не думает о нем. Но функциональная программа определяет зависимости. Фактически, декларативную природу функционального программирования можно рассматривать как определение только зависимостей (a ^ 2 = b ^ 2 + c ^ 2) без указания порядка выполнения (не имеет значения, является ли 'b' или 'c' квадратным первым до тех пор, пока они оба будут в квадрате, прежде чем их сложить вместе).
Но в то время как функциональное программирование может быть преднамеренно неопределенным в отношении порядка операций на детальном уровне, оно совершенно ясно о зависимостях. Это те самые особенности, которые делают его доступным для параллелизма. В любом случае, в коде все еще есть граф путей, и этот граф все еще направлен (зависимости должны быть оценены перед зависимыми задачами), поэтому я думаю, что DAG также применяется и там.
Хороший вопрос - спасибо за публикацию!