编译原理 第〇章 通论

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

从第一个 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)", 根据语法分析咱们获得这样的树:spa

语法树示例

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

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

建立于 2017.9.12
Osinovsy编译器