LLVM/Clang编译器
除了GCC,Clang编译器也是目前嵌入式开发经常使用的一款编译器,想要了解Clang编译器,还得从GCC编译器说起。
编译器的实现
一个完成的编译器,为了保持可扩展性和兼容性,一般会设计成三部分构成,如GCC编译器,由前端、中间代码和后端构成:
- Frontend:源码分析、语法检查,输出中间代码
- Optimizer:对中间代码进行优化、使其运行更高效
- Backend:将中间代码转换为某一个平台的机器代码
在编译器的设计中,通过模块化设计,前端和后端分离,编译器的可扩展性就大大增加:可以支持更多的硬件平台,可以支持编译更多的语言.
GCC的实现虽然实现了前后端分离,也开始支持越来越多的硬件平台和编程语言。但缺点是由于历史原因,模块化设计不够彻底,模块之间的耦合太高,代码的可重用性低。
LLVM
为了解决GCC的耦合度高的问题,一个开源的编译器框架LLVM问世了,LLVM是 Low Level Virtual Machine的简称,看名字就知道,早期是一个虚拟机项目,后来就慢慢发展,变成了一个开源的编译器框架。
LLVM通过模块化设计,代码的可重用性更高。而且LLVM还设计了自己单独的中间语言 LLVM IR,类C表达,可以更加方便的支持各种硬件平台和编程语言。如果你想开发一门新的编程语言,你根本不需要关心太多的东西,只关心如何将自己的新语言语法翻译成LLVM IR中间语言就可以了,其他的模块都可以复用LLVM框架里的现有模块。
目前 LLVM 支持C、C++、Java、Fortran、Ada、Swift、Python、Ruby、Rust、C#等编程语言,支持X86、ARM、MIPS、RISC-V等各种平台。
Clang编译器
Clang编译器就是基于 开源编译器框架 LLVM 开发的一款编译器,主要用来编译Apple公司使用Objective-C 语言编写的的生态软件。苹果公司的软件使用Objective-C语言开发,早期使用的编译器是GCC的扩展版本,通过GCC扩展,支持Objective-C语言的编译,因为GCC代码耦合性高,不利于IDE集成和模块化调用,所以后来苹果公司就将Objective-C的编译器慢慢过渡到使用LLVM开发的LLVM GCC编译器。
LLVM GCC 基于 LLVM框架进行开发,但前端使用的仍然是GCC,后来前端才替换为 Clang,支持C、C++、Objective-C 语言的编译。Clang编译器目前广泛应用于苹果软件生态、Android开发等领域。
方舟编译器
方舟编译器也可以看做是基于开源编译器框架 LLVM 设计的一款编译器。用于构建鸿蒙软件生态。从目前的信息可以看到,方舟编译器基于 LLVM 做了很大改进,比如做了编译优化,针对Java语言,直接生成对应的机器码,而不是Java的虚拟机字节码,跳过边解释边执行,可以提高程序的运行效率。
方舟编译器的另外一个改进,就是重新构建了新的中间语言,可以基于具体的硬件平台做优化,笔者不是做这块的,只是大概了解一下,如果有兴趣,可以自行查找相关资料学习。