其他分享
首页 > 其他分享> > Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”

Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”

作者:互联网

swift编译过程

如果不懂LLVM,Clang的同学可以去了解下它的知识点  一些文章中有详细介绍 OC 的编译过程 ,本文来探索一下 Swift 的编译过程。Swift 的编译过程中使用 Swiftc ,与 Clang 一样,Swiftc 是LLVM编译架构的一个前端。

swiftc常用命令:

-dump-ast              解析和类型检查源文件 & 转换成 AST
-dump-parse            解析源文件 & 转换成 AST  
  -emit-assembly         生成汇编文件
  -emit-bc               生成 LLVM Bitcode 文件
  -emit-executable       生成已链接的可执行文件
  -emit-imported-modules 生成已导入的库
  -emit-ir               生成 LLVM IR 文件
  -emit-library          生成已连接的库
  -emit-object           生成目标文件
  -emit-silgen           生成 raw SIL 文件(第一个阶段)
  -emit-sil              生成 canonical SIL 文件(第2个阶段)
  -index-file            为源文件生成索引数据
  -print-ast             解析和类型检查源文件 & 转换成更简约的格式更好的 AST
  -typecheck             解析和类型检查源文件

swift 的编译流程:

image.png

与 Clang 相比, LLVM前端的流程中,在AST 和 IR之间,多了一层中间语言SIL (Swift Intermediate Language ) , 这么做的目的是希望弥补一些 Clang 编译器的缺陷,如无法执行一些高级分析,可靠的诊断和优化,而 AST 和LLVM IR 都不是合适的选择。因此,SIL应运而生,用来解决现有的缺陷。

SIL代码

SIL 官方文档传送门

由于 SIL 是 Swift 在编译过程中的中间产物, 通过 SIL 可以了解swift 底层的实现细节,帮助我们理解一些问题)

源码生成 SIL 的命令如下:

// 将m ain.swift 编译成 SIL 代码
swiftc -emit-sil main.swift 

// 将 main.swift 编译成 SIL,并保存到 main.sil 文件中
swiftc -emit-sil main.swift >> main.sil

// 将 main.swift 编译成 SIL的同时, 将命名重整后的符号恢复原样,并保存到 main.sil 文件中
swiftc -emit-sil main.swift | xcrun swift-demangle >> main.sil


SIL 语法和 IR 语法有点相似,常见语法含义:

常见ARM64汇编指令

bl : 地址跳转

blr : 带返回的地址跳转, 跳转回指令后面跟随寄存器中保存的地址

mov: 把一个寄存器里的值,复制到另一个寄存器

标签:进阶,i32,IR,struct,swift,main,Swift,emit,SIL
来源: https://www.cnblogs.com/mysweetAngleBaby/p/15684380.html