swift编译成可执行文件过程

2021-12-31  本文已影响0人  余晖依旧耀眼

1、swift code编译过程

1.1、流程图

image.png

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
image.png

常见的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(当然你也可以通过终端编译),过程如下


image.png
image.png
image.png

生成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代码

image.png

生成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


image.png
上一篇 下一篇

猜你喜欢

热点阅读