做一些函数式编程结构减少可调试性?

做一些函数式编程结构减少可调试性?

问题描述:

我听说了以下功能减少调试性(因为他们是匿名的,并且调试器不能跟踪它很好)做一些函数式编程结构减少可调试性?

  1. 匿名类
  2. 内部类
  3. 瓶盖块/λ功能

这是真的吗?

+0

因为何时是匿名类和内部类“函数式编程结构”? – 2009-12-12 22:06:09

+0

他们不是。标题并不完全指示性的,但我想人们明白这一点。 – user855 2009-12-12 22:16:42

我会说这显然是不真实的。是的,没有额外的调试支持,这些构造可能会更难以调试。在许多语言中,它们不是真正的匿名,因为调试器不理解语言语义。相反,它理解程序的最终形式(.exe和PDB组合)。大多数匿名结构最终在最终的程序中采用具体的形式(对于.Net实现来说也是如此)。

另外,实现这些功能的语言通常需要花时间为它们实现更好的调试支持。以C#和VB为例

  1. 这两种语言都增加了DebuggerDisplay属性并覆盖了.ToString对匿名类型的generate来增加调试支持。这些实现有点不同,但结果几乎相同。
  2. 内部类不在调试方面非常特殊的,不需要太多,如果任何额外的工作
  3. VB和C#在Visual Studio 2008中花费了大量的时间来“放松” lambda表达式,并显示所拍摄的*变量作为原始当地人名单的一部分。使得它更容易调试功能

很难说他们是否本质上减少调试性。如果匿名函数抛出异常,您仍然可以打印堆栈跟踪。当发生什么事情时,DrScheme设法在整个代码中绘制红色箭头来表示堆栈跟踪,并且处理匿名函数就好了。然而,尽管已经花费了大量的精力来调试诸如Scheme或Haskell之类的语言,就像已经用Java一样加入到了Java中,所以当然调试工具可能更糟糕。

而且,正如JaredPar所说,Visual Studio似乎在这方面和C#上做得很好。

列出的功能不应导致设计用于处理它们的调试器出现问题。如果你的调试器假定你将调试的东西与C基本上没有太大差别,那么你可能会遇到问题。

现在,在功能语言中发现的一个功能确实是确实是令调试人员头痛的是大量使用懒惰评估。 Haskell在这方面特别有问题。

从我的角度来看,我并不特别相信这种情况。我正在使用Scala的功能特性,它编译运行在Java虚拟机上。像Intellij这样的调试器正确地处理这个问题。

话虽如此,一些代码结构以不同的方式呈现给您通常期望的方式。功能块在某些情况下作为内部类出现。列表显示为头部实体和尾部列表(或者可能是其他方式 - 我刚刚开始使用它!)。

关于您所说的特定功能已经有一些很好的答案。一般来说,我会说一些FP功能以及更多FP风格的编程方面至少与调试体验“互动”。例如,使用高阶函数,可以用无点式编程。当你这样做时,这会留下更少的标识符,这意味着例如在调试器的“本地”窗口中可以轻松检查的东西更少。直到你进入他们的身体之前,闭合物通常是不透明的。 FP也使用了很多反转控制结构(懒惰评估只是一个,'地图'或'iter'而不是'foreach'是另一个),它改变了控制流程,并且可能影响'单步'作品。

随着FP变得越来越普遍,我预计调试工具将继续改进。我不清楚某些FP是否“固有地”难以调试,但即使这是真的,不要忘了,关于FP的更多内容使您的代码不太可能首先需要调试。 :)