LLVM是模块化和重用编译器和工具链技术的集合,最初由伊利诺伊大学研究,基于SSA现代编译策略,支持任意编译语言的静态和动态编译。LLVM编译器的工作流程大致可以分为3个阶段,分别是前端、优化器和后端。
前端主要任务是把源代码转换成为LLVM IR,含语法分析、语义和词法分析等。常用的前段工具有Clang(C/C++)、MLIR(MLIR语言)等。
优化器是针对中间表示IR进行各种优化,来提高代码性能和降低资源消耗。LLVM框架提供了一种名叫Pass的机制,可以把用户定义的优化功能通过Pass集成到优化器中,成为优化器的一个命令。
后端是把优化后的中间表示转换为目标代码。包括目标代码的生成、汇编和链接等。后端能够针对不同平台生成相应机器代码来完成最终编译过程。LLVM的主要子项目如下:
LLVM核心库提供了现代的源和目标独立优化器,对CPU的代码生成提供支持,这些库围绕一明确代码构建的,称为LLVM中间表示(LLVM IR),核心库有详细文档,且发明了自己的语言用来使用LLVM用于优化器和代码生成器更为简单。
Clang属于一个LLVM原生C/C++/Object-C编译器。主要提供了快速编译、有用错误提示和警告,还提供用于构建出色代码级工具平台。Clang Static Analyzer和 clang-tidy是自动查找代码中错误的工具,是使用 Clang 前端作为解析 C/C++ 代码的库构建的工具的很好示例。
LLDB是基于LLVM和Clang提供的库,提供出色的本机调试器。通过Clang AST和表达式解析器、LLVM JIT、LLVM反汇编器等,来提供正常工作体验,加快符合快且内存效率也高于GDB。
libc ++和 libc++ ABI项目提供了符合标准的高性能 C++ 标准库实现,包括对 C++11 和 C++14 的全面支持。
OpenMP子项目提供了一个OpenMP运行时,可与 Clang 中的 OpenMP 实现一起使用。
polly项目使用多面体模型实现了一套缓存局部性优化以及自动并行和矢量化。
libclc项目旨在实现OpenCL标准库。
LLD项目是一个新的链接器。它是系统链接器的直接替代品,运行速度更快。
BOLT项目 是一个后链接优化器。它通过基于采样分析器收集的执行配置文件优化应用程序的代码布局来实现改进。
以上是LLVM的一些子项目。还有更多LLVM子项目和组件可以用于执行各种任务。通过LLVM可以编译Ruby、python、Hashell等语言,LLVM具有多功能性、灵活性和可重用性优势,且可以从对 Lua 等嵌入式语言进行轻量级 JIT 编译到为大型超级计算机编译 Fortran 代码。欢迎大家关注华纳云,阅读更多技术资讯!