我正在阅读 Tomas Petricek 和 Jon Skeet 的“函数式编程”,我了解声明式编程和命令式编程之间的区别。
我想知道的是原始运算符和函数是如何实现的,它们是由命令式运算符和函数构造的声明性语言。
干杯
AWC
我正在阅读 Tomas Petricek 和 Jon Skeet 的“函数式编程”,我了解声明式编程和命令式编程之间的区别。
我想知道的是原始运算符和函数是如何实现的,它们是由命令式运算符和函数构造的声明性语言。
干杯
AWC
如果我正确理解您的问题,我认为这不是一个硬性规定。例如,您可以使用像 Lisp 这样的函数式语言来为自己创建一个解释器。在这种情况下,实现细节是以函数式的方式实现的(因为 Lisp 是一种函数式语言)。
此外,如果您有一种图灵完备的语言,您可以使用它来实现任何其他语言的解析器/解释器/编译器。有命令式图灵完备语言和功能/声明性图灵完备语言。
但是所有代码最终都完成了汇编或机器代码,这本质上是必不可少的。理论上,我上面说的是真的,但显然不是在实践中:)。
作为一个有趣的历史,LISP 是一个完全理论的结构。它是计算机语言的数学符号。eval
在 Steve Russel 在 IBM 704 上以机器代码实现LISP 的功能之前,它仍然是理论性的:
根据 Paul Graham 在 Hackers & Painters 中的报道,p。185,McCarthy 说:“Steve Russell 说,看,我为什么不对这个 eval 进行编程……我对他说,嗬,嗬,你把理论和实践混为一谈了,这个eval 是用来阅读的,不是用于计算。但他继续做了。也就是说,他将我论文中的 eval 编译成 IBM 704 机器代码,修复错误,然后将其宣传为 Lisp 解释器,确实如此。所以那时 Lisp基本上是它今天的形式......”(强调我的)
所以再一次,理论与实践之间的微妙之处。:)
低级机器(CPU,汇编语言级别)是必不可少的,因此显然在某些时候实施必须考虑到这一点。但是,实现某些类型的函数式语言(如 Haskell)需要一些非常不明显的方法来创建具有良好性能的运行时。
奇怪的是,大多数命令式语言都经历了一个所有代码都被转换为更具声明性的阶段:
这是将 Scheme(功能)直接编译为 C 代码(命令式)的示例:
声明性语言是由命令式运算符和函数构造的吗?
有时。它是实现的属性,而不是语言。
在 1980 年代,很多人将函数式程序编译成图形,然后将图形重写为更简单的图形。这种计算通常涉及更新适当的图表,但除此之外,它就像你想要的那样是一种声明性。要了解更多信息,请查找“图形缩减”或阅读 Chris Clack 和 Simon Peyton Jones 的“四冲程缩减引擎”。
最终,编译器编写者想出了通过将函数式程序直接编译为本机机器代码来获得更好性能的方法。如果本机机器是典型的商品机器,这意味着典型的命令式操作。但是,如果您查看麻省理工学院 Arvind 教授的开创性工作,他的团队设计并构建了数据流机器,其中基本的计算操作在本质上更具声明性。这是一项伟大的工作,但所有在 1980 年代蓬勃发展的专用架构都已因微软/英特尔的良性循环(更多软件 -> 销售更多 PC -> 更便宜的处理器 -> 销售更多 PC -> .. . -> 300 美元的上网本,这些东西真的很酷)。
你的问题有点不清楚。在引擎盖下,处理器指令本质上是必不可少的。如果你的代码应该在冯诺依曼机器上运行,它最终应该作为命令式代码运行。
有可能构建一台机器(具有一些特定的架构)固有地支持这些操作。事实上,LispM旨在帮助运行 Lisp 程序。虽然我不熟悉 LispM 的硬件特性,但它可能确实有资格在更具声明性的级别上提供一些原始操作。
实现是'隐藏在引擎盖下。它可以用任何范式构建。
声明性程序只是其一些或多或少的“通用”命令式实现/虚拟机的数据。
优点:仅以某种硬编码(和检查)格式指定数据比直接指定某些命令式算法的变体更简单且不易出错。一些复杂的规范不能直接编写,只能以某些 DSL 形式编写。DSL 数据结构中使用的 best 和 freq 是集合和表。因为您在元素/行之间没有依赖关系。当您没有依赖项时,您可以自由修改和轻松支持。(例如,将模块与类进行比较 - 使用您满意的模块和使用脆弱的基类问题的类)声明性和 DSL 的所有产品都立即受益于该数据结构(表和集)的好处。另一个优点 - 如果 DSL 或多或少是抽象的(设计良好),您可以更改声明性语言 vm 的实现。例如,进行并行实现。
缺点:你猜对了。通用(并由 DSL 参数化)命令式算法/vm 实现可能比特定的更慢和/或内存占用。在某些情况下。如果这种情况很少见 - 忘记它,让它慢慢来。如果它很频繁 - 你总是可以为这种情况扩展你的 DSL/vm。在某个地方减慢所有其他情况,当然......
PS 框架介于 DSL 和命令式之间。和所有半途而废的解决方案一样……它们结合了缺陷,而不是好处。它们不是那么安全也不是那么快:) 看看万事通的haskell——它介于强大的简单ML 和灵活的metaprog Prolog 之间,而且......它是多么的怪物。您可以将 Prolog 视为具有仅布尔函数/谓词的 Haskell。以及它对 Haskell 的灵活性是多么简单......