编译原理--概论

为什么需要编译程序

将程序员编写的源程序→机器可以执行的机器代码

编译程序做什么

  1. 做什么?程序源码→可执行二进制代码
  2. 怎么做?用翻译英语类比
    分析源码的字符串---------→分解成语法单元–→生成中间代码–→代码优化–→目标代码生成
    确定单词、标点、分隔–→分析句子语法结构→初步翻译--------→润色-------→译文

词法分析

  1. 任务:识别单词符号,在符号表中查找,登记单词符号和它的信息。
  2. 单词符号信息:单词符号的类型(如关键字、标识符、运算符)、内部表示、数值等。
  3. 主要学习内容:词法分析的基本原理、有限状态机、正规表达式、等价转换、词法分析生成器Lex。

语法分析

  1. 任务:根据词法分析,将单词符号串分解成语法单元,如表达式、子句、块程序、程序。

  2. 流程:单词符号→层次分解→语法分析树

  3. while(i<100) sum+=i++;语法分析树

  4. 主要学习内容:程序语言规则的形式语言基础、递归下降分析LL(1)技术、算符优先分析、LR分析、语法分析工具YACC。

语义分析

  1. 任务:检查语义是否正确。
  2. 检查内容:变量是否定义、变量使用前是否初始化、数值是否溢出、类型检查、类型转换。
  3. 主要学习内容:符号表、运行时存储空间的组织和管理;属性文法。

中间代码生成

  1. 任务:利用语法制导,源程序→中间代码
  2. 中间代码:定义明确,独立计算机硬件的记号系统。引入中间代码的目的是让编程语言及程序不依赖于计算机类型,方便移植。
  3. 中间代码的要求:便于将源程序翻译成它,便于把它翻译成计算机指令或汇编语言。
  4. 三地址代码:类似于机器汇编语言,每个存储单元类似于寄存器。由三地址语句序列组成,每条语句最多包含三个操作数。
    5.while(i<100) sum+=i++;三地址代码示例
  5. 主要学习内容:典型中间代码语言,高级语言基本结构的语法制导,翻译方法。

代码优化

  1. 任务:对前一阶段的中间代码进行等价变换,提升目标代码执行性能,减小占用空间。例如将上图中的t1和t2消掉。
  2. 不足:中间代码优化和目标代码优化都耗费时间、空间资源。
  3. 学习内容:代码优化基本技术。

目标代码生成

  1. 任务:将优化后的中间代码→机器指令或汇编程序。
  2. 依赖性:依赖于计算机的硬件、指令系统、机器指令的选择、各种类型变量存储空间的分配、寄存器的分配和调度。
  3. 目标代码:绝对地址指令代码、汇编代码、可重定位指令代码(执行前需要连接装配程序,连接各个目标模块)
  4. 在这里插入图片描述
  5. 学习内容:代码生成算法。

编译程序的构成

在这里插入图片描述

基本功能模块

词法分析器、语法分析器、语义分析与中间代码生成、代码优化器、目标代码生成

符号表

  1. 任务:把编译程序中的各种符号合理地组织管理,方便符号信息的添加、查询、更新、删除。
  2. 动态性:
    符号表随着编译过程动态变化:
    词法分析阶段查询符号表,无则添加。
    语法语义分析阶段确定标识符的种属(变量名、函数名)、类型(整形、实型)、作用域。
    代码生成阶段确定标识符的地址。

错误

  1. 任务:识别、诊断、报告程序中的各种错误。
  2. 错误类型:语法错误、语义错误
  3. 语法错误:不符合语法规则,在词法分析(非法字符拼写错误)和语法分析(括号不匹配,关键字拼写错误)
  4. 语义错误:违背语言语义规则,在语义分析和运行时阶段被发现。包括变量作用域错误、类型不一致错误等。

相关概念

前端和后端

编译程序分类

技术和工具

开发编译程序

自展技术

  1. 算法流程:
    使用机器语言或者汇编语言编写L0编译程序。
    使用高级语言编写L1程序。
    利用L0编译该高级语言,生成L1的编译程序。
    依次类推得到L语言的编译程序。

移植技术

  1. 任务:在宿主计算机上使用高级语言,编写一个能在目标机器上运行的编译程序。

自动生成技术

  1. 目的:应对多种多样的高级语言,缩短编译程序的开发时间。
  2. 举例:
    Lex:通用词法分析生成器,输入描述单词结构的正规式,输出词法分析程序。
    YACC:接收LALR(1)语法,生成一个LALR(1)语法分析器。

相关程序

除了编译器,还需要预处理器、汇编器、连接器和加载器。
在这里插入图片描述

参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值