四种程序设计语言比较
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安全:
面向对象语言在安全性方面有自己的改进,但也存在自己的弊端,它的安全机制是基于不要相信任何东西的前提下的。
并发:
向对象语言主要并发机制有会合,多原语等。
类型系统:
面向对象语言中对复杂对象的操作,可由用户定义,即可定义构造子、析构子的函数体。面向对象语言要动态(在运行中)生成实例对象,这就要求在类定义时,也定义本类如何生成实例对象的构造子。面向对象语言的包容多态比较复杂。在面向对象的对象继承中,父类的类属域外延包容所有子类域。自然,父类定义的操作适用于子类域中的对象,而子类域上定义的操作不能用于父对象。面向对象中派送分辨的函数体是动态运行中完成的(如C++),这是因为直接使用类属对象程序表达能力强得多。
总的来说,过程式的程序设计是一种自上而下的设计方法,设计者用一个main函数概括出整个应用程序需要做的事,而main函数由对一系列子函数的调用组成。对于main中的每一个子函数,都又可以再被精炼成更小的函数。重复这个过程,就可以完成一个过程式的设计。其特征是以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。
函数式程序的功能并不依赖于特殊表达式的计算和程序的其它部分是否并行地执行。许多研究人员正设法使编译程序能够识别哪些表达式可被同时求值,以代替程序员来作这种判断。
安全:
函数式语言由于广泛采用懒求值,所以安全性较高。函数测试的表达式对也很多,这样顺序求下去,也保证了一定的安全性。
类型系统:
逻辑式语言中的类型系统,一般是基于带参数多态的多类逻辑。类型系统的引入使逻辑式语言的表达能力大大提高,并且支持抽象数据类型。
并发:
过程式语言的并发机制主要有会合,异步发送。
类型系统:
对于过程式语言和面向对象语言,都有顺序、条件、循环三种控制语句。过程式程序语言中多类型的雏型是联合和变体记录,程序根据运行中判别式的值自动呈现结构不同的类型,但在引用和处理中还要显式指明处理的是哪个类型变体。以便静态编译。过程式语言在处理变长数组时效率不高。
子句逻辑的不可判定性要求规则和查询用非反条件,且慎用not操作。
Prolog的优点是自文档性、非过程性、逻辑表达能力强。描述性使程序清晰、具有潜在的并行性。Prolog的缺点是只适合较小程序。计算效率不高。
基本特点:
逻辑程序设计的基本观点是程序描述的是数据对象之间的关系,它的抽象层次更高而不限于函数(映射)关系。关系也是联系,对象和对象、对象和属性的联系就是我们所说的事实。事实之间的关系以规则表述,根据规则找出合乎逻辑的事实就是推理。因此,逻辑程序设计范型是陈述事实,制定规则,程序设计就是构造证明。程序的执行就在推理,和传统程序设计范型有较大的差异。
执行效率:
它的缺点是运行效率低。
安全:
逻辑式语言的非过程性和没有“隐藏的语义”使程序更具有安全性。即程序员控制整个程序比较方便,且不需了解更多实现细节。
并发:
逻辑式语言由于它的非过程性,成为潜在并行程序设计语言的候选者。
类型系统:
逻辑式语言中的类型系统,一般是基于带参数多态的多类逻辑。类型系统的引入使逻辑式语言的表达能力大大提高,并且支持抽象数据类型。
函数式程序设计语言:
表达能力:
函数式程序设计语言在表达能力方面有三个显著特点:一是若一个表达式有定义,则表达式的最后结果与其计算次序无关,二是构造数据的能力强,把整个数据结构看作是简单值传送,三是建立高阶函数的能力强,高阶函数(即函数的函数)可使程序简洁、清晰。它的缺点是运行效率低。
效Leabharlann Baidu:
除了难以模拟状态而外,效率普遍认为是函数式语言的大问题,到目前为止虽然新语言版本在效率问题上作了许多改进,从过去比顺序的命令式语言慢200-1000倍到近来的3-5倍,其原因是:
过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法和大多数人的思维方式比较接近。然而,过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的时候,往往显得力不从心。这是因为过程式的设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的时候,要做到这一点会比较困难,而当开发中需求变化的时候,以前对问题的理解也许会变得不再适用。事实上,开发一个系统的过程往往也是一个对系统不断了解和学习的过程,而过程式的设计方法忽略了这一点。
由以上表中可以看出,这五个特征对“面向对象”是缺一不可的。
表达能力:
面向对象语言有4个主要特点:认识性、类别性、多态性、继承性,它们和动态绑定的结合使用,体现出面向对象语言强大的表达能力。
执行效率:
面向对象语言中,c++的执行效率也比较高,但是诸如java语言,由于是解释执行,需要生成中间代码,所以效率相对来说较低。
函数是第一类对象,局部于它的数据一般要在堆(heap)上分配,为了避免悬挂引用,要有自动重配的检查。
无类型(如LISP)要在运行中检查类型,即使是强类型的(如ML,Miranda)减少了类型动态检查,但函数式语言天然匹配选择模式的途径也是运行低效原因。
懒求值开销大:每次用到函数的参数,每次从复合值中选出一个值时都要进行检查,以免出现未求值的表达式。在急求值的语言中,(如命令式的)就不需这种检查。ML也采用急求值。
SY10DF112刘倩
四种程序语言比较
1、面向对象程序设计语言
面向对象是在传统语言和软件技术基础上发展起来的:结构化程序表达导致了对封装、局部性的重视。比过程/函数上一层的封装使之成为可表达高层语义的程序对象。抽象数据类型是程序设计语言的重要发展。有了ADT程序员可以显式定自己的构件(component)类型,即新类型,以它为半成品构筑自己的应用。封装性和自主性必然导致继承机制的出现,因为各自为政的封装必然导致大量相同的机制重复定义,不利于维护。然而,继承又为构件重用大开方便之门。极度的继承应用者几乎不用编程序。只要在窗口上指定实例对象,给出参数即完成计算。基于继承的重用则要求函数类型是多态的,否则继承效用有限。由于我们不知道这个方法为今后的什么类型对象用到,只能把它定为多态的,多态有利于程序扩充。Smalltalk是无类型语言,它的类和子类是包容关系,即子类实例也是父类实例,只要消息模式匹配,即可把方法的体束定于该对象的方法上。寻找匹配(是在动态执行中完成的,称动态束定(Dynamic Binding)。
2、过程式程序设计语言:
过程式程序设计语言是一种为程序设计人员提供准确定义任务执行步骤的语言。在过程式程序设计语言中,程序设计人员可以指定计算机将要执行的详细的算法步骤。有时,也把过程式程序设计语言看成是指令式程序设计语言。所不同的是,过程式程序设计语言中包含了过程调用。在过程式程序设计语言中,可以使用过程或例程或方法来实现代码的重用而不需复制代码。
执行效率:
执行效率都很高是过程式程序的优点。
安全:
过程式语言中的指针和一些宏定义等等给它带来了一定的安全隐患。过程式设计还有一个问题就是其程序架构的依赖关系问题。main()函数依赖于其子函数,这些子函数又依赖于更小的子函数,而在程序中,越小的函数处理的往往是细节实现,这些具体的实现,又常常变化。这样的结果,就是程序的核心逻辑依赖于外延的细节,程序中本来应该是比较稳定的核心逻辑,也因为依赖于易变化的部分,而变得不稳定起来,一个细节上的小小改动,也有可能在依赖关系上引发一系列变动。可以说这种依赖关系也是过程式设计不能很好处理变化的原因之一,而一个合理的依赖关系,应该是倒过来,由细节实现依赖于核心逻辑才对。
表达能力:
逻辑式语言的逻辑表达能力很强,很适合表达人的思维和推理规则。逻辑式语言的基本语句仅有三种,即事实、规则和目标三种类型的语句,且都用谓词表示,因而程序逻辑性强,文法简捷,清晰易懂。另一方面,逻辑式语言也是陈述性语言,一旦给它提交必要的事实和规则之后,它就使用内部的演绎推理机制自动求解程序给定的目标,而不需要在程序中列出详细的求解步骤。
逻辑式程序设计语言:
逻辑程序设计的风格不是描述计算过程而是证明过程。一般构造一个希望的解,证明它就是所希望的解。构造过程就实施了计算。第二个特点是描述性。第三个特点是大量利用表的数据结构和递归。
Prolog程序公理部分是事实和规则(无条件和条件子句),查询是求证目标。它在封闭世界(限于规则和事实库)完成证明的演绎过程。回溯是实现各子目标同时满足的唯一方法。
中间复合值一多费时费空间。如本章所述复杂对象每中间修改一次就要重新生成,通过程序变换减少中间值则可提高效率。
无限表动态生成,计算一次增长一个元素!效率也很低。
并发性:
函数式程序设计的并发性也是值得讨论的,因为并发性是该领域发展的动力之一。函数式语言被认为是非常适用于处理并发性问题的工具,共享值不需加特殊保护,因为他们不会被更新。所以在函数式语言中,显式同步结构是不必要的,并且在分布式实现过程中能随意复制共性,因为并行进程之间不会互相干扰,而这大大简化了推理和测试(在有些并行性应用中,也希望提供非确定性,但通常我们对并行性感兴趣的动机只是它能改善程序运行情况)。
基本特点:
封装→对象(数据和操作)局部性、可维护性
抽象→+类概括描述、简单性
继承→+类体系可重用性
多态→重载、类属可扩充性
动态束定→面向对象可交互性
基于对象的语言基于类的语言面向对象语言
Ada 83, Actor CLUSmalltalk、Eiffel
simula 67 C++, Ada 95, Java
基本特点:
一种自上而下的设计方法,以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。
表达能力:
过程式语言的表达能力很强,有丰富的运算符,应用范围广,并且数据类型丰富,除了一些基本数据类型外,还可以构造结构体类型、共用体类型等新的数据类型,能用来实现各种复杂的数据结构的运算。过程式语言一般都可以完成通常要由机器指令来实现的普通的算术及逻辑运算,还可以直接处理字符、数字、地址,能进行位操作,能实现汇编语言的大部分功能。
面向对象语言在安全性方面有自己的改进,但也存在自己的弊端,它的安全机制是基于不要相信任何东西的前提下的。
并发:
向对象语言主要并发机制有会合,多原语等。
类型系统:
面向对象语言中对复杂对象的操作,可由用户定义,即可定义构造子、析构子的函数体。面向对象语言要动态(在运行中)生成实例对象,这就要求在类定义时,也定义本类如何生成实例对象的构造子。面向对象语言的包容多态比较复杂。在面向对象的对象继承中,父类的类属域外延包容所有子类域。自然,父类定义的操作适用于子类域中的对象,而子类域上定义的操作不能用于父对象。面向对象中派送分辨的函数体是动态运行中完成的(如C++),这是因为直接使用类属对象程序表达能力强得多。
总的来说,过程式的程序设计是一种自上而下的设计方法,设计者用一个main函数概括出整个应用程序需要做的事,而main函数由对一系列子函数的调用组成。对于main中的每一个子函数,都又可以再被精炼成更小的函数。重复这个过程,就可以完成一个过程式的设计。其特征是以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。
函数式程序的功能并不依赖于特殊表达式的计算和程序的其它部分是否并行地执行。许多研究人员正设法使编译程序能够识别哪些表达式可被同时求值,以代替程序员来作这种判断。
安全:
函数式语言由于广泛采用懒求值,所以安全性较高。函数测试的表达式对也很多,这样顺序求下去,也保证了一定的安全性。
类型系统:
逻辑式语言中的类型系统,一般是基于带参数多态的多类逻辑。类型系统的引入使逻辑式语言的表达能力大大提高,并且支持抽象数据类型。
并发:
过程式语言的并发机制主要有会合,异步发送。
类型系统:
对于过程式语言和面向对象语言,都有顺序、条件、循环三种控制语句。过程式程序语言中多类型的雏型是联合和变体记录,程序根据运行中判别式的值自动呈现结构不同的类型,但在引用和处理中还要显式指明处理的是哪个类型变体。以便静态编译。过程式语言在处理变长数组时效率不高。
子句逻辑的不可判定性要求规则和查询用非反条件,且慎用not操作。
Prolog的优点是自文档性、非过程性、逻辑表达能力强。描述性使程序清晰、具有潜在的并行性。Prolog的缺点是只适合较小程序。计算效率不高。
基本特点:
逻辑程序设计的基本观点是程序描述的是数据对象之间的关系,它的抽象层次更高而不限于函数(映射)关系。关系也是联系,对象和对象、对象和属性的联系就是我们所说的事实。事实之间的关系以规则表述,根据规则找出合乎逻辑的事实就是推理。因此,逻辑程序设计范型是陈述事实,制定规则,程序设计就是构造证明。程序的执行就在推理,和传统程序设计范型有较大的差异。
执行效率:
它的缺点是运行效率低。
安全:
逻辑式语言的非过程性和没有“隐藏的语义”使程序更具有安全性。即程序员控制整个程序比较方便,且不需了解更多实现细节。
并发:
逻辑式语言由于它的非过程性,成为潜在并行程序设计语言的候选者。
类型系统:
逻辑式语言中的类型系统,一般是基于带参数多态的多类逻辑。类型系统的引入使逻辑式语言的表达能力大大提高,并且支持抽象数据类型。
函数式程序设计语言:
表达能力:
函数式程序设计语言在表达能力方面有三个显著特点:一是若一个表达式有定义,则表达式的最后结果与其计算次序无关,二是构造数据的能力强,把整个数据结构看作是简单值传送,三是建立高阶函数的能力强,高阶函数(即函数的函数)可使程序简洁、清晰。它的缺点是运行效率低。
效Leabharlann Baidu:
除了难以模拟状态而外,效率普遍认为是函数式语言的大问题,到目前为止虽然新语言版本在效率问题上作了许多改进,从过去比顺序的命令式语言慢200-1000倍到近来的3-5倍,其原因是:
过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法和大多数人的思维方式比较接近。然而,过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的时候,往往显得力不从心。这是因为过程式的设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的时候,要做到这一点会比较困难,而当开发中需求变化的时候,以前对问题的理解也许会变得不再适用。事实上,开发一个系统的过程往往也是一个对系统不断了解和学习的过程,而过程式的设计方法忽略了这一点。
由以上表中可以看出,这五个特征对“面向对象”是缺一不可的。
表达能力:
面向对象语言有4个主要特点:认识性、类别性、多态性、继承性,它们和动态绑定的结合使用,体现出面向对象语言强大的表达能力。
执行效率:
面向对象语言中,c++的执行效率也比较高,但是诸如java语言,由于是解释执行,需要生成中间代码,所以效率相对来说较低。
函数是第一类对象,局部于它的数据一般要在堆(heap)上分配,为了避免悬挂引用,要有自动重配的检查。
无类型(如LISP)要在运行中检查类型,即使是强类型的(如ML,Miranda)减少了类型动态检查,但函数式语言天然匹配选择模式的途径也是运行低效原因。
懒求值开销大:每次用到函数的参数,每次从复合值中选出一个值时都要进行检查,以免出现未求值的表达式。在急求值的语言中,(如命令式的)就不需这种检查。ML也采用急求值。
SY10DF112刘倩
四种程序语言比较
1、面向对象程序设计语言
面向对象是在传统语言和软件技术基础上发展起来的:结构化程序表达导致了对封装、局部性的重视。比过程/函数上一层的封装使之成为可表达高层语义的程序对象。抽象数据类型是程序设计语言的重要发展。有了ADT程序员可以显式定自己的构件(component)类型,即新类型,以它为半成品构筑自己的应用。封装性和自主性必然导致继承机制的出现,因为各自为政的封装必然导致大量相同的机制重复定义,不利于维护。然而,继承又为构件重用大开方便之门。极度的继承应用者几乎不用编程序。只要在窗口上指定实例对象,给出参数即完成计算。基于继承的重用则要求函数类型是多态的,否则继承效用有限。由于我们不知道这个方法为今后的什么类型对象用到,只能把它定为多态的,多态有利于程序扩充。Smalltalk是无类型语言,它的类和子类是包容关系,即子类实例也是父类实例,只要消息模式匹配,即可把方法的体束定于该对象的方法上。寻找匹配(是在动态执行中完成的,称动态束定(Dynamic Binding)。
2、过程式程序设计语言:
过程式程序设计语言是一种为程序设计人员提供准确定义任务执行步骤的语言。在过程式程序设计语言中,程序设计人员可以指定计算机将要执行的详细的算法步骤。有时,也把过程式程序设计语言看成是指令式程序设计语言。所不同的是,过程式程序设计语言中包含了过程调用。在过程式程序设计语言中,可以使用过程或例程或方法来实现代码的重用而不需复制代码。
执行效率:
执行效率都很高是过程式程序的优点。
安全:
过程式语言中的指针和一些宏定义等等给它带来了一定的安全隐患。过程式设计还有一个问题就是其程序架构的依赖关系问题。main()函数依赖于其子函数,这些子函数又依赖于更小的子函数,而在程序中,越小的函数处理的往往是细节实现,这些具体的实现,又常常变化。这样的结果,就是程序的核心逻辑依赖于外延的细节,程序中本来应该是比较稳定的核心逻辑,也因为依赖于易变化的部分,而变得不稳定起来,一个细节上的小小改动,也有可能在依赖关系上引发一系列变动。可以说这种依赖关系也是过程式设计不能很好处理变化的原因之一,而一个合理的依赖关系,应该是倒过来,由细节实现依赖于核心逻辑才对。
表达能力:
逻辑式语言的逻辑表达能力很强,很适合表达人的思维和推理规则。逻辑式语言的基本语句仅有三种,即事实、规则和目标三种类型的语句,且都用谓词表示,因而程序逻辑性强,文法简捷,清晰易懂。另一方面,逻辑式语言也是陈述性语言,一旦给它提交必要的事实和规则之后,它就使用内部的演绎推理机制自动求解程序给定的目标,而不需要在程序中列出详细的求解步骤。
逻辑式程序设计语言:
逻辑程序设计的风格不是描述计算过程而是证明过程。一般构造一个希望的解,证明它就是所希望的解。构造过程就实施了计算。第二个特点是描述性。第三个特点是大量利用表的数据结构和递归。
Prolog程序公理部分是事实和规则(无条件和条件子句),查询是求证目标。它在封闭世界(限于规则和事实库)完成证明的演绎过程。回溯是实现各子目标同时满足的唯一方法。
中间复合值一多费时费空间。如本章所述复杂对象每中间修改一次就要重新生成,通过程序变换减少中间值则可提高效率。
无限表动态生成,计算一次增长一个元素!效率也很低。
并发性:
函数式程序设计的并发性也是值得讨论的,因为并发性是该领域发展的动力之一。函数式语言被认为是非常适用于处理并发性问题的工具,共享值不需加特殊保护,因为他们不会被更新。所以在函数式语言中,显式同步结构是不必要的,并且在分布式实现过程中能随意复制共性,因为并行进程之间不会互相干扰,而这大大简化了推理和测试(在有些并行性应用中,也希望提供非确定性,但通常我们对并行性感兴趣的动机只是它能改善程序运行情况)。
基本特点:
封装→对象(数据和操作)局部性、可维护性
抽象→+类概括描述、简单性
继承→+类体系可重用性
多态→重载、类属可扩充性
动态束定→面向对象可交互性
基于对象的语言基于类的语言面向对象语言
Ada 83, Actor CLUSmalltalk、Eiffel
simula 67 C++, Ada 95, Java
基本特点:
一种自上而下的设计方法,以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。
表达能力:
过程式语言的表达能力很强,有丰富的运算符,应用范围广,并且数据类型丰富,除了一些基本数据类型外,还可以构造结构体类型、共用体类型等新的数据类型,能用来实现各种复杂的数据结构的运算。过程式语言一般都可以完成通常要由机器指令来实现的普通的算术及逻辑运算,还可以直接处理字符、数字、地址,能进行位操作,能实现汇编语言的大部分功能。