1、swift code编译过程
1.1、流程图
1.2、转换成对应流程的代码指令
//main可以换成任何.swift文件,只是拿main当例子
// 分析输出AST
swiftc main.swift -dump-parse
// 分析并且检查类型输出AST
swiftc main.swift -dump-ast
// 生成中间体语言(SIL),未优化
swiftc main.swift -emit-silgen
// 生成中间体语言(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
1.3、swiftc指令
我们可以在终端上查看swiftc的各种指令
swiftc -h
常见的swiftc指令的用处
-dump-ast 语法和类型检查,打印AST语法树
-dump-parse 语法检查,打印AST语法树
-dump-pcm 转储有关预编译Clang模块的调试信息
-dump-scope-maps <expanded-or-list-of-line:column>
Parse and type-check input file(s) and dump the scope map(s)
-dump-type-info Output YAML dump of fixed-size types from all imported modules
-dump-type-refinement-contexts
Type-check input file(s) and dump type refinement contexts(s)
-emit-assembly Emit assembly file(s) (-S)
-emit-bc 输出一个LLVM的BC文件
-emit-executable 输出一个可执行文件
-emit-imported-modules 展示导入的模块列表
-emit-ir 展示IR中间代码
-emit-library 输出一个dylib动态库
-emit-object 输出一个.o机器文件
-emit-pcm Emit a precompiled Clang module from a module map
-emit-sibgen 输出一个.sib的原始SIL文件
-emit-sib 输出一个.sib的标准SIL文件
-emit-silgen 展示原始SIL文件
-emit-sil 展示标准的SIL文件
-index-file 为源文件生成索引数据
-parse 解析文件
-print-ast 解析文件并打印(漂亮/简洁的)语法树
-resolve-imports 解析import导入的文件
-typecheck 检查文件类型
2、代码实践
2.1、创建一个类
class YYPersonClass {
var age : Int = 18
var name : String = "zhangsan"
}
let p = YYPersonClass()
2.2、生成sil和ir
在xcode中配置脚本运行target(当然你也可以通过终端编译),过程如下
生成SIL的脚本代码
#swiftc -emit-sil ${SRCROOT}/xxx.swift > ./xxx.sil && open xxx.sil
#${SRCROOT}/xxx.swift > :需要编译成sil的.swift文件
#open xxx.sil :编译成功后 打开xxx.sil文件
swiftc -emit-sil ${SRCROOT}/StructAndClass/main.swift > ./main.sil && open main.sil
#如果是带UIKit的需要使用下面的脚本
#ios13.1 13.1是你的xcode版本
#swiftc -emit-sil -target x86_64-apple-ios13.1-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ${SRCROOT}/YYSwiftTest/ViewController.swift > ./ViewController.sil && open ViewController.sil
编译后的sil
代码
生成IR的脚本代码
#swiftc -emit-ir ${SRCROOT}/xxx.swift > ./xxx.sil && open xxx.sil
#${SRCROOT}/xxx.swift > :需要编译成sil的.swift文件
#open xxx.sil :编译成功后 打开xxx.sil文件
swiftc -emit-sil ${SRCROOT}/StructAndClass/main.swift > ./main.ll && open main.ll
#如果是带UIKit的需要使用下面的脚本
#ios13.1 13.1是你的xcode版本
#swiftc -emit-ir -target x86_64-apple-ios13.1-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ${SRCROOT}/YYSwiftTest/ViewController.swift > ./ViewController.ll && open ViewController.ll
编译后生成的.ll