一些函数式编程结构减少了可调试性吗?
有一些关于你提到的特定功能的好答案。
我认为一些FP功能以及以更FP风格编程的一些方面至少会“干扰”调试体验。例如,使用高阶函数,可以以点无样式编程。这样做会留下较少的标识符,这意味着例如在调试器的“locals”窗口中可以轻松检查的东西更少。闭包通常是不透明的,直到您进入它们的主体。
FP还使用了许多控制反转的结构(惰性评估只是其中之一,使用“map”或“iter”而不是“foreach”是另一个),这会改变控制流并影响“单步执行”的工作方式。
随着FP变得更加普遍,我预计调试工具将继续改进。我不确定是否有一些FP在调试方面本质上更难,但即使如此,不要忘记FP的许多方面使您的代码更不容易需要调试。 🙂
有些函数式编程的构造确实会降低代码的可调试性,但这种说法是不准确的。在许多语言中,这些构造并不是真正的匿名,因为调试器无法理解语言的语义,而是理解程序的最终形式(.exe和PDB文件的组合)。大多数匿名构造最终在最终程序中会变成具体形式(在.NET实现中非常明显)。
此外,实现这些特性的语言通常会花费时间来提供更好的调试支持。以C#和VB为例:
1. 这两种语言都会添加DebuggerDisplay
属性,并重写匿名类型的.ToString
方法,以增加调试支持。这两种实现的方式略有不同,但结果基本相同。
2. 内部类在调试方面并没有太多特殊之处,不需要太多额外的工作。
3. 在Visual Studio 2008中,VB和C#花了很多时间来“展开”lambda表达式,并将捕获的自由变量显示为原始局部变量列表的一部分。这样可以更轻松地调试函数。
因此,虽然函数式编程的一些构造可能会降低代码的可调试性,但许多语言都提供了针对这些构造的调试支持,以解决这个问题。