




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浅谈程序设计语言中四种语言范型的区别byclara过程式程序设计语言: 基本观点:计算实现的模型如果按冯诺依曼原理强制改变内存中的值叫命令(或译指令、强制Imperative式)的。所有过程语言都基于这个原理。由于强制改变值,程序状态的变化没有一定规则,程序大了就很难查错,很难调试,不易证明其正确。组织程序的范型即: 算法过程+数据结构。到目前软件开发主导语言仍是过程式语言。近代命令式语言增加了模块强制类型检查、抽象数据类型、类属等机制可开发较安全、可靠的大程序。命令型范式强调的是一个可以方便解决问题的过程。 表达上的特点:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。原始的程序设计范型是: 确定需要哪些过程; 采用能找到的最好的算法。 执行效率:执行效率最高 程序的并发,安全,程序的控制,类型系统:并发性:支持程序的并发性处理,提供并发线程调度。安全:安全性不高。其中表现在:.滥用goto,通过结构化程序设计和限制少量可控制的跳转,已经完全解决。 悬挂指针,尽可能多用引用和在堆栈框架中分配指针,可消除大量悬挂指针。但引用的对象依然有时、空问题。没有完全解决。函数副作用,由于冯诺依曼机的本质是改变变量的存储从而改变程序状态,但是状态时空效应不可免,副作用不可能消除。程序控制:通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后一条语句完全按顺序执行,是简单的顺序结构;在程序执行过程当中,根据用户的输入或中间结果去执行若干不同的任务则为选择结构;如果在程序的某处,需要根据某项条件重复地执行某项任务若干次或直到满足或不满足某条件为止,这就构成循环结构。过程式程序设计语言并不是只有简单的顺序结构,而是顺序、选择、循环三种结构的复杂组合。其中,选择控制语句如: 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。类型系统:有限类型,指针类型,复合类型(数组类型),记录类型,联合类型,集合类型等类型组成的,并可以对这些类型进行操作。 适用范围:应用范围非常广,由于效率非常高,通常用来设计需要严格控制执行时间的系统,同时能够准确的控制系统的存储调度等。面向对象语言: 基本观点:将数据和其上的操作封装于对象中。对象归属于类对象,类对象有继承,实例对象上的操作可动态决定。程序是相互发消息通信的对象集合。代表语言有Simula-67,Smalltalk,支持此范型的典型语言还有EIFFEL,JAVA,C+等。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。我们对面向对象程序设计的定义是“面向对象程序设计是一种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。这样的程序设计方法称为面向对象程序设计。”从以上定义可以看到,一个对象被认为是计算机内存中的一个独立区间,在这个区间中保存着数据和能够访问数据的一组操作。因为内存区间是相互独立的,所以对象可以不经修改就应用于多个不同的程序中。 表达上的特点:在基于对象程序设计范型的基础上,加入继承和多态这两个组重要的概念就演变出了现在最流行的程序设计方法-面向对象程序设计。其范型是: 确定需要哪些类; 为每个类提供完整的一组操作; 利用继承去明确地表示共性。另外,面向对象程序设计的一些显著的特性包括:封装、抽象、继承、多态、动态束定。只有这五个特征全具备才是面向对象程序设计语言。 执行效率:由于对程序对象进行了优雅的封装,所以程序执行效率比过程式程序设计语言降低了,比如C+就比C的效率降低了很多。 程序的并发,安全,程序控制,类型系统:并发性:并发性很好,很多面向对象的程序设计语言都支持并发性。比如语言,和语言,均是并发式程序设计语言。安全性:较高,由于去掉了指针引用,并引入了垃圾回收机制等特点,比过程式程序设计语言要高。程序控制:程序控制比过程式程序语言更强。类型系统:封装和继承带来可见性继承问题。原则是不因为类型扩展改变原定义类的可见性。各语言为此设的机制不同,C+较死,Eiffel较活,Ada居中。强类型语言编译后即要束定,实现动态束定的比较麻烦,解决的办法是留出束定表,编译时只作缺省束定,每当新派生一类型即往其中注册(常指针指向该例化类型的地址),使用该操作时按结合类型特征值派送。显然,派送表要留到运行时。Ada是标签值,C+是子类(型)名,Eiffel是实体名。为此,C+设虚函数机制。 适用范围:面向对象程序语言以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是面向对象设计方法最主要的特点和成就。面向对象设计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。但是由于有些面向对象程序语言有垃圾回收机制等特点,所以不能应用于高实时性的系统。函数式语言: 基本观点:程序对象是函数及高阶函数,组织程序的范型是函数定义及引用。代表语言有LISP、FP、ML、Miranda。函数式范型使程序员集中于把问题的解决用较小的问题的解来描述。传统程序设计语言中的赋值等概念,在函数式程序设计语言中消失。函数式程序的一个最本质的特性,就是函数值唯一地由其参数值所确定。只要使用相同的参数值,对此程序的不同的调用总是得到相同的结果。这种性质称为引用透明性,有助于程序的模块化。函数式程序设计语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数称为高阶函数。这些由函数表达式所表示的程序简明、紧凑和易于维护。过去,这种程序设计称为应用性程序设计。1977年,J.巴克斯提出函数式程序设计的概念。一般认为表处理语言(LISP)是最早的函数式程序设计语言。但是,LISP的重点是将函数应用于对象,以产生新的对象,必要时再上升为函数。巴克斯所提出的函数式程序设计,则是引用函数型产生新函数,程序设计时从一般的对象空间上升到函数空间,因而具有优越的数学性质,有助于程序的理解、推理和验证。 表达上的特点:1严禁破坏性赋值通过以下四种方法实现:1存储计算子表达式的中间结果。全局符号即按演算的符号,声明时给出,参数名束定于变元表达式。where子句内的是局部符号名,整个的where部分以堆栈帧实现,局部名存放中间计算结果。where可嵌套产生块结构的名字束定。这样就可以达到存储计算子表达式的中间结果2 条件语句的重要组成。用条件表达式完全可以代替条件语句,其返回值通过参数束定或where子句束定于名字,以此来实现3 用于循环控制变量。实现方式如下:函数式语言都要定义表数据结构,因为归约和递归计算在表上很方便。对整个表操作实则是隐式迭代,不用循环控制变量。对于顺序值也都用表写个映射函数即可隐式迭代。即以递归来代替while_do。4 处理复杂数据结构(增删改某个成分)。2完全不考虑语句顺序:用嵌套代替语义相关的顺序,用懒求值代替顺序,利用卫式进一步消除顺序性3全部采用懒求值 执行效率:执行效率较低。效率普遍认为是函数式语言的大问题,到目前为止虽然新语言版本在效率问题上作了许多改进,从过去比顺序的命令式语言慢200-1000倍到近来的3-5倍。原因如下:1.函数是第一类对象,局部于它的数据一般要在堆(heap)上分配,为了避免悬挂引用,要有自动重配的检查。2.无类型(如LISP)要在运行中检查类型,即使是强类型的(如ML,Miranda)减少了类型动态检查,但函数式语言天然匹配选择模式的途径也是运行低效原因。 3.懒求值开销大: 每次用到函数的参数,每次从复合值中选出一个值时都要进行检查,以免出现未求值的表达式。在急求值的语言中,(如命令式的)就不需这种检查。ML也采用急求值。4.中间复合值一多费时费空间。如本章所述复杂对象每中间修改一次就要重新生成,通过程序变换减少中间值则可提高效率。5.无限表动态生成,计算一次增长一个元素! 效率也很低。 程序的并发,安全,程序控制,类型系统:并发性好:函数式语言被认为是非常适用于处理并发性问题的工具,共享值不需加特殊保护,因为他们不会被更新。所以在函数式语言中,显式同步结构是不必要的,并且在分布式实现过程中能随意复制共性,因为并行进程之间不会互相干扰,而这大大简化了推理和测试。安全:使用懒求值来保证安全性。程序控制:从数学的指称意义上对程序进行控制。命令语言程序是有破坏性赋值的。恰巧出错都在这里。以表达式和嵌套表达式代替语句组就避免了赋值的武断性。内嵌套表达式的结果值又作外套表达式变元,即数据一直在有规则的表达式之间传递,不涉及具体环境和实现,这就是所谓引用透明性原理。虽然仍在同一环境的运算器、存储器上实现,只借用它的计算和存放中间值和结果值的功能。所以可以从数学的指称意义上控制整个程序。类型系统:以Miranda为例,基本类型有字符(char类型,加单引号的字母),真值(bool类型,值为True和False)和数(num 类型,包括整数、实数)。数据结构只有表和元组,串是字符表,串字面量可以用双引号括着的字符串,也可以写作字符表。 适用范围:由于函数式程序设计语言的简明性和独特的表达能力,可用它来研究传统程序设计语言的语义。一种方法是用于确定一个解释程序的定义,作为被研究的语言的语义;另一种方法是将被研究的语言写成的程序转换成与之等价的函数式程序。在人工智能领域中,需要用复杂的算法去处理一些复杂的(通常是符号的)数据结构。LISP语言成功地应用于这一领域,说明了函数式程序设计的独特优越性。巴克斯分析了传统程序设计语言的缺陷,认为这些缺陷主要是由于诺伊曼式系统结构所造成的。他所提出的函数式程序设计(简称FP),摆脱了传统的诺伊曼计算机结构,需要一种新的非诺伊曼式的系统结构为后援。一些具有新概念的计算机,如归约机、数据流机,以及专为某种函数式语言(如FP)设计的计算机正在研究和发展中。现代既需要研究在诺伊曼式计算机上如何更有效地实现函数式程序设计语言的问题,也需要研究适应这种语言的新型计算机结构。逻辑式语言: 基本观点:程序对象是常量,变量和谓词、组织程序的范型是定义谓词并写引用谓词的公式,并构造满足谓词的事实库和约束关系库。代表语言有Prolog。逻辑程序设计的基本观点是程序描述的是数据对象之间的关系,它的抽象层次更高而不限于函数(映射)关系。关系也是联系,对象和对象、对象和属性的联系就是我们所说的事实。事实之间的关系以规则表述,根据规则找出合乎逻辑的事实就是推理。因此,逻辑程序设计范型是陈述事实,制定规则,程序设计就是构造证明。程序的执行就在推理,和传统程序设计范型有较大的差异。 表达上的特点:基于自动定理证明的逻辑语言,有其独特的程序设计风格1证明性:因为它不描述计算过程而是描述证明过程。例如,有一个问题: 对数组A按升序排序,我们怎样编逻辑程序呢? 我们只好构造一个和A那样大的数组B,而且它是排好升序的,我们证明命题: “存在一个数组B它是数组A重排升序”。2描述性:这个程序是用Prolog写的,我们虽未介绍它的语法,一经简单解释我们即可读懂该程序。它的风格是: 若要A成立,做B,做C,做D,再细化,若要B做出则要做P,做Q,做R,这与过程式语言自顶向下描述没什么差别,且比较自由,没有严格的顺序性。当然程序执行还需有事实的陈述,以及需求证明的查询。下面给出一个小例子:求平均成绩的逻辑程序 打开一分数文件scores,读入分数求和并用的数N除之得平均成绩。 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. 要使求平均成绩程序正确,必先打开(see)文件,从中得到输入,得N个数的总和记以N和Sum,关闭(seen)文件后求平均值Av,打印之。至于如何得到Sum和N,细化谓词getinput(_,_)。若要getinput成立,先读入一原子X(ratom是系统提供的谓词)。若未至文件末尾,读其余分数并求和。getinput是递归定义,并相应断言Sum ,N和Sum1,N1的关系。如果已至文件结束标记eof则输入为(0,0)。这个程序为求平均分数给出三条规则,号即子句的连接,意即所有子句为真,左端谓词才成立。3使用表和递归描述:逻辑程序第三个特点是大量用表和递归实现重复操作,递归特别利于谓词描述,我们只要能说明特征谓词的一步动作为真,其余如法炮制,程序就设计完了,上例中,getinput,读一数X,求和并令门数加1,其余照做。 执行效率:以经典的逻辑式程序设计语言Prolog为例,尽管由于编译技术的改进(有了编译的非解释型Prolog),Prolog程序的效率由于依靠参数束定的合一匹配,它的效率仍不及传统过程语言。也正是由于它的声明性质,程序员在优化算法时作用有限。因为它的基本推理算法是确定的,且程序正文看不出计算过程,以不变的递归下降算法应万变,当然就没有过程式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建福州地铁2号线社会招聘笔试历年参考题库附带答案详解
- 2025甘肃张掖市供水总公司招聘合同制人员10人笔试历年参考题库附带答案详解
- 2025杭州大有供电服务有限公司招聘115人模拟试卷及答案详解(易错题)
- 2025年内江市市本级部分事业单位公开考核招聘工作人员(第二批)的模拟试卷及答案详解(各地真题)
- 2025年4月广东深圳市第二特殊教育学校面向2025年应届毕业生赴外招聘教师4人模拟试卷及一套答案详解
- 2025国家电网内蒙古新正产业发展有限公司高校毕业生招聘41人(第三批)模拟试卷及答案详解(夺冠)
- 2025年宁德市供电服务有限公司招聘30人模拟试卷及完整答案详解一套
- 2025江苏淮安市洪泽经济开发区投资控股集团有限公司招聘考前自测高频考点模拟试题及答案详解(必刷)
- 2025大唐锡林浩特电厂招聘专职消防员1人模拟试卷(含答案详解)
- 安徽省濉溪县2026届八年级数学第一学期期末联考模拟试题含解析
- 《光伏发电工程工程量清单计价规范》
- 胆囊炎胆囊结石教学查房课件
- 【岩土工程施工技术实践实验报告2800字】
- 师宗县城市生活垃圾处理工程项目环评报告
- 中枢神经系统-脑梗死的影像表现(医学影像诊断学课件)
- DB14-T 2555-2022 费托合成异构烷烃生产规范
- 湖南省“西学中”人才培训项目申请审批表
- 【精】8 美丽文字 民族瑰宝 (课件)2023学年五年级上册道德与法治(部编版)
- YY/T 0801.2-2010医用气体管道系统终端第2部分:用于麻醉气体净化系统的终端
- YS/T 798-2012镍钴锰酸锂
- GB 29224-2012食品安全国家标准食品添加剂乙酸乙酯
评论
0/150
提交评论