评估可视化编程语言的执行流程

时间:2010-07-16 20:54:02

标签: algorithm

这些天我正在阅读有关可视化编程语言的文章。所以我想到了两个“范式”。在它们两个中,你有一个起点和几个终点。

现在,你可以从起点开始,也可以从终点反向移动(终点的顺序是已知的)。

从起点开始感觉很奇怪,因为你可以在数据流中进行“拆分”。比方说,如果我有一个整数,并且两个函数同时需要这个整数。坏。我不想进入并发编码。至少还没有。或者我应该吗?

从终点开始感觉好多了。你从第一个终点开始。检查所需的内容,并对其进行评估。我相信这是懒惰的评价。但是当你有多个输入时问题就来了。您如何确定评估输入的顺序?

你能指点我一些文章/论文/互联网上的东西吗?或者mabye告诉我一些要找的关键词?

2 个答案:

答案 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 - 也就是说,执行节点的顺序,使你永远不会在它的依赖之前执行节点。当然,这假设您的图表中没有循环。

向后移动,你正在做的是以递归方式解析图形。从结束节点开始,对于尚未计算的每个依赖项,您将递归调用该节点上的过程,直到评估所有输入值。这样做的好处是,您永远不会处理特定最终状态不需要的节点。

这两种方法中哪一种最好取决于你究竟在做什么。