编译原理学习第一步-概论

第一章编译程序概论

1. 什么是编译程序

基本概念

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

  • 翻译程序
    把一种语言(源语言)书写的程序翻译为另一种语言(目标语言)的等价的程序
  • 编译程序
    高级语言到低级语言的翻译程序.

程序设计语言及其翻译

image-20210413175514382

翻译程序

image-20210413180209449

高级语言程序处理的两种方法

编译途径

  1. 方法1:
image-20210413181042799
  1. 方法2:
image-20210414141324538

解释途径

image-20210414141527137

直接解释执行

与编译的主要区别是:解释程序不产生目标代码

编译程序在软件中的地位

属于系统软件类

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

语言处理过程

image-20210414143311032

2. 编译程序概述

编译逻辑过程

词法分析

扫描源程序的ASCII码序列,拼出每一个单词,并把每一个单词的ASCII码序列替换为所谓的机内表示TOKEN形式,这时还检查词法错误.但是此时的分析阶段不依靠语法关系

​ 简单的说,就是从左到右读字符流的源程序,识别单词

例如:

\[a=b+c*60; \]

单词类型 单词值
标识符1(id1) a
算符(赋值) =
标识符2(id2) b
算符(加) +
标识符3(id3) c
算符(乘) *
整数 60
分号 ;
例如
int a;
a=a+2;
单词类型 单词值
保留字 int
标识符(变量名) a
界符 ;
标识符(变量名) a
算符(赋值) =
标识符(变量名) a
算符(加) +
整数 2
界符 ;

语法分析

  • 功能

    • 层次分析

      依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树)

      ​ 扫描对象可能是源程序的ASCII码序列,也可能是词法分析后的TOKEN序列.主要任务是检查源程序的形式语法错误,每当发现错误时将输出错误信息

  • 规则(::=代表等价于)

    <赋值语句>::=<标识符> "=" <表达式>

    ​ <表达式>::=<表达式> "+"<表达式>

    ​ <表达式>::=<表达式>"*"<表达式>

    ​ <表达式>::="("<表达式>")"

    ​ <表达式>::=<标识符>

    ​ <表达式>::=<整数>

    ​ <表达式>::=<实数>

    image-20210414150041095

    例如:

    \[id1=id2+id3*N \]

    image-20210414150437039

语义分析

  • 语义审查(静态语义)
    • ​ 上下文相关性
    • ​ 类型匹配
    • ​ 类型转换

中间代码生成

​ 扫描对象通常是语法分析后的结果,这部分把源程序的TOKEN序列转换为更接近目标代码的中间代码三元式或者四元式的序列

  • 源程序的内部中间(表示)
    • 后缀式,三元式,四元式,树

例如:

后缀式:\(ab+c*\) 表示\((a+b)*c\)

三元式:(*,c,t1)

四元式:(*,c,t1,t2)

中间代码生成例子:

\(a=b+c*60\)

  1. (int_to_real,60,-,t1)
  2. (*,c,t1,t2)
  3. (+,b,t2,t3)
  4. (=,t3,-,a)

代码优化

​ 按代码级别,可以分为源代码优化,中间代码优化和目标代码优化三种

​ 其中:中间代码优化扫描对象是中间代码,任务是把优化前的中间代码转为可产生高质量目标代码的中间代码

​ 优化工作包括表达式优化,公共子表达式优化,不便表达式外提和消减运输强度等

代码优化例:

image-20210414152312329

目标代码生成

​ 扫描对象是中间代码,任务是从中间代码产生目标代码,这一部分的工作与目标机紧密相关,其他部分的工作几乎和目标机无关.

例如:

(*,c,60,t1)
(+,b,t1,c)
MOV AX,c
MOV BX,60
MUL BX
MOV CX,b
ADD CX,AX
MOV a,CX

编译辅助工作

表格管理

​ 较大的编译程序用到很多表格,甚至可达几十种表.不少编译程序都设立一些专门子程序(成为表格管理程序),他们专门负责管理表格.

  • 记录源程序中的使用的名字
  • 收集每个名字的各种属性信息,包括:类型,作用域,分配存储信息

例如:

名称 类型
Const1 常量 35
Var1 变量

出错处理

​ 出错处理包括词法错误,语法错误,静态语义错误,动态语义错误等;

​ 出错处理模块的作用是:检查错误,报告出错信息,排错,恢复编译工作

编译程序的结构

image-20210414154315159

3. 编译技术的发展和应用

实现方式

  • 手工
    • 机器语言
    • 汇编
    • 系统程序设计语言
  • 自动构造工具: lex yacc gccs
  • 分类: 命令行, 集成环境

程序设计语言范型

  1. 命令式

    程序特点:
    语句1
    语句2
    语句3
    

    与冯若曼机的体系结构一般

  2. 应用式(函数式)

    1. 程序特点
    function n(...function2(function1(data)))
    
    1. 程序执行:

      执行一个个函数施用在数据上的变换最终得到结果

    2. 编译:

      语法分析容易,

      语义处理复杂

  3. 基于规则的语言

    1. 程序特点:

      使能条件1->动作1
      使能条件2->动作2
      使能条件3->动作3
      
  4. 面向对象语言

    1. 特点

      抽象数据类型,继承机制

      编译:动态绑定

执行环境

  • 批处理环境
    • 将源程序作为整体处理
    • 排除程序错误不能依靠用户的外部帮助
  • 交互环境
    • 解释
    • 增量式编译
  • 嵌入式系统环境
    • 交叉编译
  • 分布并行环境
    • 并行编译
  • 程序创建和测试环境
    • 独立编译
    • 编译和调试同时设计考虑

编译技术的应用

  • 数据库系统查询
  • 脚本语言
  • 置标语言(HTML,XML,SHTML)
  • 嵌入式系统

研究领域

  • 并行编译技术
  • 交叉编译技术
  • 嵌入式系统
  • 硬件描述语言及其编译技术
posted @ 2021-04-14 17:09  rzg0813  阅读(311)  评论(0)    收藏  举报