《编译与反编译技术》—第1章1.4节编译器的分类及生成

简介:

本节书摘来自华章出版社《编译与反编译技术》一书中的第1章,第1.4节编译器的分类及生成 ,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区“华章计算机”公众号查看。


1.4 编译器的分类及生成

根据不同的用途和侧重点,编译程序可以进一步分类,换句话说,有许多不同种类的编译器变体。譬如:用于帮助程序开发和调试的编译程序称为诊断编译程序,这类编译器可对程序进行详细检查并报告错误;另一类侧重于提高目标代码效率的编译程序称为优化编译程序,这类编译器通常使用多种混合的“变换”来改善程序的性能,但这往往是以编译器的复杂性和编译时间的增加为代价的。通常,将运行编译程序的机器称为宿主机,将运行编译程序所产生的目标代码的机器称为目标机。如果一个编译程序产生不同于其宿主机指令集的机器代码,则称它为交叉编译程序(Cross Compiler)。还有一类编译器,其目标机器可以改变,而不需要重写它的与机器无关的组件,这类编译器称为可再目标编译器(Retargetable Compiler),通常,这类编译器难以生成高效的代码,因为其难以利用特殊情况和目标机器特性。目前,很多编译程序同时提供了调试、优化、交叉编译等多种功能,用户可以通过“编译选项”进行选择。

编译器本身也是一个程序,这个程序是怎么编写的呢?早期,人们是用汇编语言编写编译器。虽然用汇编语言编写出的编译器代码效率很高,但由于与高级语言编程相比,汇编语言编程难度较大,对编写编译器这种复杂的系统效率不高,因此人们改用高级语言来编写编译器。随着编译技术的逐步成熟,一些专门的编译器编写工具相继涌现,比较成熟和通用的工具有词法分析器生成器(如LEX)和语法分析器生成器(如YACC)等。还有一些工具,如用于语义分析的语法制导翻译工具,用于目标代码生成的自动代码生成器,用于优化的数据流工具等。


相关文章
|
前端开发 程序员
《编译与反编译技术实战 》一2.2 编译器的结构
目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC、C++有G++和I++、Java有JAVAC和GCJ。然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善。因而,实现这些程序设计语言的编译器也需要做出相应的改动。
1296 0