编译原理——编译器结构

综述

编译器是具有高度模块化的一种结构,说白了就是编译的任务被划分为一个个小的子任务,交付给不同的小模块来执行。这些小模块的串行(顺序)执行,对应的就是小任务的串行实现,最终就实现了编译这个总任务。
所以说编译器也可以看成由多个阶段构成的流水线结构
编译原理——编译器结构_第1张图片
如图所示,一种简单的"流水线“式的编译器结构
编译原理——编译器结构_第2张图片
这个是具有优化的编译器结构以及流程图,注意语法单位就是上面说的抽象语法树,四元式就是中间代码,可以经过优化,提高后面生成的目标代码的执行效率
编译原理——编译器结构_第3张图片
更详细的框图,中间每个阶段处理都可能出错,自然需要差错处理

一种简单的编译器实现

被我们编译的源语言: 加法表达式sum,他的语言只有两种形式①直接就是整型数,比如 3 ②两个整数的加法形式 比如 3+4
目标机器,也就是编译器所在的那个机器: 它为栈式计算机,它上面主要有两条指令①push n,也就是将操作数压栈②add;他负责将栈顶元素和次栈顶元素弹出并相加,然后将相加后的结果再压入栈中(是的,你就当这条指令完成了这么多复杂的功能就行了)
我们的任务:编译1+2+3这个源语言写成的代码到我们的目标机器(栈式计算机)上
一: 将1+2+3这个字符序列送到词法分析部件(说是部件,其实就是一个软件模块)中,生成记号序列。然后将记号序列送至语法分析部件,生成抽象语法树(一种数据结构)。如下图所示
编译原理——编译器结构_第4张图片
二: 然后语义分析(这里面简化就不写了),最后再代码生成,我们代码生成的方法是后序遍历这棵抽象语法树,当遍历到整数n时,生成push n的代码(我们这里说的代码是汇编语言代码),当遍历到+时,生成add代码,所以我们最后生成的目标代码为
push 1
push 2
add
push 3
add
这样我们一个简单的从源语言到机器代码的编译过程就完成了

你可能感兴趣的:(从0开始学习计算机之编译原理)