Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 声明性语言的实现细节本质上是必需的吗_Language Agnostic_Programming Languages_Functional Programming_Declarative_Imperative - Fatal编程技术网

Language agnostic 声明性语言的实现细节本质上是必需的吗

Language agnostic 声明性语言的实现细节本质上是必需的吗,language-agnostic,programming-languages,functional-programming,declarative,imperative,Language Agnostic,Programming Languages,Functional Programming,Declarative,Imperative,我正在阅读Tomas Petricek和Jon Skeet的《函数式编程》,我理解声明式编程和命令式编程之间的区别 我想知道的是,原语运算符和函数是如何实现的,是由命令式运算符和函数构造的声明性语言 干杯 AWC如果我正确理解了你的问题,我认为这不是一条硬性规定。例如,您可以使用诸如Lisp之类的函数式语言为自己创建解释器。在这种情况下,实现细节是以功能性的方式实现的(因为Lisp是一种功能性语言) 此外,如果您有一种图灵完备的语言,您可以使用它为任何其他语言实现解析器/解释器/编译器。有命令式

我正在阅读Tomas Petricek和Jon Skeet的《函数式编程》,我理解声明式编程和命令式编程之间的区别

我想知道的是,原语运算符和函数是如何实现的,是由命令式运算符和函数构造的声明性语言

干杯


AWC

如果我正确理解了你的问题,我认为这不是一条硬性规定。例如,您可以使用诸如Lisp之类的函数式语言为自己创建解释器。在这种情况下,实现细节是以功能性的方式实现的(因为Lisp是一种功能性语言)

此外,如果您有一种图灵完备的语言,您可以使用它为任何其他语言实现解析器/解释器/编译器。有命令式图灵完备语言和函数式/声明式图灵完备语言

但所有的代码最终都会生成程序集或机器代码,这是必然的。理论上,我上面说的是对的,但实际上显然不是

作为一个有趣的历史旁白,LISP是一个完全的理论结构;它是计算机语言的数学符号。在Steve Russel在IBM 704上用机器代码实现LISP的
eval
功能之前,它一直是理论性的:

根据保罗·格雷厄姆在《黑客与画家》一书中的报道,p。185年,麦卡锡说:“Steve Russell说,看,我为什么不编写这个评估…,我对他说,你把理论和实践混为一谈了,这个评估是为了阅读,而不是为了计算。但他还是照做了。也就是说,他将我论文中的eval编译成ibm704机器代码,修复了bug,然后将其宣传为Lisp解释器,确实如此。因此,在这一点上,Lisp基本上具有今天的形式……”(我的重点)

因此,再次强调理论和实践之间的微妙之处。

底层机器(CPU、汇编语言级别)是必不可少的,因此很明显,在某些时候,实现必须考虑到这一点。然而,需要一些非常不明显的方法来创建性能良好的运行时

奇怪的是,大多数命令式语言都经历了一个阶段,所有代码都被转换为更具声明性的:

下面是一个将Scheme(函数式)直接编译为C代码(命令式)的示例:


    • 你的问题有点不清楚。在后台,处理器指令本质上是命令式的。如果你的代码应该在冯·诺依曼机器上运行,那么它最终应该作为命令式代码运行

      也许可以构建一台内在支持这些操作的机器(具有某些特定的体系结构)。事实上,这台机器是为了帮助运行Lisp程序而设计的。虽然我不熟悉LispM的硬件特性,但它可能有资格在更具声明性的级别上提供一些基本操作

      声明性语言是由命令式运算符和函数构造的吗

      有时,它是实现的属性,而不是语言

      在20世纪80年代,许多人将函数程序编译成图形,然后将图形改写成更简单的图形。这种计算通常包括就地更新图形,但除此之外,它几乎是一种声明式的。要了解更多信息,请查阅“图形缩减”或阅读“四冲程缩减引擎”克里斯·克拉克和西蒙·佩顿·琼斯合著


      最终,编译器编写人员找到了通过将函数程序直接编译为本机代码来获得更好性能的方法。如果本机是典型的商品机,这意味着典型的命令式操作。然而,如果你看看麻省理工学院阿文德教授的开创性工作,他的团队设计并制造了数据流机器,其中基本的计算操作本质上更具声明性。这是一项伟大的工作,但由于微软/英特尔的良性循环(更多的软件->售出更多的电脑->更便宜的处理器->售出更多的电脑->…->售价300美元的上网本真的很酷),所有在20世纪80年代蓬勃发展的专用体系结构都消失了。

      实现就是“隐藏在引擎盖下”。它可以用任何范式构建

      声明性程序只是其或多或少“通用”命令实现/vm的数据

      优点: 与直接指定命令式算法的变体相比,只指定硬编码(和检查)格式的数据更简单,也不容易出错。有些复杂的规范不能直接编写,只能以DSL的形式编写。 DSLs数据结构中使用的最佳和频率是集合和表格。因为元素/行之间没有依赖关系。当您没有依赖项时,您可以自由修改,并且易于支持。(例如,将模块与类进行比较—与您满意的模块和存在脆弱基类问题的类进行比较) 所有具有声明性和DSL的商品都会立即受益于该数据结构(表和集)。 另一个优点是,如果DSL或多或少是抽象的(设计良好的),您可以更改声明性语言vm的实现。例如,进行并行实现。或将其移植到其他操作系统等。所有良好的指定模块化隔离接口或协议都为您提供了这种自由和方便的支持

      缺点: 你猜对了。通用(并由DSL参数化)命令式算法/vm实现可能比特定算法慢和/或内存不足。在某些情况下。 如果这种情况很少见,那就忘了它,慢慢来吧。如果是频繁的,你总是可以扩展你的DSL/vm。在某个地方,所有其他情况都会慢下来,当然

      p.S.框架介于DSL和命令式框架之间。正如所有的h