第三章 程序语言基础知识

第2章 程序语言基础知识

2.1 程序语言概述…… 42
2.1.1 程序语言的基本概念…… 42
低级语言和高级语言
• 低级语言:机器语言和汇编语言。是一种面向机器的语言,其格式取决于计算机的机器指令。难以理解,程序可读性差,程序设计效率低。
• 高级语言:面向各类应用的程序语言。如Java、C、C++、Python、PHP、JavaScript等等。与人们使用的语言较为接近,便于理解,提高了程序设计的效率。
HTML 是超文本标记语言,超文本是指页面内可以包含图片、链接甚至音乐、程序等非文字元素;PHP(超文本预处理器)是一种通用开源脚本语言,它将程序嵌入到HTML 文档中去执行,从而产生动态网页。(14年第20题)
编译程序和解释程序
高级程序语言必须进行翻译才能为计算机硬件所理解,常用的翻译方式有汇编、解释和编译。
• 用汇编语言编写的:需要汇编程序翻译成目标程序,然后执行目标程序。
• 用高级语言编写的:需要解释程序或编译程序进行翻译,然后再运行。
(1)解释程序(解释器):要么直接解释执行源程序,要么将源程序翻译成某种中间代码后再加以执行。它按源程序中语句的执行顺序,逐条翻译并立即执行相关功能。
(2)编译程序(编译器):将源程序翻译成目标程序(目标代码),然后再在计算机上运行目标程序。一般分为两个阶段:
编译阶段:把源程序翻译成目标程序。
运行阶段:执行目标程序。
编绎和解释的区别(13年第20题/16年第20题)
• 编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程。
• 解释方式下,解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。
简单来说,在解释方式下,翻译源程序时不生成独立的目标程序,
而编译器则将源程序翻译成独立保存的目标程序。
• 编译比解释方式可能取得更高的效率。
• 解释方式比编译方式更灵活
• 解释方式可移植性好。
反编译是编译的逆过程。反编译通常不能把可执行文件还原成高级语言源代码,只能转换成功能上等价的汇编程序。(09年第24题)

程序设计语言的定义
程序设计语言的分类
补充说明:(09年第25题)
Javasript 并不是严格意义的面向对象语言,而是一种基于对象、事件驱动编程的客户端动态脚本语言。
Ruby 是一种开源的面向对象程序设计的服务器端动态脚本语言。

脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。此命名起源于一个脚本“screenplay”,每次运行都会使对话框逐字重复。早期的脚本语言经常成为批处理语言或工作控制语言。一个脚本通常是解释运行而非编译。(16年第21题)

2.1.2 程序语言的基本成分…… 46
程序设计语言的基本成分:(19年第23题)
(1) 数据
(2) 运算
(3) 控制
顺序、选择、循环
(4) 传输

程序语言的数据成分
1)常量和变量
按照程序运行时数据的值能否改变,将程序中的数据分为常量和变量。
2)全局变量和局部变量
按数据的作用域范围,可将其分为全局变量和局部变量。
系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是可以动态改变的。
全局变量的存储空间在静态数据区。(15年第22题)
局部变量的定义:凡是在函数内部定义的变量都是局部变量,包括在函数内部复合语句中定义的变量和函数形参表中说明的形式参数。局部变量只能在函数内部使用,其作用域是从定义位置起至函数体或复合语句体结束为止。局部变量的值通常在其生存期内是变化的。
3)数据类型
• 基本类型:整型、字符型、实型和布尔类型
• 特殊类型:空类型
• 用户定义类型:枚举类型
• 构造类型:数组、结构、联合
• 指针类型:type *
• 抽象数据类型:类类型
补充知识点:程序中的数据具有数据属性时,j流可以规定数据对象的取值范围及能够进行的运算,在运算进行前便于进行类型检查,也更有利于为数据合理分配存储单元。(11年第22题)
程序语言的运算成分
程序语言的控制成分
1)顺序结构
  计算过程从所描述的第一个操作开始,按顺序依次执行后续的操作,直到序列的最后一个操作。
2)选择结构
  选择结构提供了在两种或多种分支中选择其中一个的逻辑。(if else)
3)循环结构
  循环结构描述了重复计算的过程,通常由三部分组成:初始化、循环体和循环条件(while )
函数
函数是一段具有独立功能的程序代码。
1)函数定义
C/C++程序中所有函数的定义都是独立的。不允许函数的嵌套定义。
2)函数声明
先声明后引用
3)函数调用 (09年第23题)
函数调用时基本的参数传递方式有两种:传值调用和引用调用。(13年第21题)
(1)传值调用
• 信息传递是单向的,只能将实参的值传递给形参,而形参不能再将值传递给实参。
• 实参可以是常量(表达式),也可以是变量(数组元素)。
例: int sum(int x, int y) {
    int z;
    z=x+y;
    return z; }
函数调用时:sum(2,3)
(2)引用调用(传地址调用) (14年第21题)
• 在这种方式下,将实参的地址传递给形参。可以认为形参名实际上是实参的别名,被调函数中对形参的访问和修改实际上就是对实参的访问和修改。因此客观上可以实现双向传递。
• 因此只能是变量(数组元素),而不能是常量(表达式)。
例: void swap(int &x, int &y) {
   int temp;
   temp=x; x=y; y=temp }
函数调用时:sum(a,b)
在程序中,可由程序员(用户)命名的有变量、函数和数据类型(17年第20题)

2.2 程序语言翻译基础…… 52
2.2.1 汇编程序基本原理…… 52
2.2.2 编译程序基本原理…… 54
编译过程概述
编译程序的作用是把某种高级语言书写的源程序翻译成与之等价的目
标程序,其工作过程一般可以分为6个阶段:

编译过程
(1)词法分析
• 任务:对源程序从前到后(从左到右)逐个字符地扫描,从中识别出 一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位, 如关键字(保留字)、标识符、常数、运算符和标点符号、左右括号等。
(2)语法分析 (17年第22题)
• 任务:根据语言的语法规则,在词法分析的基础上,分析单词串是否构成短语和句子,即是否为合法的表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。
• 如果源程序没有语法错误,语法分析后就能正确地构造出其语法树。
(3)语义分析 (21年上)
• 任务:分析各语法结构的含义,检查源程序是否包含静态语义错误, 并收集类型信息供后面的代码生成阶段使用。
• 语义分析的一个主要工作是进行类型分析和检查。一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如:整除取余运算符只能对整型数据进行运算,如果运算对象为浮点数,则认为是一种类型不匹配的错误。
(4)中间代码生成
• 任务:根据语义分析的输出生成中间代码。
• 常用的中间代码有:
  ① 后缀式(逆波兰式)(10年第17题/11年第20题)
  优点:根据运算对象和运算符的出现次序进行计算,不需要使用括号,也便于使用栈实现求值。
  ② 四元式(三地址码)(16年第22题)
(操作符,操作数1,操作数2,结果)
  ③ 树形表示
(5)代码优化
• 由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进 行的,因此,生成的中间代码往往在时间和空间方面的效率较差。当 需要生成高效的目标代码时,就必须进行优化。
• 优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段 进行。
(6)目标代码生成
• 目标代码生成是编译器工作的最后一个阶段。
• 任务:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码和汇编指令代码。
• 这个阶段的工作与具体的机器密切相关。
(7)符号表管理(10年第18题/14年第22题)
作用:记录源程序中各种符号(变量等)的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。
符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。
(8)出错处理
源程序中不可避免地会有一些错误,大致分为静态错误和动态错误。
① 动态错误发生在程序运行时,如:变量取零时作除数、引用数组下标错误等。
② 静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。
  i 语法错误:单词拼写错误、标点符号错、表达式中缺少操作数、括号不匹配等 有关语言结构上的错误。
  ii 静态语义错误:语义分析时发现的运算符和运算对象类型不合法等错误。

(17年第21题)

2.2.3 解释程序基本原理…… 73
编译和解释的区别:(19年第21题)
在编译方式下,机器上运行的是与源码程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程,程序运行速度快;而在解释方式下,解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序,边解释边执行,程序运行速度慢。

补充知识点
中缀、前缀与后缀表达式
基础概念
(1) 中缀表达式:
   即我们通常所使用的表达式。如(a+b)c-d
(2)前缀表达式(波兰式):
   将运算符写在前面,操作数写在后面,且不使用括号。如-×+abcd
(3)后缀表达式(逆波兰式):
   将运算符写在后面,操作数写在前面,且不使用括号。ab+cd-
三种表达式之间的转换(11年第21题/12年第22题)
例:(a+b)×c-d
(1)中缀表达式转前缀表达式:
  ① 按计算顺序全部加上括号: (((a+b)×c)-d)
  ② 把每一对括号内的运算符移到括号前面: -(×(+(ab)c)d)
  ③ 把所有括号去掉:-×+abcd
(2)中缀表达式转后缀表达式:
  ① 按计算顺序全部加上括号: (((a+b)×c)-d)
  ② 把每一对括号内的运算符移到括号后面: (((ab)+c)d)-
  ③ 把所有括号去掉:ab+cd-

逻辑与运算优先级高于逻辑或
逻辑与运算的短路求值逻辑:若x为假,则可知“x^y” 的值为假,无需再对y求值,因此只有在x为真时继续对y 求值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值