编译原理 第〇章 通论

首先明确一下参考书, 我们使用的是《编译原理》(第三版)陈意云 张昱 著 高教出版社.

从第一个 C 语言试验 "hello world" 我们就已经明白了如何写代码和运行代码. 我们打开编译器, 可能是亘古不变的 VC 6.0, 亦或是简洁友好的 dev C++. 不管怎样, 我们都明白这样的流程, 写代码->调试运行. 而我们又知道, 不管你的计算机是什么架构, 都不能直接执行 C 的代码. 在面向硬件的机器码和高级语言之间起到纽带作用的便是编译器.

从高级语言到机器语言

我们学习编译原理的目的就是要明白编译器是怎样将一个高级语言转变成 0/1 串的机器语言的. 整个流程如下图所示:

编译器工作流程简图

需要注意的是, 这个流程仅用来说明大致的工作内容与顺序,并不严谨. 其中前面三项往往被称为编译器的前端, 优化被称作中段, 而生成目标代码叫做编译器的后端.

简单的解释一下这个流程图. 首先是词法分析, 词法分析的工作在于区分代码中的单词与符号. 比如在 C 语言中, 标识符可以由空格断开区分. 如: "int var = 3;", 词法分析的任务便是识别出各个单词. 我们希望当词法分析器读入这一串字符串后可以告诉我们这个串中有几个"单词", "int", "var", "=" 以及 "3". 且他们分别是"类型名", "变量名", "操作符" 以及"数字". 往往这些信息以记号的形式存在, 即 "<TYPE, INT> <ID, "var"> <OP, EQ> <NUM, "3">".

拿到这些信息, 下一步便是语法分析. 语法分析检查拿到的记号流是否满足语法要求. 一般语法分析后,我们会得到语法树. 如"var_a = var_b * (var_c + var_d)", 根据语法分析我们得到这样的树:

语法树示例

然后便是语义分析, 这一步里编译器就会考虑类型匹配, 转换等问题.

优化过程中, 编译器会适当地对代码进行一些调整. 比如数据对齐, 减少依赖甚至是并行化. 最后一步生成目标代码, 就是编译器用前面准备好的信息生成最后的目标代码(机器码). 后两部分可能不是我们重点考虑的内容. 编译器的基本原理主要还是集中在前三个部分。

创建于 2017.9.12
Osinovsy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值