【编译原理】第1章 引论

1 引论

一、基本概念

  1. 源语言程序:源语言编写的程序,源语言一般指的是编写源程序所用的语言,它必须翻译成机器语言才能在计算机中使用。
  2. 目标语言程序:由计算机的机器指令构成的程序。翻译程序的输出称目标程序,一般目标程序都是机器语言程序,输出的语言即目标语言。
  3. 翻译程序:把某种语言程序(源语言程序)等价转换成另一种语言程序(目标语言程序)的程序。
    翻译程序有两种工作方式:编译和解释
  4. 解释程序:一种语言处理程序,边解释边执行高级语言源程序的程序。
    解释程序与编译程序区别:①不生成目标代码 ②支持交互环境
  5. 编译程序:把某一种高级语言程序转换成另一种低级语言程序(如汇编语言或机器语言)的程序。

二、编译过程

(一)编译过程分6个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成

  1. 词法分析:读字符流的源程序、识别单词

    注:标识符是由字母开头,后跟字母、数字字符的字符序列组成的一种单词。
  2. 语法分析:在词法分析的基础上将单词序列分解成各类语法短语(语法单位)
  3. 语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息
  4. 中间代码生成:源程序的内部(中间)表示
    四元式的形式:(运算符,运算对象1,运算对象2,结果)
    eg: position := initial + rate * 60(id1:= id2 + id3 * 60)生成四元式序列如下:

ti 是编译程序生成的临时名字,用于存放运算的中间结果

  1. 代码优化:对中间代码进行变换或改造,使目标代码更高效(具体变换见上图)
  2. 目标代码生成:把中间代码变换成特定机器上的目标代码
    目标代码三种形式:
    ①绝对指令代码(可直接运行)②可重定位的指令代码(需连接装配)③汇编指令代码(需进行汇编)
    在这里插入图片描述

(二)编译程序结构

词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序,还包括表格管理程序和出错处理程序

  • 符号表管理:记录源程序中使用的名字,收集每个名字的各种属性信息
  • 出错处理:检查错误、报告出错信息、排错、恢复编译工作

(三)编译前端与后端

  • 前端:与源语言有关,通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
  • 后端:与目标机有关,指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(四)遍

  • 遍(趟):是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 从头到尾扫描源程序(各种形式)一遍

三、PL/0编译程序

👉PL/0语言PASCAL语言的子集,功能简单,结构清晰,可读性强,具备一般高级语言的必备部分
PL/0语言编译系统由编译程序解释程序两部分组成,分别称为PL/0编译程序类P-code解释程序


👉PL/0编译程序的实现
在这里插入图片描述
👉PL/0非形式化描述
在这里插入图片描述
👉PL/0语言文法的EBNF表示
在这里插入图片描述
👉PL/0语言语法的EBNF描述
在这里插入图片描述
👉目标代码pcode:一种假想栈式计算机的汇编语言
指令格式: f:功能码 l:层次差a:根据不同的指令有所区别

在这里插入图片描述

题目练习

1、下列错误信息可能为编译的哪个阶段报告的?
  (1)else没有匹配的if    语法分析
  (2)数组下标越界    语义分析
  (3)使用的函数没有定义    语法分析
  (4)在数中出现非数字字符    词法分析
2、语法分析的依据是 语法规则
3、用高级语言编写的程序经编译后产生的程序叫()
   A.解释程序    B.目标程序     C.源程序    D.连接程序
4、编译是做()工作
   A.高级语言的翻译    B.高级语言程序的解释执行    C.机器语言的执行   D.汇编语言的翻译


拓展: 高级程序语言–参数传递

/*对于下述程序,试分析用传名、传值、传地址方法传递参数时所得的打印结果。*/ 

PROGRAM SS(input,output); 
VAR 
A,B:integer; 
PROCEDURE P(x,y,z:integer); 
  begin y:=y+1;z:=z+x; 
  end; 
BEGIN 
  A:=2;b:=3; 
  P(A+B,A,A); 
  writeln (‘A=,A); 
END
  • 传名:相当于执行 A:=2; B:=3;
    A:=A+1; A:=A+(A+B)
    writeln(‘A=‘,A);
    所以,结果为A=9

  • 传值:把实参的值计算出来传给形参。
    在调用过程P时,形参 x=5; y=2; z=2
    出过程P时,形参 x=5; y=3; z=7
    这并不把结果回送到主程序,所以结果为A=2

  • 传地址:实参计算出结果,把地址送形参。
    设变量 T=A+B (结果为5)。执行时把T、A、A的 地址(设为addr1,addr2,addr2)送给形参: x=addr1, y=addr2, z=addr3。
    在这里插入图片描述
    执行过程P即为:①y↑:=y↑+1; ②z↑:=z↑+x↑
    所以,①为 A:=A+1=3
               ②为 A:=A+T=8。
    因此,最后 A=8


bingo~   ✨ 我走的很慢,但是我从不后退

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值