【软考】【软件设计师】【知识模块】【第2章:程序设计语言基础知识】
程序设计语言基础知识
2.1 程序设计语言概述
2.1.1 程序设计语言基本概念
低级语言,面向机器的语言,如汇编语言、机器语言;
特性:进行程序设计效率低,程序的可读性差,难以修改、维护,优势是运行速度特别快;
高级语言,面向各类应用的程序设计语言。如C、C++ 、Java、Python、Delphi 、Pascal、Php
语言处理程序:负责将高级语言翻译成计算机能理解的0和1的程序;
语言之间的翻译基本方式:
汇编、解释、编译;
汇编:对使用汇编语言写成的源程序进行翻译成目标程序(机器可直接执行)的过程;
解释:将源程序翻译成中间代码(需要配合专有解释器才可执行)的过程;
编译:将源程序翻译成机器可直接执行的目标程序的过程;
解释和编译的区别在于:
对源程序进行编译后的目标程序可以在机器上直接执行,不需要源程序和编译程序配合执行;机器上运行的是与源程序等价的目标程序。
对源程序进行解释后的中间代码,需要源程序和解释程序(解释器)配合执行;
程序语言的定义涉及的三个范畴:
语义、语法、语用;
所谓高级语言,即不依赖机器硬件的;
所谓通用的程序设计语言:能够应用与范围广泛的问题求解过程中的;
计算机程序语言的发展史:
1957年:Fortran语言;第一个被广泛用来进行科学和工程计算的高级语言;
一个Fortran程序由一个主程序和若干个子程序组成。
最大的特性是:接近数学公式的自然描述,具有很高的执行效率。
广泛应用于并行计算和高性能计算机领域;
1960s:ALGOL语言;在晶体管计算机流行的年代
1970年:Pascal;过程式、结构化程序设计语言;
1980s:C语言;通用程序设计语言;
Unix及其上的软件均使用C编写的;
兼顾高级语言和汇编语言的特点;
提供了高效的执行语句
允许程序员直接访问操作系统和底层硬件;
在实时处理应用开发中有普遍应用;
1980s:C++语言;与C兼容,比C多了封装和抽象
与C相比,增加了类机制(使C++成为面向对象程序设计语言)
C++编译器能够编译任何C程序
C++不可以省略函数原型,C可以;
1980s:C#语言,Microsoft 公司开发的
面向对象的高级语言
运行于.NET Framework
相对C++,部分方面进行限制和增强;
仅支持单一父类继承,不支持多重继承;
1980s :Objective-C 语言,由C衍生,继承C的语言特性;
面向对象
由Apple公司维护,是MAC系统下的主要开发语言;
仅支持单一父类继承,不支持多重继承;
1990s:Java语言,
保留了C++的基本语法、类、继承等概念;
删掉了C++的一些不好的特征;
与C++相比,Java更简单、语法和语义更合理;
1993:Ruby语言,松本行弘设计的
解释型语言,面向对象,动态类型、脚本语言;
任何东西都是对象
每个过程和函数都是方法
变量没有类型
任何东西都有值
1990s:PHP语言,服务器端执行的、嵌入HTML文档的脚本语言。
语言风格类似C
网站编程方向广泛使用
可快速执行动态网页,语法混合C、Java、Perl,部分为PHP自创语法;
PHP可以充分利用服务器的 性能
PHP支持几乎所有流行的数据库以及操作系统。
1990s:Python 面向对象 解释型程序设计语言,脚本语言,
可编写独立应用程序、复杂应用的圆形;
Python支持对操作系统的底层访问
胶水语言,可以使用C、C++、Java等进行扩展。
1990s:JavaScript语言,脚本语言,广泛应用于WEB开发
常见JavaScript脚本嵌入在HTML中
1990s: DelPhi语言,Windows环境下使用,在Linux环境下是Kylix;
1990s:Visual Basic.NET 语言,基于Microsoft .NET Framework
面向对象,
被编译的中间代码不能在操作系统上直接执行;程序运行需要借助与.NET Framework ;
程序设计语言的演化从最开始的
机器语言 ——>
汇编语言 ——>
各种结构化高级语言 ——>
支持面向对象技术的面向对象语言 ;
演化过程,反映的是一条 抽象机制不断提高 的演化道路
程序设计语言的分类:
命令式和结构化程序设计语言【如Fortran、Pascal、C 】
基于动作的语言,计算机被看成动作的序列;
结构特性:
自顶向下逐步精化的方法编程;
按模块组织的方法编程;
程序只包好顺序、判定(分支)及循环构造;
结构简单清晰、模块化强、描述方式接近人们习惯的推理式思维方式;
程序可读性强,
面向对象程序设计语言【如C++、Java、Smalltalk】
面向对象程序设计语言都必须支持新的程序设计技术,如 数据隐藏、数据抽象、用户定义类型、继承、多态 等;
面向对象程序设计的创建,归功于Simula,从模拟领域发展起来的,提出了对象和类的概念。
函数式程序是设计语言 【如LISP,常见的还有Haskell、Scala、Scheme、APL】
1958年专为AI设计的语言;
映射的概念,定义域和值域的一对一和多对一映射关系;
LISP中大量使用递归;
逻辑型程序设计语言 【如Prolog】
以形式逻辑为基础的语言
建立在关系理论和一阶谓词理论基础上的
Prolog是一系列事实、数据对象、事实间的具体关系和规则的集合
Prolog有很强的推理功能,适用于编写自动定理证明、专家系统、自然语言理解等问题的程序。
等;
程序设计语言的基本成分:
数据、运算、控制、传输、函数
数据:
常量、变量 (引入 左值和右值的概念;)
全局量、局部量 (引入作用域的概念)
数据类型
数据类型一般有:基本类型、用户定义类型、构造类型、其他类型
数据的一些属性:
类型(说明数据占用内存的大小和存放形式;)
存储类别(说明数据在内存中的位置和生存期)
作用域(可使用数据的代码范围)
生存期(说明数据占用内存的时间特点)
名称(通过标识符命名;)
(数据所涉及到的:)命名、
标识符组成:如字母大小写a/A --z/Z ;数字0-9; 下划线_
标识符命名规则,如开头只能以_ 和字母构成等;
运算
算术运算
逻辑运算
关系运算
位运算
运算符的优先级、结合性等特性;
控制
顺序结构
选择结构
循环结构
组成部分:初始化、循环体、循环条件
while类型(先判断,条件成立则执行)
do-while类型(先执行,后判断,条件成立则继续循环)
C、C++ 提供的控制语句
复合语句,利用“{ }” 来控制语句结构
利用if Switch 来实现双分支和多分支选择结构;
还有一些控制流跳转语句,如continue、break、 goto;
传输
赋值处理、数据的输入、输出;
函数
三个概念:函数的定义、声明、和调用;
函数的值调用
函数的引用调用
语言处理程序基础
语言处理程序,是一类系统软件的总称,主要作用是将高级语言/汇编语言 编写的源代码程序翻译成某种机器语言程序,目的使程序可以在计算机上运行。
根据源程序类别,语言处理程序也可以分为汇编程序、编译程序、解释程序 这三种基本类型。
汇编程序基本原理
汇编源程序的构成:指令语句、伪指令语句、宏指令语句
指令语句分类:(指令语句又称机器指令语句,汇编后产生相应的机器代码)
传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令、处理机控制指令等类型;
伪指令语句:
用于指示汇编程序在汇编源程序时,完成某些工作。(也就是说伪指令语句是在汇编源程序的过程中辅助使用的,不参与最终的执行环节)
如,为变量分配存储单元地址
伪指令语句与指令语句的 区别:
伪指令语句经 汇编后,不产生机器代码,指令语句会产生代码
伪指令语句的操作在汇编的过程中被执行;指令语句的操作在最终程序执行的过程中使用。
宏指令语句
汇编程序允许用户将 多次重复使用的程序段定义为 宏;
每个宏都有名字
程序任意的位置都可以使用宏;
宏指令语句就是宏的应用。
汇编语言的特性:
汇编程序,一般需要两次扫描源程序,才能完成翻译工作。
因为汇编指令中,形成操作数地址的部分可能出现后面才会定义的符号,如宏可以在程序的任意位置被“引用”
汇编程序,第一次扫描的主要工作是定义符号的值,并创建一个符号表ST
有一个固定的机器指令表MOT1;(记录了每条机器指令的记忆码,和指令的长度)
设立一个位置计数器 或 单元地址计算器LC(Location Counter) (初始值为0)
为了计算各汇编语句标号的地址。
LC的值,是随着扫描源程序的进度,逐渐累加;
第二次扫描源程序,是为了产生目标程序(也就是物理计算机可以直接执行的代码程序)
需要使用到机器指令表 MOT2
MOT2表中,含有机器指令助记符、机器指令的二进制操作码、格式、长度
需要设定一个伪指令表POT2,供第二次扫描时使用;
POT2的每个元素仍然有两个域:伪指令记忆码 和 相应的子程序入口
第二次扫描时,伪指令有着完全不同的处理方式:
可执行汇编语句会被翻译成对应的二进制机器代码指令
一、将 机器指令助记符 转换成 二进制机器指令操作代码
二、求出操作数区 各操作数的值(用二进制表示) (通过查找MOT2表来实现。)
编译程序基本原理 【这个章节比较难,且内容 比较多】
六个阶段
|| 源程序 ——> 词法分析
——> 语法分析
——> 语义分析
——> 中间代码生成
——> 代码优化
——> 目标代码生成
——> 目标代码 ||
在这六个阶段中,不论哪个阶段都会涉及到 符号表的管理、 出错处理
需要说明的是,中间代码生成后,就与物理机器无关,这是一个分水岭。
中间代码,是与汇编语言的指令非常相似的三地址码(其实现方式常用四元式)
代码优化阶段,优化的过程,可以在中间代码生成阶段进行、也可以在目标代码生成阶段进行。
词法分析,涉及到有限自动机、(确定的有限自动机DFA 和不确定的有限自动机 NFA)
有限自动机,用于识别装置的抽象概念。它能准确地识别正规集。
正规集、正规表达式 的概念引入;
中间代码的优化和目标代码的生成
优化是对程序的等价交换,使得从变换后的程序能够生成更有效的目标代码;
所谓的等级,是不修改程序的执行结果;
所谓的有效,是指目标代码的执行时间较短,占用的存储空间较少;
优化可以在编译的各个阶段进行;
最主要的优化,是目标代码生成之前,对中间代码进行的优化,这类优化,不依赖具体的计算机硬件。
代码生成需要考虑的问题;
中间代码的形式
目标代码的形式
分为两大类:汇编语言形式、机器指令形式
寄存器的分配
寄存器资源远远优于内存,但资源数量少;
计算次序的选择
解释程序的基本原理
解释程序,在词法、语法、语义分析方面,与编译程序的工作原理基本相同;
在运行用户程序时,解释程序直接执行源程序或源程序的中间表示形式;
解释程序不产生源程序的目标程序;(这个是解释程序与编译程序的主要区别;)
解释程序实现高级语言的三种方式
第一种A:解释程序直接对源程序执行,特点:
逐个字符检查,反复扫描源程序,运行效率低;
第二种和第三种,BC之间的区别,在于中间代码的级别,是否更接近于机器代码;
APL、SNOBOL4都是采用这种方法的;
高级代码和中间代码间存在着1-n的对应关系;
中间代码更接近于机器代码,则可移植性更好;(待确认这句话是否理解正确)
解释程序的基本结构;
分析部分
对源代码进行 词法分析、语法分析、语义分析,经过语义分析,将源代码翻译成中间代码;
解释部分
对分析部分产生的中间代码进行解释执行,
高级语言,编译与解释的比较:
效率
一般编译比解释的效率更高;
解释程序执行过程中需要反复扫描程序;
解释程序相比较编译程序,需要更多的内存空间,因为系统在执行用户程序时,还需给解释程序分配内存资源;
编译程序在编译过程中,所需时间比较长,因为不但需要将源程序进行语法语义分析,还需要对目标代码进行优化;
编译程序比机器语言的源程序,运行时间更长,占用存储空间更多。
一次编译后,用户程序可以多次使用;
灵活性
解释程序需反复检查源程序,甚至可在程序执行过程中修改源程序;
可直接定位程序执行错误的地方;
可移植性;
解释器也是一种程序语言编写的,只需要对解释器进行重新编译,就能适应不同的环境;
由于编译和解释各有优缺点,现在的部分编译系统也同时提供解释功能;
如java虚拟机上发展的一种Compiling-just-in-time技术;
————————(我是分割线)————————
考纲有关本章节的要求:
————————(我是分割线)————————
本章节需要深入了解的知识点有:
————————(我是分割线)————————
参考:
1. 《软件设计师教程》(第五版,清华大学出版社,禇华、霍秋艳 主编)
2. 赛迪网校 :www.ccidedu.com(教学视频资源)
3. 美河学习在线团购组:www.eimhe.com (教学视频来源)
备注:
初次编辑时间:2019年10月17日20:29:20
第一次修改时间:2019年10月28日23:04
环境:Windows 7 / Python 3.7.2