Інші люди застосували DAG до даних, але я думаю, що це принаймні так само застосовно (якщо не більше) до коду. Про це згадує Махбубур Р Ааман, тож насправді це більше доповнення до його відповіді, ніж повна відповідь самостійно.
Мені це трапляється, ніж будь-яка імперативна комп'ютерна програма, яка не містить нескінченних циклів (дякую @AndresF.) - це спрямований ациклічний графік (DAG). Мається на увазі, що можливі шляхи виконання коду спрямовані (спочатку це, потім те) і ациклічні (не утворюючи нескінченних циклів). Вони є графіком, оскільки шлях через будь-який значний код рідко буває таким простим, як список або дерево.
Я працював у XSLT, можливо, 4 роки. Мені було страшно, намагаючись пояснити, чому це не дуже хороша мова програмування загального призначення, але DAG - це причина. Зокрема, XSLT - це мова, керована даними. Ви визначаєте функції (так, у сенсі функціонального програмування), але не обов'язково викликати ці функції зі свого коду. Швидше, XSLT встановлює комбінацію вибору та ітерації через вузли вхідного XML-документа. Це дозволяє структурі вхідних даних визначати, які функції викликаються та в якому порядку.
Це було дуже цікаво і дуже круто, поки ваша програма не зіткнулася з умовами даних, які ви не тестували о 2:30 ранку, і вам довелося прокинутися і виправити це. Коли ви дозволяєте даним визначати DAG, то визначення DAG стає всіма можливими умовами введення - які для будь-якого нетривіального ділового додатку виходять за межі незрівнянних; вони немислимі.
Спочатку я подумав, що функціональне програмування може не бути DAG, тому що порядок виконання іноді не зрозумілий, або навіть продуманий програмістом. Але функціональна програма визначає залежності. Насправді декларативний характер функціонального програмування можна вважати таким, що визначає лише залежності (a ^ 2 = b ^ 2 + c ^ 2), не вказуючи порядок виконання (не має значення, чи спочатку квадрат "b" чи "c" , до тих пір, поки вони обидва будуть квадратними, перш ніж їх додавати разом).
Але хоча функціональне програмування може бути свідомо розпливчастим щодо порядку операцій на детальному рівні, це виразно ясно про залежності. Це ті самі особливості, які роблять його таким прихильним до одночасності. У будь-якому випадку, все ще є графік шляхів через код, і цей графік все ще спрямований (залежності потрібно оцінювати перед залежними завданнями), тому я думаю, що DAG застосовується і там.
Приємне запитання - дякую за публікацію!