程序设计语言的谱系

  许多现存的语言都可以基于其计算模型加以分类,归入某些语言族中。图1.1显示了一些常见的语言族。最上面一层区分了说明式语言(其中关注的是计算机做什么)和命令式语言(其中关注计算机如何去做要求它做的事情)。从某种角度看,说明式语言“级别更高”,因此它们更贴近程序员的观点,距离实现者的观点更远一些。当然,命令式语言现在占据着统治地位,主要还是性能的原因。设计说明式语言时,人们既希望摆脱“无关”的实现细节,又希望能保留一些东西,至少能控制算法的基本轮廓。这两种希望之间存在紧张的关系。毕竟,设计出有效算法是计算机科学的最重要的追求。在多大程度上,在哪些问题领域中,我们能期望编译器从很高层的描述出发发现解决问题的好算法,这一问题现在还很不清楚。在计算机不能找出好算法的任何领域里,程序员就必须自己去显式地描述了。
 
             说明式                     
                     函数式                    Lisp/Scheme, ML, Haskell
                     数据流                    Id,Val
                     逻辑式,基于约束的        Prolog, VisiCalc
            命令式
                      冯·诺伊曼                Fortran, Pascal, Basic, C, …
                     面向对象                  Smalltalk, Eiffel, C++, Java
图1.1程序设计语言分类学。请注意,这里的类属并不清晰,而且是有争议的。特别的,一个函数式语言可能又是面向对象的,而且许多作者并不认为函数式语言是说明式语言。
 
说明式和命令式语言族里,又各有几个重要的子类:     
函数式语言采用一种基于递归表示的函数定义的计算模型。它们的灵感来自λ演算,这是由阿罗索·丘奇在20世纪30年代开发的一种计算模型。在本质上,程序被看作是一种从输入到输出的函数,基于一些更简单的函数,通过一种逐步精化的方式定义。属于这一类别的语言包括Lisp、ML和Haskell。
 
数据流语言将计算看成在一些基本的功能结点之间流动的信息(单词)流。这些语言提供了一种内在的并行模型:结点由输入单词的到达触发,能够并发操作。Id和Val是数据流语言的代表,而Val的后继语言之一Sisal则通常被看作是函数式语言。
 
逻辑式或基于限制的语言由命题逻辑得到灵感,它们把计算看作是通过一种目标制导的搜索,设法根据一集逻辑规则找出满足某些特定关系的值。电子表格系统(如VisiCalc、Excel和Lotus
1-2-3 )里的可编程方面也可以说成是这类东西。
 
冯·诺伊曼语言是我们最熟悉的,也是最成功的。这类语言包括了Fortran、Pascal、Basic、C等等,以及所有那些把修改变量的值当作基本计算方式的语言。有时人们说冯·诺伊曼语言是通过副作用完成计算的。函数式语言的基础是具有值的表达式,而冯·诺伊曼语言的基础是语句(特别是赋值),它们通过修改存储器里的值的方式去影响后续计算的进行。
 
  面向对象语言相对更新一些,虽然它们的历史可以追溯到Simula 67。大部分面向对象语言都与冯·诺伊曼语言有很深的渊源,但在存储和计算两方面都采纳了一种更加结构化和分布式的模型。面向对象的语言并不是把计算描绘为一个处理器在一个存储区上的操作,而是看作一些比较独立的对象之间的相互作用,每个对象有其自身的内部状态,以及一些管理这种状态的可执行函数。Smalltalk是一种最纯的面向对象语言,C++使用得更广泛。同样可能设计出面向对象的函数式语言(其中最有名的是Common Lisp的一种扩充,称为CLOS),但它们都倾向于具有很强的命令式味道。
 
有人可能觉得并发语言应该列为单独的一类,但是,并发与顺序执行之间的区分与上面的分类方式几乎是毫无关系的。当前的大部分并发程序,都是用像Fortran或者C这样的顺序语言与并发的程序库和编译器写出来的。也有几种广泛使用的语言(包括Java、Ada和Modula-3)带有显式的并发特征。研究者们实际上在上面提到的各种语言里研究并发性的问题。
 
应该强调指出,语言类之间的划分并不是绝对的。譬如说,在冯·诺伊曼语言与面向对象语言之间的划分就很不明晰,另外,大部分函数式和逻辑式语言里也都有某些命令式的特征。上面的描述只是希望帮助读者了解各个类别的一般性情况,并不想作为一种正式的定义。
 
 
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页