《程序分析方法》——1.1 程序设计语言发展的四个阶段

简介: 本节书摘来自华章计算机《程序分析方法》一书中的第1章,第1.1节,作者:刘磊等著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.1 程序设计语言发展的四个阶段

  到目前为止,程序设计语言的发展经过了机器语言、汇编语言、高级语言、第四代语言四个阶段,每一个阶段都使程序设计的效率大大提高。我们常常把机器语言称为第
一代程序设计语言,把汇编语言称为第二代程序设计语言,把高级语言称为第三代程序设计语言,把最新的程序设计语言称为第四代语言。
1.1.1 机器语言
  机器语言是计算机能直接识别和执行的一组机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。一条机器指令就是机器语言的一个语句,它是一组有意义的二进制代码。每条机器指令一般由操作码和地址码两部分构成,其中操作码说明指令的含义,地址码说明操作数的地址。机器语言程序能够在对应型号的计算机上直接运行。
  【例1.1】 若计算:

![image](https://yqfile.alicdn.com/23ba8ecb08509597c3b455a47bcaf47b8b9c9412.png)

用Pentium机器语言可编出如下程序片段(设程序从100号单元开始;X、Y分别占用116、118号单元)。

                 1010 1001 0001 0110 0000 0001
                 0011 1100 0001 1000 0000 0001
                 0111 1100 0000 0101
                 0010 1101 0001 0101 0000 0000
                 1110 1010 0000 0011
                 0000 0101 0001 0101 0000 0000
                 1010 0011 0001 1000 0000 0001
                 …  …  …  …  …  …  …
                 0000 0000 0000 0000
                 0000 0000 0000 0000

从上面的例子可以看出:

  • 用机器语言进行程序设计比较烦琐。首先,程序员要熟记所用计算机的全部指令集及每条指令的含义;其次,在程序编写过程中,程序员要自己处理每条指令和每一数据的存储分配和输入/输出,还要记住每步中所使用的工作单元处于何种状态。由于程序员既要驾驭程序全局又要深入每个局部细节,因此程序的开发周期长、可靠性差。
  • 机器语言编写出的程序都是由0和1构成的符号串,可读性差,还容易出错,不易交流和维护。
  • 机器语言编程的思维及表达方式与程序员日常的思维和表达方式差距较大,程序员需要经过长期的训练才能胜任。
  • 机器语言程序设计严重依赖于具体计算机的指令集,编写出的程序可移植性差、重用性差。

  基于上述原因,人们引进了汇编语言。
1.1.2 汇编语言
  鉴于机器语言编程的烦琐,为减小程序员在编程中的劳动强度,20世纪50年代中期,人们开始用一些“助记符号”来代替0、1码编程,即用助记符代替机器指令中的操作码,用地址符号或标号代替机器指令中的地址码,将机器语言变成了汇编语言。汇编语言也称符号语言,即符号化的机器语言,提高了程序的可读性和程序开发效率。
  完成例1.1中同样的计算,Pentium汇编语言程序片段如下:

                     MOV    AX    ,X
                     CMP    AX    ,Y
                     JL        S1
                     SUB        AX    ,15
                     JMP        S2
                  S1:ADD    AX    ,15
                  S2:MOV    Y    ,AX
                     … … … … … …
                     X  DW  ?
                     Y  DW  ?

  汇编语言用助记符而不是0和1序列来表示指令,程序的生产效率和质量都有所提高。但是使用汇编语言编写的程序,计算机不能直接识别,必须有一种程序将汇编语言翻译成机器语言,起这种翻译作用的程序称为汇编程序(Assembler),汇编程序把汇编语言翻译成机器语言的过程称为汇编(Assembling)。
  汇编语言程序经汇编得到的目标程序占用内存空间少,运行速度快,有着高级语言不可替代的作用,因此汇编语言常用来编写系统软件和过程控制软件。
  汇编语言和机器语言都与具体的机器有关,它们都称为面向机器的语言,也称为低级语言。程序员用它们编程时,不仅要考虑解题思路,还要熟悉机器的内部构造,并且要“手工”地进行存储器分配,编程的劳动强度仍然很大,这些仍然阻碍着计算机的普及和推广。因此,人们又进一步引进了高级语言。
1.1.3 高级语言
  无论是机器语言还是汇编语言,它们都是面向硬件具体操作的,语言对机器的过分依赖要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员是难以做到的,对于计算机的推广应用也是不利的。计算机的发展,促使人们去寻求一些与人类自然语言相接近且能为计算机所接受的语意确定、规则明确、自然直观和通用易学的计算机语言。这种与自然语言相近并为计算机所接受和执行的计算机语言称为高级语言。高级语言是面向用户的语言。无论何种机型的计算机,只要配备相应的高级语言的翻译程序,用该高级语言编写的程序就可以在该机器上运行。
  例如,使用C语言完成例1.1中的计算,可用如下语句:

if(X<Y)
             Y=X+15;
         else
             Y=X?15;

  高级语言可读性好,机器独立性强,具有程序库,可以在运行时进行一致性检查从而检测程序中的错误,使得高级语言几乎在所有的编程领域取代了机器语言和汇编语言。高级语言也随着计算机技术的发展而不断发展,目前有许多种用于不同目的的高级程序设计语言,广泛使用的有C、C++、Java、C#、F#、JavaScript、JSP等。
  根据人们研究兴趣的不同,高级语言也有多种不同的分类方法。从语言的范型分类,当今的大多数程序设计语言可以划分为如下四类。
  1.命令式语言
  命令式语言(Imperative Language)也称过程式语言。其特点是命令驱动,面向动作(语句),即将计算看做是动作(语句)的序列。一个命令式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改变。Pascal、C和ADA都是典型的命令式语言。
  2.函数式语言
  函数式语言(Functional Language)注重程序实现的功能,而不是像命令式语言那样一个语句接一个语句地执行。程序的编写过程是从已有函数出发构造出更复杂的函数,对初始数据集应用这些函数直至最终的函数可以从初始数据计算出最终的结果。因此,函数式语言也称应用式语言。LISP、ML和Haskell都属于这种语言。
  3.面向对象语言
  面向对象语言(Object-Oriented Language)是当今最流行、最重要的语言。它的主要特点是支持封装性、继承性和多态性等。把复杂的数据和对这些数据的操作封装在一起,构成对象;对简单对象进行扩充、继承简单对象的特性,从而设计出复杂的对象。对对象的构造可以使面向对象程序具有命令式语言的有效性,通过作用于特定数据的函数的构造,可以具有应用式语言的灵活性和可靠性。SmallTalk、C++、Java就属于面向对象语言。
  4.逻辑式语言
  逻辑式语言(Logical Language)也称做基于规则的语言(Rule-based Language)。逻辑式程序设计以“项”之间“关系”的定义、应用这些关系的事实以及从现存的事实中“推理”出新的事实的规则为基础。项可能是逻辑变量或者包含逻辑变量。事实和规则称为“子句”。逻辑式语言的程序由“子句列表”组成。最有代表性的逻辑式语言是PROLOG。PROLOG以逻辑程序设计为基础,以处理一阶谓词演算为背景。它文法简洁,表达力丰富,具有独特的非过程型语言(一个语句就相当于过程语言的一个子程序而并非算法的一步),是一种具有推理功能的逻辑型语言。PROLOG语言已被广泛地应用于关系数据库、抽象问题求解、数理逻辑、公式处理、自然语言理解、专家系统以及人工智能的许多领域。
  计算机的指令系统只能执行自己的指令程序,而不能执行其他语言的程序。因此,若想用高级语言,则必须有这样一种程序,它把用汇编语言或高级语言写的程序(称为源程序)翻译成等价的机器语言程序(称为目标程序),我们称这种翻译程序为翻译器。汇编语言的翻译器为汇编程序,高级语言的翻译器为编译程序。
  翻译器的“翻译”通常有两种方式,即编译方式和解释方式。编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户把由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。编译程序将源程序翻译成目标程序的过程发生在翻译时间,翻译成的目标代码随后运行的时间称为运行时间。解释方式是:源程序进入计算机时,解释程序边扫描边解释,做逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。
  解释器是源程序的一个执行系统,而编译程序是源程序的一个转换系统,换句话说,解释程序的工作结果是得到源程序的执行结果,因此解释程序相当于执行程序的抽象机;而编译程序的工作结果是得到等价于源程序的某种目标机程序,因此编译程序是高级语言程序到某种低级语言程序的转换器。
  高级程序设计语言的编译方式和解释方式如图1.1所示。
  C、C++、VB、VC++等高级语言执行编译方式;Java语言则以执行解释方式为主;而C、C++等语言是能书写编译程序的高级程序设计语言。

image

1.1.4 第四代语言
  第四代语言(Fourth-Generation Language,以下简称为4GL)的出现是出于商业需要。4GL一词最早出现在20世纪80年代初期软件厂商的广告和产品介绍中。由于4GL具有“面向问题”、“非过程化程度高”等特点,可以呈数量级地提高软件生产率,缩短软件开发周期,因此赢得很多用户的青睐。20世纪80年代中期,许多著名的计算机科学家对4GL展开了全面研究,从而使4GL进入了计算机科学的研究范畴。
  4GL以数据库管理系统所提供的功能为核心,进一步构造了开发高层软件系统的开发环境,如报表生成、多窗口表格设计、菜单生成系统、图形图像处理系统和决策支持系统,为用户提供了一个良好的应用开发环境。它提供了功能强大的非过程化问题定义手段,用户只需告知系统做什么,而无须说明怎么做,因此可大大提高软件生产率。
  进入20世纪90年代,随着计算机软硬件技术的发展和应用水平的提高,大量基于数据库管理系统的4GL商品化软件已在计算机应用开发领域中获得广泛应用,成为面向数据库应用开发的主流工具,如Oracle应用开发环境、Informix?4GL、SQL Windows、Power Builder等。它们为缩短软件开发周期、提高软件质量发挥了巨大的作用,为软件开发注入了新的生机和活力。
  虽然4GL具有很多优点,也有很大的优势,成为目前应用开发的主流工具,但它也存在着以下严重不足:

  • 4GL虽然功能强大,但在其整体能力上却与3GL有一定的差距。这一方面是语言抽象级别提高以后不可避免地带来的(正如高级语言不能做某些汇编语言做的事情那样);另一方面是人为带来的,许多4GL只面向专项应用,有的4GL为了提高对问题的表达能力,提供了同3GL的接口,以弥补其能力上的不足,如Oracle提供了可将SQL语句嵌入C程序中的工具PRO*C。
  • 4GL由于其抽象级别较高,不可避免地带来系统开销大,运行效率低(正如高级语言运行效率没有汇编语言高一样)等问题,对软硬件资源消耗严重,应用受硬件限制。
  • 由于缺乏统一的工业标准,4GL产品花样繁多,用户界面差异很大,与具体的机器联系紧密,语言的独立性较差(SQL稍好),影响了应用软件的移植与推广。
  • 目前4GL主要面向基于数据库应用的领域,不适合于科学计算、高速的实时系统和系统软件开发。
相关文章
|
3月前
|
小程序 开发者 Python
揭秘python函数:编程艺术的核心力量
揭秘python函数:编程艺术的核心力量
|
3月前
|
存储 Python
揭秘python函数:编程艺术的核心力量(2)
揭秘python函数:编程艺术的核心力量(2)
|
3月前
|
Python
揭秘python函数:编程艺术的核心力量(3)
揭秘python函数:编程艺术的核心力量(3)
|
9月前
|
程序员
编写s=1+2+3+...+n思路打破认知
最近在和领导讨论架构设计,其中涉及到如何通过代码来体现面向对象?通过一个例子来打破了原有的认知,以此总结记录自己的提升和成长
|
Java 领域建模
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
|
Java 测试技术
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
|
机器学习/深度学习 Python
深度之眼(九)——python函数--面向过程的编程(上)
深度之眼(九)——python函数--面向过程的编程(上)
深度之眼(九)——python函数--面向过程的编程(上)
|
人工智能 Java C++
Java面向对象程序设计综合练习1(程序填空题)
Java面向对象程序设计综合练习1(程序填空题)
327 0
Java面向对象程序设计综合练习1(程序填空题)
|
机器学习/深度学习 Java
Java面向对象程序设计综合练习3(程序填空题)
Java面向对象程序设计综合练习3(程序填空题)
105 0
Java面向对象程序设计综合练习3(程序填空题)
|
SQL Java 数据库连接
Java面向对象程序设计综合练习4(判断题)
Java面向对象程序设计综合练习4(判断题)
99 0