Swift 编译器 vs Objective-C 编译器

Swift compiler vs Objective-C compiler

我正在准备一项关于 Swift 性能的研究,所以这些是我的问题:我们可以在编译 Objective-C 项目时进行优化吗?如果 Swift 和 Objective-C 有相同的编译器,为什么我们只讨论 Swift 编译器的优化?

Objective C 编译器是 Clang。 Swift 使用 "Swift compiler"。虽然它们都利用 LLVM 来生成最终的机器代码,但它们实际上是完全独立的编译器。

Swift 和 ObjC 有不同的管道,但它们都由 LLVM 支持。

Objective-C 使用 Clang 编译器编译代码。所以对于好的旧 ObjC 代码,管道看起来像这样:

您可以看到,Clang 对您的代码进行的第一个转换是创建 AST'(抽象语法树)——所有函数、运算符、变量、声明......都是巨大语义树的节点的表示. LLVM IR 正在从 Clang 传递到 LLVM Core,其中代码被优化(如果适用)并转换为特定于目标的机器代码。结果,我们有一堆目标文件 (*.o),它们稍后链接在一起并合并到可执行文件或动态库中。最后一个阶段的输出通常称为“a.out”、“.dylib”或“.so”文件。

正如您已经看到的那样,LLVM Core 是优化代码的地方,而中间表示正是这些优化的来源。

Swift 使用 Swift-C 编译代码。在代码优化方面,一些特性正在发生变化,几乎每年都有新特性出现。 (我在这里写的内容适用于 Swift 4.2 和 XCode 10)

我们来看看Swift的编译管道:

您可以看到与 ObjC 的许多相似之处:不仅后端相同,前端的工作原理也相似。词法分析、标记化(从原始字符串中分离出一些词法项)、构建 AST、类型检查。主要区别在于存在 SIL(Swift 中间语言)——AST 和 LLVM IR 之间的另一种中间代码表示。

Swift开发团队以Clang为例做一个前端,试图利用Clang的所有优点并弥补一些缺陷。其中一个缺陷是无法实现一些高级分析、可靠的诊断和优化,ATS 和 LLVM IR 都不是合适的 material。所以 SIL 是这个问题的解决方案。

其他参考资料: 差异:

https://dmtopolog.com/code-optimization-for-swift-and-objective-c/

叮当声:

https://clang.llvm.org/docs/CommandGuide/clang.html#description https://clang.llvm.org/docs/CommandGuide/clang.html#code-generation-options

LLVM:

视频:LLVM 简介 视频:D. Dunbar“构建软件的新架构”

LLVM 优化:

https://developer.apple.com/library/archive/documentation/General/Conceptual/MOSXAppProgrammingGuide/Performance/Performance.html(编译器级优化部分) https://pewpewthespells.com/blog/buildsettings.html#gcc_optimization_level(XCode 构建设置参考)

Swift编译器:

https://modocache.io/reading-and-understanding-the-swift-driver-source-code

Swift 优化:

https://swift.org/blog/osize/ https://swift.org/blog/whole-module-optimizations/

西尔:

文档 视频:Joseph Groff 和 Chris Lattner Swift 的高级 IR