【编译原理】编译器概述、编译器结构、编译器实例

编译器概述、编译器结构、编译器实例

编译器概述

1.编译器是一个程序
核心功能是把源代码翻译成目标代码
比如源代码:C/C++,Java,C#,html
目标代码:X86,IA64,ARM,…

把一种源程序翻译成另外一种源程序,例如:将C++ 利用Cfront翻译成C语言(广义上)
把源程序翻译成目标代码,比如:C语言翻译成X86

源代码经过编译器的翻译生成目标代码(静态计算,不执行这个代码,要保证语义相同,语义保持

真实的计算机 或 JVM虚拟机 通过对目标代码进行动态计算得到结果

解释器:解释器也是处理程序的一种程序

编译器:gcc g++ 得到可执行程序 离线的方式 offline
解释器 处理过程 得到结果 在线 online

编译器的高层结构

编译器具有非常模块化的高层结构

输入→前端()→后端()→输出
前端:做词法分析、语法分析的部分
后端:做指令生成、指令优化的部分

抽象的多个阶段(phase)
编译器可以看成多个阶段构成的“流水线”结构

典型编译器高层结构
一种没有优化的编译器结构
1.词法分析(第一个阶段 字符序列处理后得到 记号序列 )
2.语法分析(记号序列 处理后 建立 抽象语法树)
3.语义分析(对语法树的合法性进行处理,程序没有语义语法的错误后 得到中间代码,如果这个语义没错,后面步骤就不会再报错了,这里已经将代码的语法语义检测完毕)
4.代码生成(由中间代码 生成目标代码)

符号表:存取了编译过程中的相关信息,和上述阶段都有联系

更复杂的一种编译器结构
在这里插入图片描述

**小结:**编译器由多个阶段组成,每个阶段都要处理不同的问题(使用不同的理论、数据结构和算法)
编译器设计中的重要问题是如何 合理的划分组织各个阶段
接口清晰
编译器容易实现、维护

编译器示例

规则
在这里插入图片描述
编译器实现:
任务:编译程序1+2+3到栈式计算机
(左结合)
“1+2+3” 用树来存储(中序遍历)AST
前端语法分析 代码生成(使用树的后序遍历 post-order) stack

  1. 遇到的节点是n的话就push n
  2. 遇到的节点是加号的话就生成代码“add”

在这里插入图片描述
阶段一:词法分析
阶段二:语法树生成
在这里插入图片描述

阶段三:代码生成
在这里插入图片描述

小结

  1. 编译器的构造和具体的编译器目标相关,
    前端负责将输入的 变成语法树(中间表示)
    后端做代码生成(生成stack)也就是目标代码。
  2. 任务:增加一个代码优化的阶段
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chen_devy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值