Swift的中间文件:Swift Intermediate Language(简称SIL)


文章目录

  • Swift的中间文件:Swift Intermediate Language(简称SIL)
  • 前言
  • `swiftc`命令
  • 名字重整(Name Mangling)
  • 脚本自动生成SIL文件并打开
  • 其他


前言

Swift语言和OC一样,也是构建在LLVM架构上的,标准的三段式设计

SWIFT清算报文格式_LLVM

一般都知道 在ObjC中,我们可以通过Clang命令,生成C++文件来看底层原理, 那么 Swift 呢? 是否也有相关的命令呢, 答案是肯定的

在 Swift 中, 我们可以通过swiftc命令生成Swift Intermediate Language来看底层原理

swiftc命令

swiftc是swift语言的编译工具,他可以把swift文件生成中间表示,也可以生成可执行文件,下面简单写下常用的命令:

以 main.swift 文件为例

  • 生成可执行文件:swiftc -o main.out main.swift
  • 生成抽象语法树的命令(AST):swiftc main.swift -dump-ast
  • 生成中间语言(SIL):swiftc main.swift -emit-sil
  • LLVM中间表示层(LLVM IR):swiftc main.swift -emit -ir
  • 生成汇编语言:swiftc main.swift -emit-assembly

其余的命令你可以通过swiftc -h获得帮助

首先 我们新建一个文件并添加一段简单的代码到main.swift

import Foundation

class Teacher {
    var age: Int = 18
    var name: String = "Tom"
}

var person = Teacher()
person.age = 6

然后去终端进入main.swift所在的文件夹,输入如下指令:

swiftc -emit-sil main.swift

便可以在终端中看见Swift Intermediate Language

SWIFT清算报文格式_自动生成_02

名字重整(Name Mangling)

我们可以从SIL中看到一些奇怪无规律的名字,例如:s4main6personAA7TeacherCvp。这其实是swift采用了名字重整技术,swift中的类名、方法名等会被重整,这样可以实现方法的重载,更好的实现多态设计。

其实这些名字并不是没有规律的,但我并不是很感兴趣,感兴趣的小伙伴可以参看这篇文章

我们通过命令xcrun swift-demangle还原成原来的名字

xcrun swift-demangle s4main6personAA7TeacherCvp

这样,我们可以通过管道符将整个SIL中的名字还原回来

swiftc -emit-sil main.swift | xcrun swift-demangle

SWIFT清算报文格式_swift_03

脚本自动生成SIL文件并打开

由于会频繁的修改代码并查看SIL文件,每次敲一遍命令会很烦, 所以写一个简单的脚本插入到Xcode。

先在刚项目中新建一个Target,如下图:

SWIFT清算报文格式_SWIFT清算报文格式_04

SWIFT清算报文格式_SWIFT清算报文格式_05

在命令行内复制如下命令,需要注意的是,脚本的当前目录是xcodeproj同级目录,所以下面命令中的SwiftSIL改成你的项目名称,这样才可以找到文件

swiftc -emit-sil SwiftSIL/main.swift | xcrun swift-demangle > ./main.sil && open main.sil

切换target运行,就能直接调出你的编译器看你生成的SIL文件了

其他

在SIL文件中,你会看到很多不懂的关键词, 这里是官方文档可以查看

Swift Intermediate Language (SIL)

如果你在iOS里生成SIL文件,难免会碰到UIKit之类的sdk,那么命令需要带参数了,模拟版本改成你当前的版本:

swiftc -emit-sil -target x86_64-apple-ios14.2-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ViewController.swift > ViewController.sil

这样就能对 swift 类文件进行分析了.