swift - LLVM - 小记1
在 iOS 开发的道路上怎么也不可避免编译器的坎,本文章先带领读者大致了解 LLVM 编译的流程。至于 LLVM,Clang 的名词的解释文中已给大家一个非常全内容的链接,我就不去粘贴了。文中链接可能需要翻墙,我觉得这是一个程序员基本技能了。
LLVM这个话题已经不是什么新鲜的了,网上包括一些前辈们都有大量的篇幅去描述它,我为什么又在这里啰嗦呢!所谓:仁者见之便谓之仁,知者见之便谓之智,一般程序员日用而不知,故君子之道鲜矣! 1.什么是
LLVM?
请移步: LLVM
2.
LLVM的代码三种表示形式
| 1.内存编译器中的IR |
2.存于磁盘的bitcode |
3.可观察的汇编 |
|
|
|
这里不得不说IR,IR是基于 静态单赋值 (SSA)的有以下特点;
3.
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
优化转化: 将局部变量从内存提升到寄存器 等系类的优化处理,这里优化与转化同时进行
Clang
这一系类的操作都离不开它,C语言前端 Clang.作为生成AST消耗掉的内存仅仅是GCC的20%左右的编译器,其性能何其赞 bitcode 在把LLVM IR转化为bitcode的过程中引入两个概念
区块: 表示位流的区域,常见的如: 函数体,符号表。且每个区块都有个属于自己的ID 记录: 记录由记录码,整数值构成。作用就是对 指令,全局变量,类型描述中的实体 其bitcode文件结构: 1.描述文件段落偏移量的简单描述头 2.内嵌BC文件的大小