我考虑这个问题已经很长时间了,但实际上在Google上找不到答案,在Stackoverflow上也找不到类似的问题。如果有重复,对不起。
许多人似乎都说,用命令式语言编写使用OCaml和Haskell等功能语言编写的编译器和其他语言工具要高效得多,并且更容易。
这是真的?如果是的话,为什么用功能性语言而不是像C这样的命令性语言编写它们是如此高效和容易?而且-功能语言中的语言工具难道不比C等低级语言慢吗?
我考虑这个问题已经很长时间了,但实际上在Google上找不到答案,在Stackoverflow上也找不到类似的问题。如果有重复,对不起。
许多人似乎都说,用命令式语言编写使用OCaml和Haskell等功能语言编写的编译器和其他语言工具要高效得多,并且更容易。
这是真的?如果是的话,为什么用功能性语言而不是像C这样的命令性语言编写它们是如此高效和容易?而且-功能语言中的语言工具难道不比C等低级语言慢吗?
Answers:
通常,编译器对树的工作量很大。源代码被解析为语法树。然后可以将该树转换为带有类型注释的另一棵树,以执行类型检查。现在,您可以将该树转换为仅包含核心语言元素的树(将句法式的类似糖的符号转换为未修饰的形式)。现在您可以执行各种优化,这些优化基本上是对树的转换。之后,您可能会以某种常规形式创建一棵树,然后遍历该树以创建目标(程序集)代码。
函数式语言具有模式匹配和对有效递归的良好支持等功能,这使得使用树很容易,因此这就是为什么它们通常被认为是编写编译器的良好语言。
许多编译器任务都是在树结构上进行模式匹配。
OCaml和Haskell都具有强大而简洁的模式匹配功能。
很难将模式匹配添加到命令式语言中,因为要评估或提取与该模式匹配的任何值都必须是无副作用的。
要考虑的一个重要因素是,在任何编译器项目中,很大一部分就是您可以自行托管编译器并“吃掉自己的狗粮”。因此,当您查看像OCaml这样用于语言研究的语言时,它们往往具有针对编译器类型问题的强大功能。
正是出于这个原因,在我上一个像编译器一样的工作中,正是出于这个原因,在处理C代码时使用了OCaml,它只是完成任务的最佳工具。如果INRIA的人员以不同的优先级构建了OCaml,则可能不是一个很好的选择。
也就是说,功能语言是解决任何问题的最佳工具,因此从逻辑上讲,它们是解决特定问题的最佳工具。QED。
/ me:少高兴一些地爬回我的Java任务...