LLVM/Clang

LLVM与Clang详解

   LLVM本身并不是编译器,是开源的编译器(compiler)架构,是一套用于开发编译器、解释器等程序语言相关工具的库,主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。

   Clang是一个基于LLVM开发的C/C++/Obj-C编译器,有一套独立的前端,后端直接采用LLVM。还有一个较为早期的相关项目LLVM-GCC,是一个将GCC的前端嫁接到LLVM之上拼接而成的一个完整的编译器。

         什么是GCC的前端呢,这要从经典编译器说起。


经典编译器

1、经典编译器介绍

         一个传统静态编译器(像大多数C编译器)最流行的设计是3阶段的设计,其中主要组件是前端,优化器及后端(下图)。

                                                      

        前端解析源代码,检查错误,并构建一个特定于语言的抽象语法树(AST)来代表输入的代码。可选地AST被转换到一个新的用于优化的表示,优化器及后端可以运行这个代码。

        优化器负责进行各种转换尝试改进代码的运行时间,比如重复计算消除,通常或多或少与语言及目标无关。

        然后后端(也被称为代码产生器)把代码映射入目标指令集。除了制作正确的代码,它负责产生利用所支持架构不寻常功能的好代码。一个编译器后端的通用部分包括指令选择,寄存器分配,及指令调度。

        这个模型同样适用于解释器及JIT编译器。Java性能机(JVM)也是这个模型的一个实现,它使用Java字节码作为前端及优化器间的接口。


2、当一个编译器决定支持多个源语言或目标架构时,这种经典设计最重要的收益出现了。如果编译器在其优化器中使用一个通用的代码表示,那么可以任何可以编译到这个表示的语言编写一个前端,且可以为任何可以从这个表示编译得到的目标编写一个后端,如图所示。

                                                


LLVM

          LLVM是开源的编译器(compiler)架构,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。

          LLVM的设计就采用了上述三个阶段的设计。如下图所示。

                                               

         这样做的优点是如果需要支持一种新的编程语言,那么我们只需要实现一种新的前端。如果我们需要支持一种新的硬件设备,那我们只需要实现一个新的后端。而优化阶段因为是针对了统一的LLVM IR,所以它是一个通用的阶段,不论是支持新的编程语言,还是支持新的硬件设备,这里都不需要对优化阶段做修改。

   LLVM IR主要有三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾),最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是完全相等的。
   LLVM IR是LLVM优化和进行代码生成的关键。根据可读的IR,我们可以知道最终生成目标代码之前,我们已经生成了什么样的代码。而且根据IR,我们可以选择使用不同的后端而生成不同的可执行代码。同时,因为使用了统一的IR,所以我们可以重用LLVM的优化功能,即使我们使用的是自己设计的编程语言。
  例如,llvm-gcc前端采用gcc。llvm-gcc 是 GNU Compiler Collection (gcc) 的修改版本,可以在使用 -S -emit-llvm 选项运行时会生成 LLVM 字节代码。


Clang ( 发音为 /klæŋ/) 

        Clang是一个C++编写、基于LLVM,C、C++、Objective-C、Objective-C++语言的轻量级编译器。源代码发布于BSD协议下。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过__attribute__((overloadable))来修饰函数),其目标(之一)就是超越GCC

       Clang 是一个编译器前端,这也就是说:Clang 将目标程序进行分析,然后生成结构化的,树状的语法表示 , 即抽象语法树 AST(Abstract Syntax Tree)。

1、Clang 的开发背景

        由于 GNU 编译器套装 (GCC) 系统庞大,而且 Apple 大量使用的 Objective-C 在 GCC 中优先级较低,同时 GCC 作为一个纯粹的编译系统,与 IDE 配合并不优秀,Apple 决定从零开始写 C family 的前端,也就是基于 LLVM 的 Clang 了。Clang 由 Apple 公司开发,源代码授权使用 BSD 的开源授权。

2、基于 Clang 的编程

        与许多编译器前端相比,Clang 的最大特点就是良好的结构化设计,每部分都是一个单独的库 (library)。也就是说您可以单独的使用其中的一部分,来编写自己的程序。




### Windows 上安装 LLVM/Clang 的方法 在 Windows 系统上安装 LLVMClang 编译器可以通过多种方式实现,以下是几种常见的方法: #### 方法一:通过预构建二进制包安装 可以从官方 LLVM 项目网站下载适用于 Windows 的预构建二进制包。这些二进制包已经包含了编译好的工具链。 1. 访问 LLVM 官方发布页面: https://releases.llvm.org/download.html 2. 下载适合 Windows 平台的最新版本 ZIP 文件或 MSI 安装程序。 3. 解压 ZIP 文件或将 MSI 安装到目标目录。 4. 将解压后的 `bin` 目录路径添加到系统的环境变量 PATH 中[^5]。 #### 方法二:使用 Chocolatey 包管理器 Chocolatey 是一个流行的 Windows 包管理器,可以轻松安装和更新软件。 1. 如果尚未安装 Chocolatey,请按照其官网指南完成安装: https://chocolatey.org/install 2. 打开命令提示符并运行以下命令来安装 LLVM 工具链: ```powershell choco install llvm ``` 3. 完成后,可以直接在命令行中调用 clang 或其他相关工具[^6]。 #### 方法三:通过 Visual Studio 自带组件安装 Microsoft 提供了对 LLVM/Clang 的集成支持,可以在 Visual Studio Installer 中启用此功能。 1. 启动 **Visual Studio Installer**。 2. 修改已有的 Visual Studio 版本或创建新安装配置。 3. 在工作负载选项卡下找到 “使用 C++ 的桌面开发”,点击右侧的细节按钮。 4. 勾选名为 **MSVC v142 - VS 2019 C++ x64/x86 build tools (v14.2x)** 及附加项中的 **CMake Tools for Windows** 和 **LLVM Compiler Toolset**。 5. 应用更改并等待安装完成后即可使用 Clang[^7]。 #### 方法四:从源代码编译(高级) 如果需要自定义配置或者最新的特性,则可以选择从源码自行编译。这通常用于开发者希望深入研究或修改底层行为的情况。 参考站内引用提供了基于 Unix-like 环境下的编译流程[^1],对于 Windows 用户来说,推荐借助 MinGW-w64 或 Cygwin 来模拟类 Linux 运行时环境;另外也可以考虑 WSL(Windows Subsystem for Linux),它允许直接运行原生 Ubuntu 发行版从而简化跨平台操作过程[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值