LLVM 编译器中的王者

LLVM 编译器中的王者

LLVM 简单介绍

  • 什么是LLVM
    • 官网: https://llvm.org/
    • The LLVM Project is a collection of modular and resuable compiler and toolchain technologies.
    • LLVM 项目是模块化, 可重用的编译器以及工具链技术的集合
    • 美国计算机协会(ACM)将其2012年软件系统奖项颁给了LLVM, 之前曾经获得此奖项的软件和技术包括: Java, Apache, UNIX, the World Wide Web, 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: 只需要3个编译器前端, 3个编译器后端
    • GCC: 则需要9个编译器 C-X86 C-POWER_PC C-ARM
    • Fortran-X86 Fortran-POWER_PC Fortran-ARM
    • Haskell-X86 Haskell-POWER_PC Haskell-ARM
  • LLVM 现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)

Clang

  • 什么是Clang?
    • LLVM 项目的一个子项目
    • 基于LLVM 架构的C/C++/Objective-C编译器前端
    • 官网: http://clang.llvm.org/
  • 相比GCC, Clang具有如下优点
    • 编译速度快: 在某些平台上, Clang的编译速度显著的快过GCC
    • 占用内存小: Clang生成的AST所占用的内存是GCC的五分之一左右
    • 模块化设计: Clang采用基于库的模块化设计, 易于IDE集成及其他用途的重用
    • 诊断信息可读性强: 在编译过程中, Clang 创建并保留了大量详细的元数据(metadata), 有利于调试
    • 设计清晰简单, 容易理解, 易于扩展增强

Clang 与 LLVM

  • 广义上的 LLVM
    • 整个 LLVM 架构
  • 狭义的 LLVM
    • LLVM 后端 (代码优化, 目标代码生成等)

OC源文件的编译过程

  • 命令行查看编译的过程: clang -ccc-print-phases main.m
  • 查看 preprocessor (预处理) 的结果: clang -E main.m

词法分析

  • 词法分析, 生成Token: clang -fmodules -E -Xclang -dump-tokens main.m

语法树-AST

  • 语法分析, 生成语法树 (AST, Abstract Syntax Tree) : clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

语法树-AST

LLVM IR

  • LLVM IR 有3中表示形式 (但本质是等价的, 就好比水可以有气体, 液体, 固体3种形态)
    • text: 便于阅读的文本格式, 类似与汇编语言, 拓展名**.ll**, clang -S -emit-llvm main.m
    • memory: 内存格式
    • bitcode: 二进制格式, 拓展名**.bc**, clang -c -emit-llvm main.m

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

应用与实践

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值