LLVM
是一个提供模块化编译器和工具链软件和技术集合的项目。“LLVM”这个名字与其他IT和开源项目并没有什么不同。LLVM已经在伊利诺伊大学启动了一个研究项目,以创建一个编译器和工具链,支持不同编程语言的静态和动态编译。即使是不同的编程语言,如C、C++、爪哇、C++、Kotlin、Delphi、RISE、Ruby都支持LVVM编译器和工具链最流行的编程语言C和C++。
LLVM硬件和操作系统支持
作为一个开源项目,LLVM在不同的操作系统、平台和硬件中都受到支持。LLVM可以在Linux、Solaris、FreeBSD、NetBSD、MacOSX和Windows操作系统上运行。LVVM还支持不同的硬件和处理器体系结构,如x86、amd64、x86u64、PowerPC、V9和ARM。有关更具体的硬件和操作支持,请参阅下表。
![图片[1]-什么是LLVM?LLVM入门-yiteyi-C++库](https://www.yiteyi.com/wp-content/uploads/2020/07/poftut_image-13.png)
LLVM支持的编程语言
正如start中所述,LLVM支持多种编程语言来编译和绑定。即使有些编程语言不完全受LLVM支持,我们也会列出支持的编程语言、支持级别和支持的特性。
C
和 C++
是LLVM的顶级编程语言。甚至LLVM是作为动态编译器创建的,而工具链C和C++是支持的主要目标。此外,LVVM是用C++开发的。
Objective-C
是另一个完全支持的编程语言,类似于C和C++。
LLVM体系结构和组件
LLVM提供了一个完整的体系结构,其中有不同的组件和片段来完成这幅图。LLVM提供前端、过程和后端。下图说明了LLVM如何处理源代码并生成可执行文件和二进制文件。
![图片[2]-什么是LLVM?LLVM入门-yiteyi-C++库](https://www.yiteyi.com/wp-content/uploads/2020/07/poftut_image-14.png)
Front End
将源代码转换为 intermediate representation
或 IR
. 这是LLVM正常运行的其他步骤和编译器的准备过程。前端也不是LLVM的核心部分,通常使用辅助软件或类似Clang的工具。
Pass
或 IR
是LLVM的核心任务,编译过程在这里进行。IR或中间代码将通过多阶段反复优化。
Back End
最后一步是将优化的IR代码转换为特定于CPU体系结构或操作系统的机器代码。
下面我们将列出LLVM的一些重要工具和组件。
Clang
是专门为LLVM创建的编译器。Clang可以将IR代码编译成可执行文件和二进制文件。另外,Clang的速度几乎是GCC编译器的3倍。
LLDB
是为LLVM项目创建的调试器。LLDB比GDB更快、更高效,并且与LLVM核心和Clang紧密集成。
libc++
和 libc++ ABI
是C++标准库实现。
compiler-rt
是一个用于底层代码的动态测试实用程序。它可以用来运行和文本的底层代码在实时。
LLVM Core
是LLVM的核心组件,其中核心库为不同的CPU和硬件体系结构提供优化器和代码生成支持。
LLVM与GCC
Gnu Compiler Collection
或者GCC是另一个流行和广泛使用的开源编译器项目。在LLVM出现之前,GCC实际上是一个为不同的开源世界设计的编译器。随着LLVM的出现,情况开始发生变化,LLVM凭借其优势也变得流行起来。下面我们将从不同的角度比较LLVM和GCC。
- GCC支持比LLVM更传统的编程语言,如Ada、Fortran和Go。
- GCC比LLVM支持更多的硬件和CPU架构,比如RISC-V。
- GCC比LLVM支持更多的语言扩展和汇编语言特性。
- LLVM被新兴语言使用,比如Swift、Rust、Julia和Ruby,然后是GCC。
- LLVM比C语言更符合C语言和C++编程语言的要求。
- LLVM提供了比GCC更准确和友好的诊断信息。
安装LLVM
LLVM可以安装在Linux和Ubuntu操作系统上,如下所示。我们将提供包裹名称 llvm-10
和 llvm-10-tools
为了安装llvmversion10核心库和工具。
$ sudo apt install llvm-10 llvm-10-tools clang
![图片[3]-什么是LLVM?LLVM入门-yiteyi-C++库](https://www.yiteyi.com/wp-content/uploads/2020/07/poftut_image-17.png)
LLVM入门
我们已经安装了名为llvm-10、llvm-10-tools和clang的必需包。现在我们将用LLVM编译一个简单的helloworld示例作为入门示例。下面提供了helloworld应用程序源代码。
#include int main(){ printf("Hello World From Poftut.com via LLVM"); return 0;}
我们将编译并创建名为hellou world的可执行文件,命令如下。LLVM将由引擎盖下的叮当命令执行。
$ clang hello_world.c -o hello_world
新创建的hellou world可执行文件可以从控制台或bash命令行运行,如下所示。
$ ./hello_world