2020年中级数据库系统工程师考试笔记2—程序语言基础知识

2.1 程序语言概述

2.1.1 程序语言的基本概念

1.低级语言和高级语言

  • 低级语言:包括机器语言和汇编语言,是一种面向机器的语言,效率低、程序可读性很差、难以理解、难以修改和维护。
  • 高级语言:面向各类应用的程序语言,功能更强、抽象级别更高,常见的有Java、C、C++、C#、Python、PHP、JavaScript等,这类语言与人们使用的自然语言比较接近,大大提高了程序设计的效率。

2.汇编、解释、编译

  高级程序语言必须进行翻译才能为计算机硬件所理解,语言之间的翻译形式有多种,基本方式为汇编、解释和编译。

  用某种高级语言或汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行。如果源程序是用汇编语言编写的,则需要一个汇编程序将其翻译成目标程序后才能执行。如果源程序是用某种高级语言编写的,则需要对应的解释程序或编译程序对其进行翻译,然后在机器上运行。

3.编译程序和解释程序

  解释程序(解释器):它或者直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行;

  编译程序(编译器):将源程序翻译成目标语言程序,然后在计算机上运行目标程序。

  区别(这个是选择常考知识点):

  • 编译方式下,机器上运行的是与源程序等价的目标程序,源程序与编译程序都不再参与目标程序的执行过程;
  • 解释方式下,解释程序与源程序(或者某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。
  • 解释方式下,翻译源程序时不生成独立的目标程序,而编译器则将源程序翻译成独立保存的目标程序。

  编译和解释的比较:编译比解释方式可能取得更高的效率;解释方式比编译方式更灵活(解释程序需要反复检查源程序);解释方式可移植性好。

4.程序设计语言的分类

建议了解一下常用的程序语言应用场景,选择题偶尔会涉及,这里简单介绍3种。

  若一种程序语言不依赖于机器硬件,则称为高级语言;若程序语言能够应用于范围广泛的问题求解领域,则称为通用的程序设计语言。

  • PHP是一种在服务器端执行的、嵌入HTML文档的脚本语言,PHP可以快速地执行动态网页。
  • Python是一种面向对象的解释型程序设计语言,可以用于编写独立程序、快速脚本和复杂应用的原型。
  • JavaScript是一种脚本语言,被广泛用于web应用开发,常用来网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果,通常嵌入HTML使用。

2.1.2 程序语言的基本成分(★★★

  程序语言的基本成分包括:数据、运算、控制、传输。(2020年选择题考点)

1.程序语言的数据成分

  • 常量和变量:变量具有左值(指存储单元:地址、容器)和右值(内容),在程序运行过程中其右值可以改变;常量只有右值,在程序运行过程中其右值不能改变。
  • 全局变量和局部变量:系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是可以动态改变的。
  • 按照数据组织形式的不同分为基本类型、用户定义类型、构造类型及其他类型,以C语言为例:
    – 基本类型:int、char、float、double、bool等;
    – 特殊类型:void;
    – 用户定义类型:enum(枚举类型);
    – 构造类型:数组、结构、联合;
    – 指针类型:type *;
    – 抽象数据类型:类类型。

2.程序语言的控制成分

  控制成分指明语言允许表述的控制结构,程序员使用控制成分来构造程序中的控制逻辑,有顺序结构、选择结构、循环结构。

3.函数(很重要)

  函数涉及3个概念:函数定义、函数声明和函数调用。

  调用函数和被调用函数之间交换信息的方法主要有2种:一种是被调用函数把返回值返回给主调函数,另一种是通过参数带回信息,函数调用实参与形参间交换信息的方法有值调用和引用调用:

  • 传值调用:实现函数调用时实参向形式参数传递相应类型的值,形参不能向实参传递信息(单向传递),实参可以是常量(表达式),也可以是变量(数组元素),例如:
int sum(int x, int y){
    
    
    int z;
    z=x+y;
    return z;
}
 函数调用时:sum(2,3);
  • 引用调用(传地址调用):引用是C++中增加的数据类型,当形式参数为引用类型时,形参名实际上是实参的别名,函数中对形参的访问和修改实际上就是针对相应实际参数所做的访问和改变,可以实现双向传递;因此只能是变量(数组元素),而不能是常量(表达式),例如:
void swap(int &x,int &y){
    
    
   int temp;
   temp=x; x=y; y=temp;
}
函数调用:swap(a,b);x,y就是a,b的别名,调用完成后,交换了a,b的值。

2.2 程序语言翻译基础

2.2.1 汇编程序基本原理(了解一下)

  汇编语言源程序有3类语句:指令语句、伪指令语句和宏指令语句。

  汇编程序的功能是将汇编语言所编写的源程序翻译成机器指令程序,汇编程序的基本工作包括每一条可执行汇编语句转换成对应的机器指令,处理源程序中出现的伪指令。由于汇编指令中形成操作数地址的部分可能出现后面才会有定义的符号,所以汇编程序一般需要两次扫描源程序才能完成翻译过程。

2.2.2 编译程序基本原理(★★★

  编译程序的作用是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言),编译程序工作过程一般分为6个阶段:
在这里插入图片描述
1.词法分析

  词法分析阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号,“单词”符号是程序设计语言的基本语法单位,如关键字或保留字、标识符、常数、运算符和分隔符(如标点符号、左右括号)等。

2.语法分析

  语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等,检查和处理程序中的语法错误,如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树,否则就指出语法错误,并给出相应的诊断信息。

3.语义分析

  语义分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。

  语义分析的一个主要工作是进行类型分析和检查,程序语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是一种类型不匹配的错误。

4.中间代码生成(★★★

  中间代码生成阶段的工作是根据语义分析的输出生成中间代码。常用的中间代码有:后缀式(逆波兰式)、四元式(三地址码)、树形。

(1)中缀式表达式:即通常所使用的表达式,如 ( a + b ) ∗ c − d (a+b)*c-d (a+b)cd

  • 后缀表达式转为中缀表达式:从左至右扫描后缀表达式,若遇到运算对象,则压入栈中,遇到运算符,则从栈中弹出栈顶的两个运算对象进行运算,并将运算结果压入栈中,重复以上过程,直到表达式最右端,结束。

  • 前缀表达式转为中缀表达式:从右至左扫描后缀表达式,若遇到运算对象,则压入栈中,遇到运算符,则从栈中弹出栈顶的两个运算对象进行运算,并将运算结果压入栈中,重复以上过程,直到表达式最左端,结束。

(2)前缀式表达式(波兰式):将运算符在运算对象的前面, ( a + b ) ∗ c − d (a+b)*c-d (a+b)cd后缀表达式为 − ∗ + a b c d -*+abcd +abcd,即中缀表达式转换为前缀表达式,步骤:

  • 按计算顺序全部加上括号: ( ( ( a + b ) ∗ c ) − d ) (((a+b)*c)-d) (((a+b)c)d)
  • 把每一对括号内的运算符移到括号前面: − ( ∗ ( + ( a b ) c ) d ) -(*(+(ab)c)d) ((+(ab)c)d)
  • 去掉括号: − ∗ + a b c d -*+abcd +abcd

(3)后缀式表达式(逆波兰式):将运算符写在运算对象的后面,这种表示法的优点是根据运算对象和运算符的出现次序进行计算,不需要使用括号,也便于用栈实现求值, ( a + b ) ∗ c − d (a+b)*c-d (a+b)cd后缀表达式为 a b + c ∗ d − ab+c*d- ab+cd,即中缀表达式转换为后缀表达式,步骤:

  • 按计算顺序全部加上括号: ( ( ( a + b ) ∗ c ) − d ) (((a+b)*c)-d) (((a+b)c)d)
  • 把每一对括号内的运算符移到括号后面: ( ( ( ( a b ) + c ) ∗ d ) − ((((ab)+c)*d)- ((((ab)+c)d)
  • 去掉括号: a b + c ∗ d − ab+c*d- ab+cd

5.代码优化

  由于编译器将源程序翻译成中间代码的工作时机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间方面的效率较差,当需要生成高效的目标代码时,就必须进行优化。

  优化代码可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。

6.目标代码生成

  目标代码生成是编译器工作的最后一个阶段,这个阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。

7.符号表管理

  符号表的作用是记录源程序中各符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。

8.出错处理

  源程序中不可避免地会有一些错误,这些错误大致分为静态错误和动态错误。

  • 动态错误发生在程序运行时,如:变量取零时作除数、引用数组元素下标错误等。
  • 静态错误是指编译阶段发生的程序错误,可分为语法错误和静态语义错误,如单词拼写错误、标点符号错、表达式中缺少操作数、括号不匹配等有关语言结构上的错误成为语法错误。
  • 静态语义错误是指语义分析时发现的运算符与运算对象类型不合法等错误。

2.2.3 解释程序基本原理(★★★

  解释程序通常可以分为两部分:第一部分是分析部分,包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰式表示形式;第二部分是解释部分,用来对第一部分产生的中间代码进行解释执行。

说明:
1.疏忽、遗漏、错误之处,欢迎留言批评指正。
2.至此第2章书本教程知识点总结结束,后续会继续完善补充本章的历年真题,转载请注明出处,整理不易,谢谢!

猜你喜欢

转载自blog.csdn.net/u010257584/article/details/109591449