浅谈程序设计语言中四种语言范型的区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈程序设计语言中四种语言范型的区别

byclara

过程式程序设计语言:

•基本观点:计算实现的模型如果按冯·诺依曼原理强制改变内存中的值叫命令(或译指令、强制Imperative式)的。所有过程语言都基于这个原理。由于强制改变值,程序状态的变化没有一定规则,程序大了就很难查错,很难调试,不易证明其正确。组

织程序的范型即: 算法过程+数据结构。到目前软件开发主导语言仍是过程式语言。

近代命令式语言增加了模块强制类型检查、抽象数据类型、类属等机制可开发较安

全、可靠的大程序。命令型范式强调的是一个可以方便解决问题的过程。

•表达上的特点:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。

原始的程序设计范型是:

确定需要哪些过程;

采用能找到的最好的算法。

•执行效率:

执行效率最高

•程序的并发,安全,程序的控制,类型系统:

1.并发性:

支持程序的并发性处理,提供并发线程调度。

2.安全:

安全性不高。其中表现在:1.滥用goto,通过结构化程序设计和限制少量可控制的跳转,已经完全解决。2.悬挂指针,尽可能多用引用和在堆栈框架中分配指针,可消除大量悬挂指针。但引用的对象依然有时、空问题。没有完全解决。3.函数副作用,由于冯·诺依曼机的本质是改变变量的存储从而改变程序状态,但是状态时空效应不可免,副作用不可能消除。

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.类型系统:

有限类型,指针类型,复合类型(数组类型),记录类型,联合类型,集合类型等类型组成的,并可以对这些类型进行操作。

•适用范围:

应用范围非常广,由于效率非常高,通常用来设计需要严格控制执行时间的系统,

同时能够准确的控制系统的存储调度等。

面向对象语言:

•基本观点:将数据和其上的操作封装于对象中。对象归属于类对象,类对象有继承,实例对象上的操作可动态决定。程序是相互发消息通信的对象集合。代表语言有

Simula-67,Smalltalk,支持此范型的典型语言还有EIFFEL,JAVA,C++等。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。我们对面向对象程序设计的定义是“面向对象程序设计是一种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。这样的程序设计方法称为面向对象程序设计。”从以上定义可以看到,一个对象被认为是计算机内存中的一个独立区间,在这个区间中保存着数据和能够访问数据的一组操作。因为内存区间是相互独立的,所以对象可以不经修改就应用于多个不同的程序中。

•表达上的特点:在基于对象程序设计范型的基础上,加入继承和多态这两个组重要的概念就演变出了现在最流行的程序设计方法---面向对象程序设计。

其范型是:

确定需要哪些类;

为每个类提供完整的一组操作;

利用继承去明确地表示共性。

另外,面向对象程序设计的一些显著的特性包括:封装、抽象、继承、多态、动态束定。只有这五个特征全具备才是面向对象程序设计语言。

•执行效率:

由于对程序对象进行了优雅的封装,所以程序执行效率比过程式程序设计语言降低了,比如C++就比C的效率降低了很多。

•程序的并发,安全,程序控制,类型系统:

1.并发性:

并发性很好,很多面向对象的程序设计语言都支持并发性。比如JAVA语言,和EIFFEL语言,均是并发式程序设计语言。

2.安全性:

较高,由于去掉了指针引用,并引入了垃圾回收机制等特点,比过程式程序设计语言要高。

3.程序控制:

程序控制比过程式程序语言更强。

4.类型系统:

封装和继承带来可见性继承问题。原则是不因为类型扩展改变原定义类的可见性。

各语言为此设的机制不同,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.懒求值开销大:每次用到函数的参数,每次从复合值中选出一个值时都要进行检查,以免出现未求值的表达式。在急求值的语言中,

相关文档
最新文档