⭐ 了解一下LLVM
以前一直好奇GCC和Clang到底什么区别,直到了解了LLVM才知道,Clang是基于LLVM架构的
LLVM
LLVM又是什么?它的全称是 Low-Level-Virtual-Machine 虽然叫虚拟机,但其实现在和虚拟机没有一点关系了
而它是作为编译的基础设施,服务于编译器的
中间商架构
熟悉Java的可能知道,Java为啥能够跨平台,就是因为其实所有的Java代码不是直接编译成目标平台的可执行的机器指令,而是先转化成Java字节码,这个Java字节码是独立于各个平台的
如果你是x86,就下载对于x86的java版本,那么这时候javac就是知道要将这个Java字节码编译成x86平台的机器指令,其他也一样
那么LLVM不是针对语言层面的,它是针对编译层面的。编译要做的事情是语法分析,语义分析,代码优化,生成机器码之类的。
但同样他也有自己的一套中间层描述代码 LLVM IR , 相当于屏蔽了上面各个语言的不同。然后只要实现从你这个语言到 LLVM IR的生成,后面我就能统一做事了
而这种架构模式其实有点类似于C/S模式,或者是前后端模式, 是一种模块化的设计
Clang其实就是属于LLVM架构中的前端,他负责词法分析,语法分析,语义分析,生成中间代码,然后把生成的中间代码 LLVM IR 交给LLVM 后端 继续处理
新人加入模式
那比如说你在创造一门新的编程语言,那么在编译这部分,你不需要自己写,你只需要完成如何从你的语言生成LLVM IR就行了,就比如rustc
如果LLVM需要支持一种新的硬件设备,那么就实现一个新的后端就行了
而GCC的前后端没有分得太开,耦合在了一起,这样导致它为了支持一门新的语言或者新的平台就需要重写,无法复用
那是不是 所有LLVM支持的语言都是跨平台的了?
以下来自chatgpt
LLVM是一个开源的编译器基础设施,它提供了跨平台的编译器工具链,包括前端、优化器和后端。LLVM支持许多编程语言,如C、C++、Rust、Swift、Objective-C等。虽然LLVM本身是跨平台的,但是支持的语言是否跨平台取决于这些语言的特性和实现。
大多数由LLVM支持的编程语言都可以实现跨平台的编译,因为LLVM提供了跨平台的编译器工具链。例如,C、C++、Rust等语言的LLVM前端可以将源代码编译成中间表示(LLVM IR),然后通过LLVM后端将其编译成目标平台的机器码。这使得这些语言的代码能够在不同的操作系统和架构上运行。
但是,是否能够真正实现跨平台开发还取决于具体的语言实现和标准库的支持。某些语言的特性、库和依赖可能会限制其在特定平台上的可移植性。因此,在编写跨平台应用程序时,需要考虑到目标平台的特性和限制,并确保所选择的编程语言和库能够在目标平台上正确地运行和工作。