swift - LLVM - 小记 1

998 阅读3分钟

swift - LLVM - 小记1

在 iOS 开发的道路上怎么也不可避免编译器的坎,本文章先带领读者大致了解 LLVM 编译的流程。至于 LLVM,Clang 的名词的解释文中已给大家一个非常全内容的链接,我就不去粘贴了。文中链接可能需要翻墙,我觉得这是一个程序员基本技能了。
LLVM这个话题已经不是什么新鲜的了,网上包括一些前辈们都有大量的篇幅去描述它,我为什么又在这里啰嗦呢!所谓:仁者见之便谓之仁,知者见之便谓之智,一般程序员日用而不知,故君子之道鲜矣! 1.什么是 LLVM?

    请移步: LLVM

2. LLVM的代码三种表示形式
1.内存编译器中的IR 2.存于磁盘的bitcode 3.可观察的汇编

这里不得不说IR,IR是基于 静态单赋值 (SSA)的有以下特点;

1.类型安全性 2.底层操作性 3.灵活性

3. LLVM的模块化   模块化的出现就是为了解决代码的高度耦合,想想如果有大量高度耦合的代码,编译器进行处理的时候那是一种 “剪不断理还乱”长时间占用资源,严重情况下卡死,都是程序的大忌。 LLVM按模块来有:
  • LLVM优化器
  • LLVM代码生成器
  • ….
                   4. LLVM的IR工作流程
  • 通过语言来描述:
          LLVM IR的编译过程首先是将语言源码分解成token流,所有的运算符,标识符等都用token流表示,接下来token流会传递给语法分析器,语法分析器会在语言的CFG处将token流转为抽象语法树(AST),再接下来进行语义分析,检查正确性,最后生成IR
  • 通过流程图来描述:
Created with Raphaël 2.1.2高级语言分解成tock流语法分析器通过CFG转换成AST(抽象语法树)进行语义分析,检查生成IR 理解成如.c的 文件进来后生产.ll文件 5. LLVM的bitcode工作流程 bitcode 是由LLVM IR转换而成的     LLVM bitcode 由两部分组成:
  •   位流 bitstream
  •   将LLVM IR编码成位流的编码格式
bitcode 是二进制文件 可以理解成.ll文件进来生产.bc文件 6. LLVM的bitcode 转换为 平台的汇编码 大致内容: LLVM的静态编译器llc把.bc文件编译为指定架构的汇编语言,对不同的CPU都有不同的操作方式,包括寄存器的类型。 这里得到汇编文件 上面只是泛泛介绍了一下,继续往下看^_^ IR
  • IR代码的优化
  • 转化为其他形式
  优化转化:       将局部变量从内存提升到寄存器 等系类的优化处理,这里优化与转化同时进行

 Clang

   这一系类的操作都离不开它,C语言前端 Clang.作为生成AST消耗掉的内存仅仅是GCC的20%左右的编译器,其性能何其赞 bitcode 在把LLVM IR转化为bitcode的过程中引入两个概念
  • 区块
  • 记录
区块:   表示位流的区域,常见的如: 函数体,符号表。且每个区块都有个属于自己的ID 记录:   记录由记录码,整数值构成。作用就是对 指令,全局变量,类型描述中的实体 其bitcode文件结构:             1.描述文件段落偏移量的简单描述头             2.内嵌BC文件的大小