《编译与反编译技术实战》——2.3 编译器的设计与实现概述-阿里云开发者社区

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

《编译与反编译技术实战》——2.3 编译器的设计与实现概述

简介:
+关注继续查看

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

2.3 编译器的设计与实现概述

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

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

2.3.1 利用Flex和Bison实现词法和语法分析

在UNIX环境中编写程序,你往往会邂逅神秘的LEX和YACC,而GNU/Linux用户则会邂逅Flex和Bison。

Flex是一个与LEX兼容的词法分析器生成器,可以用它来生成一个新的语言的词法分析器,Flex就是由Vern Paxon实现的一个LEX,使用它既可以节省时间,也可以提高正确性。

Bison是一个与YACC兼容的语法分析器生成器,可以用它来生成一个新的语言的语法分析器,使用它也可以提高正确性并节省开发时间,实际上,Bison是一个可以把符合 LALR(1)文法规范的上下文无关文法转换成 C语言程序的语法分析器生成器,是一个GNU版本的YACC。

实现一种新语言,需要做的工作主要包括设计文法、进行语法制导的翻译、优化和代码生成,而后续的工作还可以由LLVM的相关工具提供支持。

2.3.2 利用LLVM实现代码优化和代码生成

LLVM是一个包含一系列模块化可重用编译器和工具链技术的项目。LLVM主要的子项目有LLVM Core libraries、Clang、Dragonegg、LLDB等。其中LLVM Core libraries(LLVM核心库)提供了一个不依赖于目标平台的优化器,同时还为许多典型架构的CPU提供了代码生成的支持。这些库是围绕着一个有详细说明的中间代码表示形式(LLVM IR)建立起来的。也就是说,只要能够把待设计的语言翻译成LLVM IR这种中间语言,就可以利用LLVM完成代码优化和代码生成的工作。当然,这要求目标CPU架构必须是LLVM已经支持的,否则就得自己完成代码生成的工作。Clang是一个LLVM自身的C/C++/Objective-C编译器,目标是提供快速的编译。

Dragonegg的功能是把LLVM的优化器、代码生成器和GCC 4.5的分析器结合在一起,这样就使得LLVM能够编译像Ada、Fortran等其他GCC编译器前端支持的语言,且能够拥有一些Clang不支持的C特性(如OpenMP等)。LLDB则是建立在LLVM库和Clang之上的一个非常好的本地调试器。

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

相关文章
带你读《LLVM编译器实战教程》之一:构建和安装LLVM
本书的前半部分将向您介绍怎么样去配置、构建、和安装LLVM的不同软件库、工具和外部项目。接下来,本书的后半部分将向您介绍LLVM的各种设计细节,并逐步地讲解LLVM的各个编译步骤:前段、中间表示(IR)、后端、即时编译(JIT)引擎、跨平台编译和插件接口。本书包含有大量翔实的示例和代码片段,以帮助读者平稳顺利的掌握LLVM的编译器开发环境。
12345 0
《编译与反编译技术实战 》一3.2 词法分析器的手工实现
手工构造词法分析器首先需要将描述单词符号的正规文法或者正规式转化为状态转换图,然后再依据状态转换图进行词法分析器的构造。状态转换图是一个有限方向图,结点代表状态,用圆圈表示;状态之间用箭弧连接,箭弧上的标记(字符)代表射出结点状态下可能出现的输入字符或字符类。
1015 0
带你读《LLVM编译器实战教程》之二:外部项目
本书的前半部分将向您介绍怎么样去配置、构建、和安装LLVM的不同软件库、工具和外部项目。接下来,本书的后半部分将向您介绍LLVM的各种设计细节,并逐步地讲解LLVM的各个编译步骤:前段、中间表示(IR)、后端、即时编译(JIT)引擎、跨平台编译和插件接口。本书包含有大量翔实的示例和代码片段,以帮助读者平稳顺利的掌握LLVM的编译器开发环境。
4435 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4485 0
《编译与反编译技术实战 》一3.3 词法分析器的LEX实现
由于程序设计语言中的单词基本上都可用一组正规式来描述,因此,人们希望构造一个自动生成系统:对于一个给定的高级语言,只要给出用来描述其各类单词词法结构的一组正则表达式,以及识别各类单词时词法分析程序应采取的语义动作,该系统便可自动产生此语言的词法分析程序。
1840 0
IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库
启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件。也可以按取消后再把文件拖进IDA。由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了。
1019 0
IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名
首先看看windows IDA和xcode的反汇编有什么不同。因为不确定直接分析UIKit的代码会不会有法律问题,还是自己写个例子吧。分析UIKit的时候因为没有完整的debugging symbols,所以得到的反汇编信息会比自己写的代码较少。
810 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载