欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

LLVM架构详述

发布时间:2025/3/21 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 LLVM架构详述 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 什么是LLVM?
  • 传统编译器架构
  • LLVM架构
  • 什么是Clang?
    • 词法分析
    • 语法分析
    • LLVM IR
  • 源码下载

什么是LLVM?

LLVM项目时模块化,可重用的编译器以及工具链技术的集合

美国计算机协会(ACM)将其2012年软件系统奖项颁给了LLVM,之前曾经获得此奖的软件和技术包括Java,Apache,Mosaic,the World Wide Web,Smalltalk,UNIX,Eclipse等等

创始人:
Chris Lattner,亦是Swift之父

有些文章把LLVM当做Low Level virtual Machine(低级虚拟机)的缩写简称,官方描述如下:
The name “LLVM” itself is not an acronym;it is the full name of the project

“LLVM”这个名称本身不是首字母缩略词,它是项目的全名

传统编译器架构


Frontend:前端
词法分析,语法分析,语义分析,生成中间代码

Optimizer:优化器

Backend:后端
生成机器码

LLVM架构


不同的前端后端使用同一的中间代码LLVM Intermediate Representation(LLVM IR)

如果需要支持一种新的编程语言,那么只需要实现一个新的前端

如果需要支持一种新的硬件设备,那么只需要实现一个新的后端

优化阶段是一个通用的阶段,它针对的是统一的LLVM IR不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改

相比之下,GCC的前端和后端没分得太开,前端后端耦合在一起,所以GCC为了支持一门新语言,或者为了支持一个新的目标平台,就变得特别困难

LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构 (GCC家族,Java,.NET,python,Ruby,Scheme,Haskell,D等)

什么是Clang?

LLVM项目的一个子项目
基于LLVM架构的c/c++/Objective-C编译器前端
官网:http://clang.llvm.org/

相比于GCC,Clang具有如下优点

  • 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GCC快3倍)
  • 占用内存小:Clang生成的AST(语法书)所占用的内存时GCC五分之一
  • 模块化设计:Clang采用基于库的模块化设计,易于IDE集成及其他用途的重用
  • 诊断信息可读性强:在编译过程中,Clang创建并保留了大量详细的元数据(metadata),有利于调试和错误分析
  • 设计清晰简单,容易理解,易于扩展增强

  • 广义的LLVM
    整个LLVM架构

    狭义的LLVM
    LLVM后端(代码优化,目标代码生成等)

    词法分析

    词法分析,生成Token:

    $ clang -fmodules -E -Xclang -dump -tokens main.m

    举例

    void test(int a ,int b){ int c=a+b-3; }


    拆分成一个一个token,把每个东西一个一个地分割开,右边13:9代表第13行第九个字符

    语法分析

    语法分析:生成语法树(AST,Abstract SyntaxTree):

    $ clang -fmodules -fsyntax -only -Xclang -ast-dump main.m

    举例

    void test(int a ,int b){ int c=a+b-3; }


    LLVM IR

    LLVM IR 有3种形式(但本质是等价的,就好比水可以有气体,液体,固体3种形态)
    1.text:便于阅读的文本格式,类似于汇编语言,拓展名.II

    $ clang -S -emit -llvm main.m

    举例:

    void test(int a ,int b){ int c=a+b-3; }

    2.memory:内存格式
    3.bitcode:二进制格式,拓展名.bc

    $ clang -c -emit -llvm main.m

    IR基本语法:
    注释以分号;开头
    全局标识符以@开头,局部标识符以%开头
    alloca:在当前函数中栈帧中分配内存
    i32:32bit,4个字节的意思
    align:内存对齐
    store:写入数据
    load:读取数据

    官方语法参考:https://llvm.org/docs/LangRef.html

    源码下载

    下载LLVM

    $ git clone https://git.llvm.org/git/llvm.git/

    大小648.2M,仅供参考

    下载clang

    $ cd llvm/tools $ git clone https://git.llvm.org/git/clang.git/

    大小240.6M,仅供参考

    源码编译
    安装cmake和ninja(先安装brew,https://brew.sh/)

    $ brew install cmake $ brew install ninja

    ninja如果安装失败,可以直接从github获取release版放入[/user/local/bin]中
    https://github.com/ninja-build/ninja/releases

    在LLVM源码同级目录下新建一个[llvm_build]目录(最终会在[llvm_build]目录下生成[build.ninja])

    $ cd llvm_build $ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安装路径

    举例:

    更多cmake相关选项,可以参考:https://llvm.org/docs/CMake.html

    依次执行编译,安装指令

    $ ninja

    编译完毕后,llvm_build 目录大概21.05G

    $ ninja install

    安装完毕后,安装目录大概11.92G

    应用与实践:
    官方参考:https://clang.llvm.org/docs/Tooling.html
    应用:语法树分析,语言转换

    Clang插件开发
    官方参考
    https://clang.llvm.org/docs/ClangPlugins.html
    https://clang.llvm.org/docs/ExternalClangExamples.html
    https://clang.llvm.org/docs/RVAFrontendAction.html

    应用:代码检查(命名规范,代码规范)等

    Pass开发(进行中间代码优化)
    官方参考:https://llvm.org/docs/WritingAnLLVMPass.html
    应用:代码优化,代码混淆等

    开发新的编程语言
    https://llvm-tutorial-cn.readthedocs.io/en/latest/index.html
    https://kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/latest/

    总结

    以上是生活随笔为你收集整理的LLVM架构详述的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。