Answers:
好问题。
编辑:
良好的资源:
答案是,它与编程没有任何关系。它与解决问题有关。
就像链表是用于某些类型问题的数据结构一样,图对于表示某些关系也很有用。链表,树,图和其他抽象结构仅与编程有关,因为您可以在代码中实现它们。它们以更高的抽象级别存在。这与编程无关,而在于在解决问题中应用数据结构。
如果仍然想与编程建立某种关系,请考虑以下几点:
其他人已经将DAG应用于数据,但是我认为它至少在代码上是适用的(如果不是更多的话)。Mahbubur R Aaman提到了这一点,因此,实际上,这不仅仅是他自己的完整答案,更是他的答案的附录。
对我而言,它比任何无穷循环的命令式计算机程序(感谢@AndresF。)都是有向无环图(DAG)。意味着代码执行的可能路径是定向的(首先是this,然后是that),并且是非循环的(不形成无限循环)。它们是图,因为通过任何重要代码的路径很少像列表或树那样简单。
我在XSLT工作了大约4年。我花了很长时间来解释为什么它不是一种好的通用编程语言,但是DAG是原因。具体来说,XSLT是一种数据驱动语言。您定义了函数(是的,从函数编程的意义上来说),但是不必从代码中调用这些函数。而是,XSLT建立了对输入XML文档的节点的选择和遍历的组合。这使输入数据的结构可以确定调用哪些功能以及调用顺序。
直到程序遇到您未在凌晨2:30进行测试的数据条件并且必须唤醒并修复它之前,这非常有趣且非常酷。当您让数据定义DAG时,DAG的定义就变成了所有可能的输入条件-对于任何非平凡的业务应用程序来说,这都是无法计算的。他们是不可想象的。
起初,我认为函数式编程可能不是DAG,因为执行顺序有时不明确,甚至程序员也没有想到。但是功能程序确实定义了依赖性。实际上,可以将函数式编程的声明性视为仅定义依赖项(a ^ 2 = b ^ 2 + c ^ 2),而无需指定执行顺序('b'或'c'的平方先后无所谓) ,只要它们在加在一起之前都平方即可)。
但是,尽管函数式编程可能会故意在细节上模糊操作的顺序,但对于相关性却非常清楚。这些正是使其非常适合并发的功能。无论如何,仍然存在一个遍历代码的路径图,并且该图仍然是有方向的(必须在依赖任务之前评估依赖关系),因此我认为DAG也适用于此。
好问题-感谢您的发布!
while (true) { print("hi"); }
?也许您想排除非终止程序?
我想知道等离子在Ecto中有什么优势...
DAG可用于按顺序对一组任务进行建模,但前提是必须先完成某些任务再执行其他任务。Ecto是一个处理框架,它使用DAG对处理图形进行建模,以便图形执行有序的同步执行。血浆中的外生是DAG和调度上运行。
在其他情况下,我们可以利用DAG的概念吗?
添加另一个答案,因为尚未看到对构建系统的引用,例如make
使用DAG找出要构建的依赖项。
在这里更多细节
make