《编译与反编译技术实战 》一2.2 编译器的结构-阿里云开发者社区

开发者社区> 华章计算机> 正文

《编译与反编译技术实战 》一2.2 编译器的结构

简介: 目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC、C++有G++和I++、Java有JAVAC和GCJ。然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善。因而,实现这些程序设计语言的编译器也需要做出相应的改动。
+关注继续查看

本节书摘来自华章出版社《编译与反编译技术实战 》一书中的第2章,第2.2节,庞建民 主编 ,刘晓楠 陶红伟 岳 峰 戴超 编著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 编译器的结构

目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC、C++有G++和I++、Java有JAVAC和GCJ。然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善。因而,实现这些程序设计语言的编译器也需要做出相应的改动。对于程序设计语言自身的改变,有的是为了弥补自身的一些缺陷,如Java语言从设计至今,其体积已经增大了好几倍;有的是为了适应新的软件开发需求,比如为了更容易地开发大型软件等而进行的改善。
除了那些成熟语言的改动会带来编译器软件编程的需要外,新语言的诞生也需要程序员来完成新语言的编译器实现工作。比如,现在不断涌现的各种脚本语言都需要编译器程序员来编写这些语言的编译器或解释器。对于新语言的发明,有的是为了适应特殊领域的编程需要,比如SQL(Structured Query Language)是为关系数据库管理系统专门设计的专用语言;有的是为了更好地利用各种系统资源(尤其是硬件资源),比如OpenCL(Open Computing Language)是为了更好地开发异构平台的计算能力。作为高级语言到目标代码的翻译软件(或者不同语言间的翻译软件)的编译器,对它的编程需求一直都存在。也就是说,总有实现新的编译器或者改动现有编译器的需求存在。
不同的编译器虽然实现方式各异,但编译器的结构却非常相似,通常是按照编译过程的各个阶段来实现相关的程序模块。编译过程中每个阶段工作的逻辑关系如图2-1所示,图中的每个阶段的工作由相关程序模块承担,但其中的符号表管理程序和错误处理程序则贯穿编译过程的各个阶段。这些程序模块构成了编译器的基本结构。


87df32ac2dcc5f5587ca66eafa74353142366868



通常,编译的阶段又被分成前端和后端两部分。前端是由只依赖于源语言的那些阶段或阶段的一部分组成,往往包含词法分析、语法分析、语义分析和中间代码生成等阶段,当然还包括与这些阶段同时完成的错误处理和独立于目标机器的优化。后端是指编译器中依赖于目标机器的部分,往往只与中间语言有关而独立于源语言。后端包括与目标机器相关的代码优化、代码生成和与这些阶段相伴的错误处理和符号表操作。这种前后端的划分使得编译器的设计更加清晰、合理与高效。
基于同一个前端,重写其后端就可以产生同一种源语言在另一种机器上的编译器,这是为不同类型机器编写编译器的常用做法。反过来,把几种不同的语言编译成同一种中间语言,使得不同的前端都使用同一个后端,进而得到一类机器上的几个编译器,却只取得了有限的成功,其原因在于不同源程序语言的区别较大,使得包容它们的中间语言庞大臃肿,难以得到高效率。但是,在反编译的过程中,设计一种中间语言,将不同体系结构的目标代码先翻译成这种中间语言代码,再由这种中间代码反编译为C代码,则是一种较为有效的途径。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
20万+字,熬夜整理了一份程序员不可或缺的软技能高分原创电子书送给你
20万+字,熬夜整理了一份程序员不可或缺的软技能高分原创电子书送给你
4 0
科普,想成为厉害的 Java 后端程序员,你需要懂这 13 个知识点
科普,想成为厉害的 Java 后端程序员,你需要懂这 13 个知识点
4 0
如何调整SAP HANA studio里的字体大小
如何调整SAP HANA studio里的字体大小
5 0
SpringBoot核心【starter启动器】
SpringBoot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了应用场景所需要的start pom,相关的技术配置将会消除,就可以得到SpringBoot为我们提供的自动配置的Bean。
4 0
EasyUI之表单验证
当我们开发一个管理类项目的时候,EasyUI是我常用的一个jquery框架,而表单验证显然是我们必须要实现的功能,而使用基于EasyUI的验证功能就比较简便了,本文来介绍下具体的用法
3 0
面试了十个应届生九个都没用过TreeMap,你确定你们是个 Java 程序员?(2)
面试了十个应届生九个都没用过TreeMap,你确定你们是个 Java 程序员?
4 0
解决办法:undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
解决办法:undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
3 0
SpringBoot【整合Thymeleaf】
SpringBoot中推荐使用的前端模板框架是Thymeleaf,所以本文来介绍下怎样整合Thymeleaf。
3 0
C调用PYTHON运行奇怪崩溃的一例及解决办法
C调用PYTHON运行奇怪崩溃的一例及解决办法
3 0
不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧
不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧
5 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载