跟踪函数式编程中表达式的求值

时间:2016-09-19 08:59:24

标签: haskell functional-programming erlang code-analysis static-analysis

这个问题讨论的是Erlang,但它也适用于其他函数式编程语言。

问题

在函数定义的中间说,有一个这样的表达式:

A = B + voodoo(C, D)

voodoo定义为

voodoo(X, Y) -> more_voodoo(more_voodoo1(X), more_voodoo2(Y)).

more_voodoo*定义为voodoo,列表继续执行,经过一些步骤后,它最终达到文字,BIF,库函数(后来称为“边框”)。

问题是:我想知道如何定义A,如何生成图表来说明A的定义?像这样:

C -> more_voodoo1 ---+
                     |-> more_voodoo ---+
D -> more_voodoo2 ---+                  |-> (+) -> A
  (graph inferred from context) -> B ---+

图表的组织方式在这里并不重要,只要它让我清楚地看到A的定义(具有足够高的抽象并在必要时放大)。

直观地说,你可以认为程序是通过一些球的一些线程,其中踏板代表数据流,球代表功能,我想要做的是选择产生A的球,以及摇晃,因此,只剩下与A相关的内容,所有其他无趣的信息都会被删除。

我怀疑是否存在现成的工具,那么您对如何为此类任务实施工具有什么看法?它不必是全自动的,它可以尝试它的最佳状态,当它卡住它可以询问用户的指令(只是黑盒子,用户定义的边框等),解析源代码?挂钩到编译器?使用某种“无线电活动”值然后进行X射线检测吗?

注意

你可能想知道,为什么不只是流动代码并理解它?好吧,有时候调用链太长了,很难把所有的堆栈都放在头上,当然,如果我们努力的话,我们最终会理解它,但是如果有更好的方法去做,为什么不呢? ?说实话,有时候这些代码是商业逻辑,而不是真正有趣的东西,这是一个一劳永逸的解决方案,一旦我们拥有了这个工具,我们下次就不会抓住我们的头脑了。使用图表,您可以清楚地看到某些数据来自哪里(并且它与用户更好地与文本交互,是的,我知道您喜欢纯文本,我也喜欢它,但承认它,有时候GUI比文本)。

如果你的电话链很长,你可能应该重构它,我听说你说。好吧,糟透了,有时你不允许改变这些代码。

0 个答案:

没有答案