这些天我正在阅读有关可视化编程语言的文章。所以我想到了两个“范式”。在它们两个中,你有一个起点和几个终点。
现在,你可以从起点开始,也可以从终点反向移动(终点的顺序是已知的)。
从起点开始感觉很奇怪,因为你可以在数据流中进行“拆分”。比方说,如果我有一个整数,并且两个函数同时需要这个整数。坏。我不想进入并发编码。至少还没有。或者我应该吗?
从终点开始感觉好多了。你从第一个终点开始。检查所需的内容,并对其进行评估。我相信这是懒惰的评价。但是当你有多个输入时问题就来了。您如何确定评估输入的顺序?
你能指点我一些文章/论文/互联网上的东西吗?或者mabye告诉我一些要找的关键词?
答案 0 :(得分:2)
如果我理解你的意思,在两个函数中使用相同的整数,就是这样:你只需要使用它两次,不需要带来并发性。如果'实现'你正在考虑销毁输入值,你可以在使用之前先复印一份。
int i = 2;
int j = fun1(i);
int k = fun2(i);
int res = fun3(j, k);
会变成:
i = 2[A]
|
Clone[B]
/ \
/ \
/ \
i_1 i_2
| |
fun1[C] fun2[D]
| |
j k
\ /
\ /
\ /
fun3[E]
|
res
但是为了评估图表,不需要并发性。您可以从左到右评估“平行”分支(如A-B-C -...标记所示 - 另见here)。
自上而下(又称从头到尾),从左到右感觉比自下而上更自然,只要自下而上实际上有明确的含义。关于后一点,假设你有程序的结果,你不能总是计算输入:考虑当funXXX
不是单射时会发生什么(例如{{1} })因此不可逆转。
我希望我不会完全误解你的思路。
答案 1 :(得分:1)
继续前进,你想要的是你的依赖图的topological sort - 也就是说,执行节点的顺序,使你永远不会在它的依赖之前执行节点。当然,这假设您的图表中没有循环。
向后移动,你正在做的是以递归方式解析图形。从结束节点开始,对于尚未计算的每个依赖项,您将递归调用该节点上的过程,直到评估所有输入值。这样做的好处是,您永远不会处理特定最终状态不需要的节点。
这两种方法中哪一种最好取决于你究竟在做什么。