文章目录

  • Chapter1 概述
    • 1.1 什么是编译程序
      • 定义
      • 语言
      • 应用
      • 语言处理过程
      • 语言转变系统
      • 编译程序和解释程序比较
    • 1.2 编译过程和编译程序结构
      • 词法分析
      • 语法分析
      • 语义分析
      • 中间代码生成
      • 代码优化
      • 目标代码生成
      • 符号表管理
      • 出错处理
      • 编译程序结构
    • 1.3 编译阶段的组合
      • 内容
      • 分遍(趟, pass)问题
      • 高级语言解释系统
        • 解释系统
        • 编译阶段和运行阶段存储结构
        • 解释系统存储结构
      • 编译程序设计要求
    • 1.4 PL/0 编译程序
      • 结构
      • 程序实例
      • 程序图
      • PL/0 语言文法
      • 目标代码类pcode

Chapter1 概述

1.1 什么是编译程序

定义

编译程序是现代计算机系统的基本组成部分

功能:

语言

  • 低级语言

    • 机器语言:计算机指令系统
    • 汇编语言:符号化的指令系统
  • 高级语言:算法语言,不依赖具体机器,面向问题

应用

分类:

  • 软件

    • 计算机系统中的程序及其文档
  • 系统软件
    • 居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。
  • 语言处理系统
    • 把软件语言书写的各种程序处理可在计算机上执行的程序
  • 软件语言
    • 用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言

语言处理过程

语言转变系统

源语言 实现语言 目标语言
C++ C++编译器 C
Java Java编译器 Bytecode

编译程序和解释程序比较

1.2 编译过程和编译程序结构

编译逻辑过程:

词法分析

字符序列 -> 单词序列

扫描、分解源程序,识别单词(记本子、标识符、常数、运算符、界限符),并给予种别(属性)和内部形式(值),构成单词的内部表示。

从左到右读字符流的源程序,识别单词

例子1

position := initial + rate * 60;

词法分析:

单词类型 单词值
标识符1(id1) position
算符(赋值) :=
标识符2(id2) initial
算符(加号) +
标识符3(id3) rate
算符(乘) *
整数 60
分号 ;

例子2:C 源程序片段

int a;
a = a + 2;

词法分析:

单词类型 单词值
保留字 int
标识符(变量名) a
界符 ;
标识符(变量名) a
算符(赋值) a
标识符(变量名) a
算符(加) +
整数 2
界符 ;

语法分析

分析器(Analyzer)

功能:层次分析。依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树)

position := initial + rate * 60 ;(";"为语句分隔符)
规则
<赋值语句> ::= <标识符> ":=" <表达式>
<表达式> ::= <表达式> "+" <表达式>
<表达式> ::= <表达式> "*" <表达式>
<表达式> ::= "("<表达式>")"
<表达式> ::= <标识符>
<表达式> ::= <整数>
<表达式> ::= <实数>

语法树模板:

举例:

id1 := id2 + id3 * N

画图:

其他例子:

语义分析

语义审查(静态词义)

  • 上下文相关性
  • 类型匹配
  • 类型转换

例1:

program p();
var rate:real;
procedure initial;
...
position := initial + rate * 60;
/* error */ /* error */     /* warning */
...

例2:

int arr[2], abc;
abc = arr * 10;
...
program p();
var rate:real;
var initial:real;
var position:real;
...
position := initial + rate * 60;

中间代码生成

便于代码优化,

便于从逻辑上分出与语言或机器无关的阶段

源程序的内部(中间)表示

三元式、四元式、P-Code、C-Code、U-Code、bytecode

(*  id3  t1  t2)
t2 = id3 * t1
t2 := id3 * t1

举例:

id1 := id2 + id3 * 60
(1) (inttoreal, 60, -, t1)  实数,值为60,无,赋给t1
(2) (*, id3, t1, t2)        乘,运算值id3, 运算值t1,赋值给t2
(3) (+, id2, t2, t3)       加,运算值id2, 运算值t2,赋值给t3
(2) (:=, t3, -, id1)       赋值, 标识符t3, 无, 赋值给id1

代码优化

局部优化:

  • 合并已知量 -> 编译时减少常量表达式
  • 改变计算顺序 -> 减少指令、减少中间量
  • 共享子表达式 -> 删除多余代码
  • 降低运算强度 -> 乘方 --> 乘

循环优化:

  • 循环不变部分外提
  • 下标地址计算优化
  • 降低运算强度-> 乘 --> 加

与机器有关的优化:

  • 使用特殊指令 -> 如计数转移指令寄存器分配

举例1:

id1 := id2 + id3 * 60
未优化:
(1) (inttoreal, 60, -, t1)  实数,值为60,无,赋给t1
(2) (*, id3, t1, t2)        乘,运算值id3, 运算值t1,赋值给t2
(3) (+, id2, t2, t3)       加,运算值id2, 运算值t2,赋值给t3
(2) (:=, t3, -, id1)       赋值, 标识符t3, 无, 赋值给id1
优化后:
(1) (*, id3, 60.0, t1)      乘,运算值id3, 实数60,赋值给t1
(2) (+, id2, t1, id1)      加,运算值id2, 运算值t1,赋值给id1

举例2:

源代码:
t1 = b * c
t2 = t1 + 0
t3 = b * c
t4 = t2 + t3
a = t4
优化后:
t1 = b * c
t2 = t1 + t1
a = t2

目标代码生成

(* id3 60.0 t1 )
(+ id2  t1  id1)生成代码:
movf id3, R2
mulf ##60.0, R2
movf id2, R1
addf R2, R1
movf R1, id1

符号表管理

  • 记录源程序中使用的名字

  • 收集每个名字的各种属性信息

    • 类型、作用域、分配存储信息

      Const1 常量 值:35

      Var1 变量 类型:实 层次:2

出错处理

  • 检查错误
  • 报告出错信息
  • 排错
  • 恢复编译工作

编译程序结构

Components

  • 词法分析程序
  • 语法分析程序
  • 语义分析程序
  • 中间代码生成程序
  • 代码优化程序
  • 目标代码生成程序
  • 符号表管理程序
  • 出错处理程序

1.3 编译阶段的组合

内容

  • 分析、综合

    • 源程序的分析

      • 线性分析
      • 层次分析
      • 语义分析
    • 目标程序的综合
  • 编译的前端
    • -----------------------------------------------以中间代码为界
  • 编译的后端
  • 遍(趟)从头到尾扫描源程序(各种形式)一遍(pass)

分遍(趟, pass)问题

在编译过程中,扫描源(中间)程序的次数成为该编译程序的"遍"数。决定分遍次数的因素有:

  • 源语言

    FORTRAN、Pascal等,只需要单遍扫描

    ALGOL60 要两遍扫描

    ALGOL68 要三遍扫描

    若允许先使用、后说明,则通常需要多遍扫描。

  • 机器,尤其是内外存的大小,内存小,可能需要多遍

  • 优化要求。充分优化需要多遍

总结:多遍的结构清晰,优化好,但重复工作多,输入输出多,编译器本身代码长,且编译速度慢,出错处理较困难。

本书的PL/0编译器就是一个单遍编译器。

高级语言解释系统

  • 功能:让计算机执行高级语言
  • 与编译程序的不同
    • 不生成目标代码
    • 能支持交互环境(同增量式编译系统)
  • 源程序和初始数据 通过 解释程序 得到 计算结果

解释系统

直接对源程序中的语句进行分析,执行器隐含的操作

编译阶段和运行阶段存储结构

解释系统存储结构

编译程序设计要求

  • 目标程序运行速度快
  • 目标程序短
  • 编译程序快
  • 编译空间 -> 小 / 充分利用内存
  • 诊断、矫正错误的功能性强

1.4 PL/0 编译程序

结构

源语言 实现语言 目标语言
PL/0 C/pascal 类 pcode

程序实例

CONST A = 10;  // 常量说明部分
VAR B,C;       // 变量说明部分
PROCEDURE P;   // 过程说明部分VAR D;PROCEDURE Q;VAR X;BEGIN                       |READ(X);               |D:=X;                 |   // Q的过程体WHILE X#0 DO            |CALL P;                |END;BEGIN              |WRITE(D);      |   // P的过程体CALL Q;         |END;
BEGIN           |CALL P;        |   // 主程序体
END.            |

同PASCAL

作用域规则:内层可引用包围它的外层定义的标识符,上下文约束

过程可嵌套定义,可递归调用

子集

  • 数据类型,只有整型
  • 数据结构,只有简变和常数
  • 数字最多为14位
  • 标识符的有效长度为10
  • 语句种类
  • 过程最多可嵌套三层

程序图

程序图画图图形:

程序图画图实例

PL/0 语言文法

EBNF引入的符号(元符号):

符号 定义
< > 用左右尖括号括起来的语法成分为非终结符
∷= (→) ∷=(→)的左部由右部定义
|
{ } 表示花括号内的语法成分可重复任意次或限
[] 表示方括号内的语法成分为任选项
() 表示圆括号内的成分优先

用 EBNF 描述<整数>的定义

<整数> ::= [+|-] <数字> {<数字>}
<数字> ::= 0|1|2|3|4|5|6|7|8|9或者更好的写法
<整数> ::= [+|-]<非零数字>{<数字>}|0
<非零数字>::=1|2|3|4|5|6|7|8|9
<数字>::=0|<非零数字>

目标代码类pcode

目标代码类pcdoe是一种假想式计算机的汇编语言

指令格式

f l a
  • f:功能吗
  • l:层次码(标识符引用层去定义层)
  • a:根据不同指令有所区别

编译原理复习 第一章 概述相关推荐

  1. 【编译原理】第一章 引论

    一,语言处理器 1)一个集成的软件开发环境,其中包括很多种类的语言处理器,比如编译器.解释器.汇编器.连接器.加载器.调试器以及程序概要提取工具. 2)编译器:把源程序的每一条语句都编译成机器语言,并 ...

  2. 【编译原理】-- 第一章(翻译程序、编译程序、汇编程序、解释程序、编译过程概述)

    编译系统 高级语言的优点是有代价的,必须有一个"翻译程序",也就是高级语言必须有相应的软件支持系统,"编译程序+相应的支持用户程序"---编译系统. 一般这种编 ...

  3. 《编译原理》第一章知识点

    思维导图

  4. 数据库系统原理(第一章概述)

    一.数据库基本概念 什么是数据:数据(Data)是描述事物的符号记录,是指利用物理符号记录下来的. 可以鉴别的信息. 数据是信息存在的一种形式,只有通过解释或处理的数据才能成为有用的信息. 什么是数据 ...

  5. 软件工程复习 第一章 概述 软件定义 软件危机 软件三要素

    1.1软件 1.1.1软件的概念 软件=程序(可执行部分)+文档(不可执行部分)+数据 程序:按事先设计的功能和性能需求执行的指令序列 数据:是程序能正常操纵信息的数据结构 文档:与程序开发.维护和使 ...

  6. 数字图像处理:第一章 概述

    第一章 概述 数字图象处理是一门关于如何用计算机对图象进行处理的学科,本课程主要讲解基本原理和方法,针对计算机系的学生,强调编程实践和建立图象处理应用系统的方法.推荐的教材与图象编程参考书包括: R. ...

  7. 操作系统王道考研复习——第一章(计算机系统概述)

    操作系统王道考研复习--第一章(计算机系统概述) 计算机系统概述 1.1操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 1. 并发 2. 共享 3. 虚拟 4. 异步 1. ...

  8. 计算机网络第一章(概述)

    第一章 概述 1.1因特网概述 1.1.1网络.互联网和因特网 网络(Network),由若干结点(Node) 和连接这些结点的 链路(Link) 组成. 多个网络还可以通过路由器互联起来,这样就构成 ...

  9. 第二篇第一章概述及第二章生产和储存物品的火灾危险性分类 重点在于表格...

    2019/1/4 [录播]2018一消精华班-实务-一级消防工程师-环球网校 http://v.edu24ol.com/?type=lesson&id=178923&gid=16157 ...

最新文章

  1. Python,OpenCV轮廓属性、轮廓检测及绘制
  2. Linux Unix C 中的curses库——curses.h
  3. 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image
  4. wxWidgets:编写应用程序的快速指南
  5. java+jtextfield+取值_[求助]JTextfield 取值问题!
  6. ABAP Text table implementation
  7. html5可以用flash,HTML5网页可以直接看视频,不用flash吗,另外WP7为何不支持flash。。。HTML5网页...
  8. 机器学习之特征工程-特征选择
  9. 异步执行线程的两种方法
  10. 小米被指记录用户的 Web 和手机使用数据;传瑞幸咖啡CTO因个人原因辞职;IntelliJ IDEA 新版发布 | 极客头条...
  11. Android Activity界面切换添加动画特效 (转载修改)
  12. Android 屏幕防偷窥,Android 8.1将发布:启用TLS加密防偷窥
  13. 一卡通(M1卡)破解过程记录——获取扇区密钥
  14. 2.概率论-概率论公理
  15. 推荐一本Python数据挖掘的好书
  16. 渗透测试工程师面试题大全(二)
  17. 什么是Base64算法?——全网最详细讲解
  18. vivo X Note暗藏黑科技,三麦降噪让开黑更安心
  19. 用户活跃/用户价值度分析
  20. Pandas的数据结构之DataFrame

热门文章

  1. eBay、亚马逊、Lazada、Shopee、速卖通、美客多等跨境电商平台,测评自养号需要满足什么条件?listing如何优化?
  2. [HEOI2013] 钙铁锌硒维生素
  3. Linux后SVN拒绝访问,SVN无法提交出现 Can't set file /db/txn_current read-write :拒绝访问...
  4. Akka默认20s超时修改配置
  5. 网易云轻舟设计理念与技术选型
  6. Excel 划分各分数段并统计各分数段的人数
  7. 使用c语言解析gprmc数据
  8. php5+ssl,AS3上安装Apache2+MySQL+PHP5+Resin+SSL+GD以及webalizer(补
  9. 基于vue开发的多条件联动筛选特效(类似京东/淘宝/中国移动)
  10. 基于java的宠物管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)