1.1从面向机器的语言到面向人类的语言:

 

面向机器:

机器语言   其表现形式为:0和1组成的数字串

          汇编语言   其表现形式为:add si,ax 使用具有一定含义的符号为助忆符

面向人类:

          通用程序设计语言  例如C/C++、JAVA          特点:具有很高的抽象程度

          数据查询语言      例如SQL语言      

          形式化描述语言    例如编译器构造中常用的工具YACC语言    特点:基于数据基础的产生式

 

1.2语言之间的翻译

看下面图解就差不多了

第一章 引言---编译的大致流程

 

1.3编译器与解释器

第一章 引言---编译的大致流程

解释器与编译器的主要区别在于:运行目标程序时的控制权在解释器而不在目标程序

与编译器相比,解释器有以下两个优点:

  1. 具有较好的动态特性。解释器运行时,由于源程序也参与其中,因此数据对象的类型可以动态改变
  2. 具有较好的可移植性

1.4编译器的工作原理与基本组成

以阶段划分编译器

第一章 引言---编译的大致流程

源代码如下:

Var x,y,z:real;

x:=y+z*60

 

【1】词法分析:

Var id1,id2,id3:real;

id1:id2+id3*60;

 

【2】语法分析:

 

第一章 引言---编译的大致流程

【3】语义分析:

第一章 引言---编译的大致流程

为什么增加了一个itr?

答:因为三个变量均是real类型的,而60是integer类型,因此语义分析要增加一个itr操作,把60转换成real类型的60.0;

 

中间代码优化时就已经完成了60到60.0的转换;

 

【4】中间代码生成:

 

中间代码的基本格式:

(序号)(op,        arg1,         arg2,       result)

                操作符     左操作数      右操作数       结果

 

 

  1. (itr,60, ,T1)
  2. (*,id3,T1,T2)
  3. (+,id2,T2,T3)
  4. (:=,T3, ,id1)

 

 

【5】中间代码优化:

  1. (*,id3,60.0,T1)
  2. (+,id2,T1,id1)

作用省略上一步骤中多余的代码

 

 

【6】目标代码生成:

MOVF  id3,R2

MULF   #60.0,R2

MOVF   id2,R1

ADDF   R2,R1

MOVF   R1,id1

 

注:其中MOVF,MULF,ADDF分别表示浮点数的传送加操作

 

ADDF和MULF的含义是:

操作形式:OP  source,target      OP代表ADDF(加)或者MULF(乘)

它表示target:=source  op  target   即:source和target进行OP运算,结果存进target

 

MOVF的含义:

操作形式:MOVF  source,target

它表示target:=source     即:将source中的内容移进target中

 

【7】符号表管理

作用:记录源程序中符号的必要信息,并加以合理组织,从而在各个阶段能对这些符号进行快速、准确的查找和操作

 

【8】出错处理

错误分为动态错误和静态错误两类

动态错误:源程序中的逻辑错误,发生在程序运行时,也被称为动态语义错误

Example:变量取值为0时做除数or数组元素引用时下标出界

 

静态错误:又分为语法错误和静态语义错误

语法错误是指有关语言结构的错误

Example:单词拼写错误,缺少操作数等等

 

静态语义错误是指分析源程序时可以发现的语言意义上的错误、

Example:加法的两个操作数中的一个是整型变量名,一个是数组名

 

1.4.4编译器的分析/综合模式

第一章 引言---编译的大致流程

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2021-07-09
  • 2021-12-18
  • 2021-09-20
  • 2021-05-13
  • 2021-05-31
猜你喜欢
  • 2021-09-02
  • 2021-06-22
  • 2021-11-26
  • 2021-09-24
  • 2021-06-14
相关资源
相似解决方案