swiftc - ShenYj/ShenYj.github.io GitHub Wiki

swiftc

Swiftc简介

Swift准确说有两种形式, 一种是类似python的那种基于解释器的运行方式; 还有一种就是在不使用解释器的情况下, 直接编译成可执行文件。第一种依赖swift这个解释器, 第二种依赖swiftc这个编译器前端。

swift直接跳转到了解释器模式, 而swiftc则尝试寻找swift文件, 并编译文件。

两个文件所在的路径分别为: /usr/bin/swiftc, /usr/bin/swift

无法使用传统的clang去编译一个swift程序, 因为在xcode中编译swift代码的程序是swift这个“编译器”。之所以这样, 是因为swift在语言解释的时候和传统的clang有本质的区别, 感兴趣的可以查看Chris Lattner亲自解释了原因

Swiftc编译过程

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、生成可执行代码

Swiftc与Clang对比

SIL

对比Clang在编译OC源码过程发现,Swift在生成IR前会多一个Swift IL的中间环节

关于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

外链

⚠️ **GitHub.com Fallback** ⚠️