Answers:
函数式编程语言可以做更多的编译时间优化。原因之一是纯度-并发是微不足道的,因为没有状态。因此,编译器可以采用两个分支并对它们进行并发,而无需更改程序的行为。
同时,可以在没有状态的情况下进行计算的任何内容(即,在haskell中为非一元形式的任何内容)都可以由编译器提前进行计算,但是这样的计算可能会很昂贵,因此可能只能部分完成。
另外,程序中不需要的任何东西都可以完全优化。
原则上,函数式语言比命令式对应语言有更多的编译时优化可能性,这可能是正确的。
但是,更有趣的是,如果它们实际上是在当前的编译器中实现的,以及这些优化在实践中的相关性(即,生产环境中惯用的“ realtime(TM)”代码的最终性能,并且具有先验可预测的编译器设置)。
例如,臭名昭著的“ 计算机语言基准游戏”的Haskell提交内容(虽然可能很糟糕-但现在还不存在-那里有明显改善的地方),给人的印象是花费了大量时间手动优化面临着“由于可能的编译器优化”的主张,这insert some property about FP languages here
使得该优化看起来(目前至少)比相关现实更具理论可能性。
我很高兴在这一点上被证明是错误的。
在函数式中,通过程序的值流非常(对于编译器和程序员)都是可见的。这使编译器有很多余地来决定值的存储位置,保留值的时间等等。
用命令式语言,编译器向程序员承诺一个模型,其中大多数变量对应于内存中的实际位置,这些位置在定义的生存期内保持不变。潜在地,任何语句都可能会读取(或写入!)这些位置中的任何一个,因此编译器只能用寄存器分配替换内存位置,将两个变量合并到单个存储位置中,或者在对位置进行细致分析之后执行类似的优化。否则程序中可能会引用该变量。
现在,有两个警告:
但是要回答一般性问题,是的,函数范式为编译器提供了很多自由空间来优化它在命令式设置中所没有的自由。
main
是状态转换功能,而不是使用状态本身的功能。