iOS开发的语言不管是OC还是Swift后端都是通过LLVM进行编译的,如下图:
- OC通过clang编译器,编译成IR,然后再生成可执行文件.o(这里也就是我们的机器码)
-
Swift则是通过Swift编译器编译成IR,然后再生成可执行文件
//分析输出AST
swiftc main.swift -dump-parse
//分析并且检查类型输出AST
swiftc main.swift -dump-ast
//生成中间体语言(SIL),未优化
swiftc main.swift -emit-sligen
//生成中间体语言(SIL),优化后的
swiftc main.swift -emit-sil
//生成LLVM中间体语言(.ll文件)
swiftc main.swift -emit-ir
//生成LLVM中间体语言(.bc文件)
swiftc main.swift -emit-bc
//生成汇编
swiftc main.swift -emit-assembly
//编译生成可执行.out文件
swiftc -o main.o main.swift
SIL文件:
- @main:入口函数
- %0、%1、%2、%...寄存器(虚拟的)
Swift 对象内存分配:
-
__allocating_init
--->swift_allocObject
--->_swift_allocObject_
--->swift_slowAlloc
--->Malloc
- Swift对象的内存结构HeapObject,有两个属性:一个是Metadata,一个是RefCount,默认占用16字节大小。oc对象的内存结构objc_object,只有一个属性isa