swiftc - ShenYj/ShenYj.github.io GitHub Wiki
Swift准确说有两种形式, 一种是类似python的那种基于解释器的运行方式; 还有一种就是在不使用解释器的情况下, 直接编译成可执行文件。第一种依赖swift这个解释器, 第二种依赖swiftc这个编译器前端。
swift直接跳转到了解释器模式, 而swiftc则尝试寻找swift文件, 并编译文件。
两个文件所在的路径分别为: /usr/bin/swiftc, /usr/bin/swift
无法使用传统的clang去编译一个swift程序, 因为在xcode中编译swift代码的程序是swift这个“编译器”。之所以这样, 是因为swift在语言解释的时候和传统的clang有本质的区别, 感兴趣的可以查看Chris Lattner亲自解释了原因
1、解析器
解析器是一个简单的递归下降解析器(在lib/Parse中实现),带有集成的手工编码的lexer。解析器负责生成没有任何语义或类型信息的抽象语法树(AST),并针对输入源的语法问题发出警告或错误。
2、语义分析,生成AST
语义分析(在lib/Sema中实现)负责获取已解析的AST,并将其转换为格式良好、类型完全检查的AST形式,对源代码中的语义问题发出警告或错误。语义分析包括类型推断,如果成功,则指示从结果的经过类型检查的AST生成代码是安全的。
3、SIL生成与优化
SIL是一种高级的、特定于Swift的中间语言,适合进一步分析和优化Swift代码。SIL生成阶段(在lib/SILGen中实现)将类型检查的AST降低为所谓的“原始”SIL。SIL的设计在文档/SIL.rst中有描述。
SIL保证的转换(在lib/SILOptimizer/Mandatory中实现)执行影响程序正确性的额外数据流诊断(比如未初始化变量的使用)。这些转换的最终结果是“规范的”SIL。
SIL优化(在lib/Analysis、lib/ARC、lib/LoopTransforms和lib/Transforms中实现)对程序执行额外的高级、特定于速度的优化,包括(例如)自动引用计数优化、devirtualization和泛型专门化。
4、SIL降低为LLVM IR
LLVM IR生成:IR生成(在lib/IRGen中实现)将SIL降低为LLVM IR 代码,此时LLVM可以继续优化它并生成机器码。
5、生成汇编代码
6、生成可执行代码
对比Clang在编译OC源码过程发现,Swift在生成IR前会多一个Swift IL的中间环节
- 有关SIL的详细文档可以从苹果的Github文档中获取 Swift Intermediate Language (SIL)
- 对于Swiftc这个新的前端编译器的文档,可以阅读 Swift Compiler Performance
关于Swiftc的参数可以通过swiftc -h
/ swiftc --help
查看
-
编译生成SIL
swiftc -emit-sil Test.swift
(终端执行后输出SIL信息,并不会产生本地文件) -
还原字符串:
xcrun swift-demangle XXX
(SIL中很多类名、方法都会做了处理,通过此命令还原到真实的值)
e.g.xcrun swift-demangle s14ViewControllerAAC6buttonSo8UIButtonCvg $s14ViewControllerAAC6buttonSo8UIButtonCvg ---> ViewController.ViewController.button.getter : __C.UIButton
-
生成SIL文件的同时直接换源字符串
swiftc -emit-sil Test.swift | xcrun swift-demangle >> Test.sil
通常我们 iOS
的项目都会包含UIKit
等系统库,类似于clang
那样使用-isysroot
来指定SDK
路径
在swiftc
中我想同样可以,于是就查了参数列表,-Fsystem
的描述似乎很像
-Fsystem <value> Add directory to system framework search path
但结果让我失望
❯ swiftc -emit-sil -Fsystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk ViewController.swift
ViewController.swift:8:8: error: no such module 'UIKit'
import UIKit
最后通过-sdk
成功了
swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator15.2.sdk -target x86_64-apple-ios15.2-simulator -emit-sil ViewController.swift
更加易读的方式(加上xcrun swift-demangle
):
swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator15.2.sdk -target x86_64-apple-ios15.2-simulator -emit-sil ViewController.swift | xcrun swift-demangle >> vc.sil