软考(中极数据库)2.程序语言基础

1.程序语言概述

1.1 低级语言和高级语言:

●低级语言:机器语言和汇编语言。是一种面向机器的语言,其格式取决于计算机的机器指令。难以理解,程序可读性差,程序设计效率低。

●高级语言:面向各类应用的程序语言。如Java、C、C++、Python、 PHP、JavaScript等等。与人们使用的语言较为接近,便于理解,提高了程序设计的效率。

----------------------------------------------------------

机器语言:由0、1组成,计算机能无障碍理解,执行效率最高;但复杂度也极高、开发效率极低。

汇编语言:用一个英文标签代表一组二进制指令,比机器语言更不复杂,但还是很复杂。下图为汇编语言打印“Hello World!”

高级语言:面向各类应用的程序语言。如Java、C、C++、Python、 PHP、JavaScript等等。与人们使用的语言较为接近,便于理解,提高了程序设计的效率。

高级语言根据编译方式的不同,又能分成以下两种:

编译型语言(如C语言):即程序写完之后,用一个类似翻译软件的编译器,将完整的程序源代码翻译成计算机能识别的机器语言。由于编译后其可以脱离语言环境独立执行,所以其执行效率极高;但由于当应用程序需要修改时,需要更改源代码后重新编译,所以其开发效率较低。并且编译型代码是针对某一个平台编译的,当前平台的编逢结果无法在其他的平台使用,因此跨平台性也很差。下图来自C primer plus。

解释型语言(如python):解释型语言需要一个解释器,读取代码,解释一行就执行一行,可以理解为一边解释一边执行,因此执行效率没那么高,但开发效率极高,可以自行改动部分代码,且跨平台性也强。


1.2 汇编、解释、编译

高级程序语言必须进行翻译才能为计算机硬件所理解,常用的翻译方式有汇编、解释和编译。

用汇编语言编写的:需要汇编程序翻译成目标程序,然后执行目标程序。

用高级语言编写的:需要解释程序或编译程序进行翻译,然后再运行。

1.3 编绎程序和解释程序

(1)解释程序(解释器):要么直接解释执行源程序,要么将源程序翻译成某种中间代码后再加以执行。它按源程序中语句的执行顺序,逐条翻译并立即执行相关功能。

(2)编译程序(编译器):将源程序翻译成目标程序(目标代码)然后再在计算机上运行目标程序。

一般分为两个阶段:

编译阶段:把源程序翻译成目标程序。

运行阶段:执行目标程序。

1.4 编绎和解释的区别

编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程。

解释方式下,解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。

简单来说,在解释方式下,翻译源程序时不生成独立的目标程序,而编译器则将源程序翻译成独立保存的目标程序。

1.5 编绎和解释的比较

·编译比解释方式可能取得更高的效率。

·解释方式比编译方式更灵活。

·解释方式可移植性好。

----------------------(第2、3部分内容比较基础,学过编程语言应该都了解,可略过)--------------------

2.程序语言的数据成分


2.1 常量和变量

按照程序运行时数据的值能否改变,将程序中的数据分为常量和变量。

2.2 全局变量和局部变量

按数据的作用域范围,可将其分为全局变量和局部变量。系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是可以动态改变的。

2.3 数据类型

●基本类型:整型、字符型、实型和布尔类型。

●特殊类型:空类型。

●用户定义类型:枚举类型。

●构造类型:数组、结构、联合。

●指针类型:type *。

●抽象数据类型:类类型。

3.程序语言的控制成分

1)顺序结构

计算过程从所描述的第一个操作开始,按顺序依次执行后续的操作,直到序列的最后一个操作。

2)选择结构(if else)

选择结构提供了在两种或多种分支中选择其中一个的逻辑。

3)循环结构(do while)

循环结构描述了重复计算的过程,通常由三部分组成:初始化、循环体和循环条件。

----------------------------------------------------------------------------------------------------------------



4.编译过程

编译程序的作用是把某种高级语言书写的源程序翻译成与之等价的目标程序,其工作过程一般可以分为6个阶段:

4.1 词法分析


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

4.2 语法分析


●任务:根据语言的语法规则,在词法分析的基础上,分析单词串是否成短语和句子,即是否为合法的表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。

●如果源程序没有语法错误,语法分析后就能正确地构造出其语法树。

4.3 语义分析


●任务:分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。

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


4.4 中间代码生成


●任务:根据语义分析的输出生成中间代码。

●常用的中间代码有:后缀式(逆波兰式)、四元式(三地址码)、树形表示。

4.5 代码优化


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

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


4.6 目标代码生成


●目标代码生成是编译器工作的最后一个阶段。

●任务:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码和汇编指令代码。

●这个阶段的工作与具体的机器密切相关。

4.7 符号表管理

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

4.8 出错处理

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

(1)动态错误发生在程序运行时,如:变量取零时作除数、引用数组下标错误等。

(2)静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。

①语法错误:单词拼写错误、标点符号错、表达式中缺少操作数、括号不匹配等有关语言结构上的错误。

②静态语义错误:语义分析时发现的运算符和运算对象类型不合法等错误。

4.9 中缀、前缀与后缀表达式

中缀表达式:即我们通常所使用的表达式。如(a+b) *c-d

前缀表达式(波兰式):将运算符写在前面,操作数写在后面,且不使用括号。-*+abcd

后缀表达式(逆波兰式):将运算符写在后面,操作数写在前面,且不使用括号。ab+c*d-

------------------------------------------------------------------------------------------
例题

1、程序设计语言的基本成分包括数据、运算、控制和(传输)。数据是程序操作的对象,按照数据组织形式可以分为多种类型,其中枚举属于(用户定义) 类型;数组属于(构造) 类型。

2、函数调用和返回控制是用(栈)实现的。

当在一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要先完成3个操作:① 将所有的实参、返回地址等信息传递给被调函数保存;
② 为被调函数的局部变量分配存储区;
③ 将控制转移到被调函数的入口。

从被调函数返回调用函数之前,系统还要完成3个操作:
① 即保存被调函数的计算结果;
② 释放被调函数的数据区;
③ 依照被调函数保存的地址将控制转移到调用函数。

当有多个函数构成嵌套调用时,按照"后调用先返回"的原则,上述函数之间的信息传递和控制转移必须通过"栈"来实现,每当调用一个函数时,就在栈顶为它分配一个存储区,每当退出一个函数时,就释放它的存储区,当前正在运行的函数的数据区必在栈顶。递归函数的运行过程类似于多个函数的嵌套调用,只是调用和被调用函数是同一个函数。

参考自:调用递归过程或函数时,处理参数及返回地址为什么要用栈来实现?_递归为什么要用到栈-CSDN博客

3、在高级语言源程序中,常需要用户定义的标识符为程序中的对象命名,常见的命名对象有(B)
①关键字(或保留字) ②变量③函数④数据类型⑤注释
A.①②③
B.②③④. 
C.①③⑤
D.②④⑤

答案:2、3、4。关于4,C++中的枚举类型是可以命名的。

4、以下关于脚本语言的叙述中,正确的是(C)。
A.脚本语言是通用的程序设计语言
B.脚本语言更适合应用在系统级程序开发中
C.脚本语言主要采用解释方式实现
D.脚本语言中不能定义函数和调用函数

脚本语言(以JavaScript为例,嵌入在web网页中)

对于A,B,通用的程序设计语言包括C、C++、java等,脚本语言要嵌入到主语言中,不属于通用的程序设计语言,因此也不适用于系统级程序开发中。

对于C,JavaScript在网页中是一种动态效果,用户打开网页后需要很快看到HTML网页,因此不会先进行编译,而是快速的马上执行,即采用解释方式实现。

5、将高级语言源程序先转化为种中间代码是现代编译器的常见处理方式。常用的中间代码有后缀式、(B)、树等。(教材原话)
A.前缀码
B.三地址码(四元式)
C.符号表
D.补码和移码

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值