《2022年浅谈程序设计语言中四种语言范型的区别 .pdf》由会员分享,可在线阅读,更多相关《2022年浅谈程序设计语言中四种语言范型的区别 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、浅谈程序设计语言中四种语言范型的区别byclara 过程式程序设计语言 :?基本观点:计算实现的模型如果按冯 诺依曼原理强制改变内存中的值叫命令(或译指令、强制Imperative 式)的。所有过程语言都基于这个原理。由于强制改变值,程序状态的变化没有一定规则,程序大了就很难查错,很难调试,不易证明其正确。组织程序的范型即: 算法过程 +数据结构。到目前软件开发主导语言仍是过程式语言。近代命令式语言增加了模块强制类型检查、抽象数据类型、类属等机制可开发较安全、可靠的大程序。命令型范式强调的是一个可以方便解决问题的过程。?表达上的特点:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤
2、一步一步实现。原始的程序设计范型是:确定需要哪些过程;采用能找到的最好的算法。?执行效率:执行效率最高?程序的并发,安全,程序的控制,类型系统:并发性:支持程序的并发性处理,提供并发线程调度。安全:安全性不高。其中表现在:.滥用 goto,通过结构化程序设计和限制少量可控制的跳转,已经完全解决。悬挂指针,尽可能多用引用和在堆栈框架中分配指针,可消除大量悬挂指针。但引用的对象依然有时、空问题。没有完全解决。函数副作用,由于冯 诺依曼机的本质是改变变量的存储从而改变程序状态,但是状态时空效应不可免,副作用不可能消除。程序控制:通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后
3、一条语句完全按顺序执行,是简单的顺序结构;在程序执行过程当中,根据用户的输入或中间结果去执行若干不同的任务则为选择结构;如果在程序的某处,需要根据某项条件重复地执行某项任务若干次或直到满足或不满足某条件为止,这就构成循环结构。过程式程序设计语言并不是只有简单的顺序结构,而是顺序、选择、循环三种结构的复杂组合。其中,选择控制语句如:i f ;s w i t c h 、c a s e,循环控制语句如:f o r、w h i l e、d o.w h i l e ,转移控制语句如:b r e a k、c o n t i n u e、g o t o。类型系统:有限类型,指针类型,复合类型(数组类型),记
4、录类型,联合类型,集合类型等类型组成的,并可以对这些类型进行操作。?适用范围:应用范围非常广,由于效率非常高,通常用来设计需要严格控制执行时间的系统,同时能够准确的控制系统的存储调度等。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 面向对象语言 :?基本观点: 将数据和其上的操作封装于对象中。对象归属于类对象,类对象有继承,实例对象上的操作可动态决定。程序是相互发消息通信的对象集合。代表语言有Simula-67 , Small
5、talk,支持此范型的典型语言还有EIFFEL,JAVA,C+等。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。我们对面向对象程序设计的定义是“面向对象程序设计是一种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。这样的程序设计方法称为面向对象程序设计。” 从以上定义可以看到,一个对象被认为是计算机内存中的一个独立区间,在这个区间中保存着数据和能够访问数据的一组操作。因为内存区间是相互独立的,所以对象可以不经修改就应用于多个不同的程序中。?表达上的特点:在
6、基于对象程序设计范型的基础上,加入继承和多态这两个组重要的概念就演变出了现在最流行的程序设计方法- 面向对象程序设计。其范型是:确定需要哪些类;为每个类提供完整的一组操作;利用继承去明确地表示共性。另外,面向对象程序设计的一些显著的特性包括:封装、抽象、继承、多态、动态束定。只有这五个特征全具备才是面向对象程序设计语言。?执行效率:由于对程序对象进行了优雅的封装,所以程序执行效率比过程式程序设计语言降低了,比如C+ 就比 C的效率降低了很多。?程序的并发,安全,程序控制,类型系统:并发性:并发性很好,很多面向对象的程序设计语言都支持并发性。比如语言,和语言,均是并发式程序设计语言。安全性:较高
7、,由于去掉了指针引用,并引入了垃圾回收机制等特点,比过程式程序设计语言要高。程序控制:程序控制比过程式程序语言更强。类型系统:封装和继承带来可见性继承问题。原则是不因为类型扩展改变原定义类的可见性。各语言为此设的机制不同,C+较死, Eiffel较活, Ada居中。强类型语言编译后即要束定,实现动态束定的比较麻烦,解决的办法是留出束定表,编译时只作缺省束定,每当新派生一类型即往其中注册(常指针指向该例化类型的地址),使用该操作时按结合类型特征值派送。显然,派送表要留到运行时。Ada 是标签值, C+ 是子类(型)名, Eiffel是实体名。为此,C+ 设虚函数机制。?适用范围:面向对象程序语言
8、以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是面向对象设计方法最主要的特点和成就。面向对象设名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。但是由于有些面向对象程序语言有垃圾回收机制等特点,所以不能应用于高
9、实时性的系统。函数式语言 :?基本观点:程序对象是函数及高阶函数,组织程序的范型是函数定义及引用。代表语言有LISP、FP 、ML 、Miranda 。函数式范型使程序员集中于把问题的解决用较小的问题的解来描述。传统程序设计语言中的赋值等概念,在函数式程序设计语言中消失。 函数式程序的一个最本质的特性,就是函数值唯一地由其参数值所确定。只要使用相同的参数值,对此程序的不同的调用总是得到相同的结果。这种性质称为引用透明性,有助于程序的模块化。函数式程序设计语言具有较强的组织数据结构的能力, 可以把某一数据结构(如数组) 作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数称为高阶
10、函数。这些由函数表达式所表示的程序简明、紧凑和易于维护。过去,这种程序设计称为应用性程序设计。1977 年, J.巴克斯提出函数式程序设计的概念。一般认为表处理语言(LISP) 是最早的函数式程序设计语言。但是,LISP 的重点是将函数应用于对象,以产生新的对象,必要时再上升为函数。巴克斯所提出的函数式程序设计,则是引用函数型产生新函数,程序设计时从一般的对象空间上升到函数空间,因而具有优越的数学性质,有助于程序的理解、推理和验证。?表达上的特点:1严禁破坏性赋值通过以下四种方法实现:1 存储计算子表达式的中间结果。全局符号即按 演算的符号,声明时给出,参数名束定于变元表达式。where 子句
11、内的是局部符号名, 整个的 where 部分以堆栈帧实现, 局部名存放中间计算结果。where可嵌套产生块结构的名字束定。这样就可以达到存储计算子表达式的中间结果2条件语句的重要组成。用条件表达式完全可以代替条件语句,其返回值通过参数束定或 where 子句束定于名字,以此来实现 3 用于循环控制变量。实现方式如下: 函数式语言都要定义表数据结构,因为归约和递归计算在表上很方便。对整个表操作实则是隐式迭代,不用循环控制变量。对于顺序值也都用表写个映射函数即可隐式迭代。即以递归来代替while_do 。4 处理复杂数据结构(增删改某个成分) 。2完全不考虑语句顺序:用嵌套代替语义相关的顺序,用懒
12、求值代替顺序,利用卫式进一步消除顺序性3全部采用懒求值?执行效率:执行效率较低。效率普遍认为是函数式语言的大问题,到目前为止虽然新语言版本在效率问题上作了许多改进,从过去比顺序的命令式语言慢200-1000 倍到近来的3-5 倍。原因如下: 1. 函数是第一类对象,局部于它的数据一般要在堆(heap) 上分配,为了避免悬挂引用,要有自动重配的检查。2. 无类型 ( 如 LISP) 要在运行中检查类型,即使是强类型的 ( 如 ML ,Miranda) 减少了类型动态检查,但函数式语言天然匹配选择模式的途径也是运行低效原因。3. 懒求值开销大:每次用到函数的参数,每次从复合值中选出一个值时都要进行
13、检查,以免出现未求值的表达式。在急求值的语言中,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - ( 如命令式的 ) 就不需这种检查。ML也采用急求值。4. 中间复合值一多费时费空间。如本章所述复杂对象每中间修改一次就要重新生成,通过程序变换减少中间值则可提高效率。 5. 无限表动态生成,计算一次增长一个元素!效率也很低。?程序的并发,安全,程序控制,类型系统:并发性好:函数式语言被认为是非常适用于处理并发性问题的工具,共享值不需
14、加特殊保护,因为他们不会被更新。所以在函数式语言中,显式同步结构是不必要的,并且在分布式实现过程中能随意复制共性,因为并行进程之间不会互相干扰,而这大大简化了推理和测试。安全:使用懒求值来保证安全性。程序控制:从数学的指称意义上对程序进行控制。命令语言程序是有破坏性赋值的。恰巧出错都在这里。以表达式和嵌套表达式代替语句组就避免了赋值的武断性。内嵌套表达式的结果值又作外套表达式变元,即数据一直在有规则的表达式之间传递,不涉及具体环境和实现,这就是所谓引用透明性原理。虽然仍在同一环境的运算器、存储器上实现,只借用它的计算和存放中间值和结果值的功能。所以可以从数学的指称意义上控制整个程序。类型系统:
15、以 Miranda 为例,基本类型有字符(char类型,加单引号的字母) , 真值 (bool类型,值为 True 和 False) 和数 (num类型,包括整数、实数) 。数据结构只有表和元组,串是字符表,串字面量可以用双引号括着的字符串,也可以写作字符表。?适用范围:由于函数式程序设计语言的简明性和独特的表达能力,可用它来研究传统程序设计语言的语义。 一种方法是用于确定一个解释程序的定义,作为被研究的语言的语义;另一种方法是将被研究的语言写成的程序转换成与之等价的函数式程序。在人工智能领域中,需要用复杂的算法去处理一些复杂的(通常是符号的)数据结构。LISP语言成功地应用于这一领域,说明了
16、函数式程序设计的独特优越性。巴克斯分析了传统程序设计语言的缺陷,认为这些缺陷主要是由于诺伊曼式系统结构所造成的。他所提出的函数式程序设计( 简称 FP),摆脱了传统的诺伊曼计算机结构,需要一种新的非诺伊曼式的系统结构为后援。一些具有新概念的计算机,如归约机、数据流机,以及专为某种函数式语言(如FP)设计的计算机正在研究和发展中。现代既需要研究在诺伊曼式计算机上如何更有效地实现函数式程序设计语言的问题,也需要研究适应这种语言的新型计算机结构。逻辑式语言 :?基本观点: 程序对象是常量,变量和谓词、组织程序的范型是定义谓词并写引用谓词的公式,并构造满足谓词的事实库和约束关系库。代表语言有Prolo
17、g 。逻辑程序设计的基本观点是程序描述的是数据对象之间的关系,它的抽象层次更高而不限于函数 ( 映射 ) 关系。关系也是联系,对象和对象、对象和属性的联系就是我们所说的事实。事实之间的关系以规则表述,根据规则找出合乎逻辑的事实就是推理。因此,逻辑程序设计范型是陈述事实,制定规则,程序设计就是构造证明。程序的执行就在推理,和传统程序设计范型有较大的差异。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - ?表达上的特点:基于自动定理证
18、明的逻辑语言,有其独特的程序设计风格1证明性:因为它不描述计算过程而是描述证明过程。例如,有一个问题: 对数组 A按升序排序, 我们怎样编逻辑程序呢?我们只好构造一个和A那样大的数组B,而且它是排好升序的,我们证明命题: “存在一个数组B它是数组A重排升序”。2描述性:这个程序是用Prolog写的,我们虽未介绍它的语法,一经简单解释我们即可读懂该程序。它的风格是: 若要 A成立,做 B ,做 C,做 D,, 再细化,若要B做出则要做P,做 Q,做 R,, 这与过程式语言自顶向下描述没什么差别,且比较自由,没有严格的顺序性。 当然程序执行还需有事实的陈述,以及需求证明的查询。下面给出一个小例子:
19、求平均成绩的逻辑程序打开一分数文件scores,读入分数求和并用的数N 除之得平均成绩。要使求平均成绩程序正确,必先打开(see)文件,从中得到输入,得N 个数的总和记以 N 和 Sum, 关闭 (seen)文件后求平均值Av, 打印之。 至于如何得到Sum 和 N,细化谓词getinput(_,_)。若要 getinput 成立,先读入一原子X(ratom 是系统提供的谓词 )。若未至文件末尾,读其余分数并求和。getinput 是递归定义,并相应断言Sum ,N 和 Sum1,N1 的关系。如果已至文件结束标记eof 则输入为 (0,0)。这个程序为求平均分数给出三条规则, , 号即子句的
20、 连接,意即所有子句为真,左端谓词才成立。3使用表和递归描述:逻辑程序第三个特点是大量用表和递归实现重复操作,递归特别利于谓词描述,我们只要能说明特征谓词的一步动作为真,其余如法炮制,程序就设计完了,上例中,getinput,读一数 X,求和并令门数加1,其余照做。?执行效率: 以经典的逻辑式程序设计语言Prolog 为例,尽管由于编译技术的改进( 有了编译的非解释型Prolog) ,Prolog程序的效率由于依靠参数束定的合一匹配,它的效率仍不及传统过程语言。也正是由于它的声明性质,程序员在优化算法时作用有限。因为它的基本推理算法是确定的,且程序正文看不出计算过程,以不变的递归下降算法应万变
21、,当然就没有过程式语言设计精巧算法效率高。?程序的并发,安全,程序控制,类型系统:以典型的逻辑程序设计语言Prolog 为例:average:-see(scores) ,getinput (Sum,N),seen (scores) ,Av is Sum /N,print (Average = ,Av) getinput (Sum,N):-ratom (X) ,not (eof),getinput (Sum1,N1) ,Sum is Sum1 + X,N is N11. getinput (0,0):-eof. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
22、 - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 1很高的并发性:在程序员尚不清楚如何组织数据和计算过程的应用中,Prolog有极大优势,因为它证明的是后果而不是过程,且对程序的顺序性要求不严。只陈述应如何如何,要如何如何,并未详细安排计算过程。正是由于非过程性,它也成为潜在的并行程序设计语言的候选者,所以,当今在高度并发的连接机(Connection Machine) 上,采用Prolog 作为软件语言。2. 很高的安全性 :Prolog程序具有自文档性,由于论域直接就是问题域,谓词清晰描述了论域对象的特征与关
23、系,而实现是单一的递归下降匹配算法。没有影响描述的过多实现细节,自文档性好是必然的。它的非过程性和没有“隐藏的语义”使程序更具有安全性。即程序员控制整个程序比较方便,且不需了解更多实现细节。3. 程序控制:并不关注程序控制的部分,注重程序中证明部分,将逻辑和控制分开的正交性简化了正确性证明,因为程序员只需关注证明的逻辑部分,而优化控制提高效率并不影响证明的正确性。4类型系统:通常对类型要求不严格,例如:Prolog 是无类型的,程序是理论,可以对应多个模型( 也可以没有 ) ,因而原子在不同模型中是不同的对象。?适用范围:一般的逻辑程序设计语言(以prolog为例) (具有自文档性、非过程性、逻辑表达能力强。描述性使程序清晰、 具有潜在的并行性。 Prolog的缺点是只适合较小程序。计算效率不高。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -