本日我们来对iOS开发的常用工具Xcode的编译流程举行一个简朴的相识和分析 OC:source code > Clang -> LLVM -> Backend -> Executable
Clang做的变乱是词法分析-> token流->语法分析-> AST -> LLVM IR
AST(Abstract Syntax Tree 抽象语法树)
IR(intermediate representation 中央代码) swift:source code > swiftc -> LLVM -> Backend -> Executable
swiftc:swift AST -> Raw Swift IL -> Canonical Swift IL -> LLVM IR
Raw Swift IL : Swift特有的中央代码
Canonical Swift IL:将Raw Swift IL举行降级简化成更加简便的中央代码版本
swift的编译器前端是swiftc,于Clang相比,LLVM的前端编译过程中,AST和IR之间,多了一层SIL(Swift Intermediate Language),这么做的目的是渴望增补clang编译器的一些缺陷,好比无法实验一些高级分析,可靠的诊断和优化,而 AST 和LLVM IR 都不是合适的选择。因此,SIL应运而生,用来办理现有的缺陷
AST(Abstract Syntax Tree 抽象语法树)
天生AST的方式和Clang类似,这里偏重先容下swiftc编译器的SIL(Swift Intermediate Language )
1.天生的main.swift文件中编写如下代码
import Foundationclass Teacher { var age: Int = 18 var name: String = "Tom"}var person = Teacher()person.age = 6通过终端进入main.swift地点的文件夹,输入如下指令:
swiftc -emit-sil main.swift //天生了main.sil文件// 打开`main.sil` 文件,起首看到了Teacher的声明class Teacher { @_hasStorage @_hasInitialValue var age: Int { get set } @_hasStorage @_hasInitialValue var name: String { get set } @objc deinit init()}@_hasStorage @_hasInitialValue var person: Teacher { get set }// personsil_global hidden @main.person : main.Teacher : $Teacher