编译原理之初见续集
编译器的结构
-
编译程序主要分为前端和后端
-
前端:只依赖于源程序,独立于目标机器,生成中间代码
-
后端:依赖于目标机器,与源程序无关,只与中间语言有关,从中间代码生成目标代码
-
可能有些人忘了目标代码是什么?
目标代码主要是机器语言或者是汇编语言
-
晦涩的语言可能让大家理解起来比较困难,不说了上图
-
百因必有果,人们设计成这样必然有他们的道理
好处:提高了开发编译器的效率,这就好比搭积木一样,可以搭不同的东西。 -
取一个编译器的前端,重写它的后端就可以产生同一源语言在另一机器上的编译器(前端:C语言、Java语言)
-
不同的前端使用同一个后端,从而得到一个机器上的几个编译器(注意:这里必须是采用同一种中间语言)(后端:Mac后端、Windows后端等)
遍
- 对源程序或源程序中间表示的一次扫描,每一遍读入一个文件,执行一个或几个阶段的编译操作,并输出源程序的一个中间表示
- 每一遍的输入是上一遍的输出,第一遍的输入是源程序正文,最后一遍的输出是目标代码
- 遍数多:编译器结构清晰,但时间效率不高
- 遍数少:编译速度快,但对机器的内存要求高
灵魂发问:世界上第一个编译程序是用什么语言来书写的
答案显而易见,当然是用机器语言开发的
自展技术
- 直接用目标机器上的机器语言书写源语言的编译程序工作量太大
- 用目标机器上的机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言,实现源语言的编译程序,这就是自展技术。
编译器的构造工具
- 词法分析器自动生成程序 — LEX
- 语法分析器自动生成程序 — YACC
语言处理系统
预处理器
- 删除注释
- 宏展开
- 处理包含文件
- 语言扩充
汇编器
- 处理汇编语言代码,产生可重定位的机器代码
装配器、连接器
- 将多个可重定位机器代码文件连接装配成一个可执行机器代码文件。