Swift编译器与Objective-C编译器

4

我正在做一份关于Swift性能的研究,以下是我的问题:在编译Objective-C项目时,我们是否可以进行优化?如果Swift和Objective-C使用同一个编译器,为什么我们只谈论Swift编译器的优化?

2个回答

12

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


9

Swift 和 ObjC 有不同的流水线,但两者都由 LLVM 支持。

Objective-C 使用 Clang 编译器编译代码。因此,对于传统的 ObjC 代码,其流水线如下:

enter image description here

您可以看到,Clang 对您的代码进行的第一次转换是创建 AST(抽象语法树) - 表示所有函数、运算符、变量、声明等节点的巨大语义树。 LLVM IR 从 Clang 传递到 LLVM Core,在那里进行优化(如果适用)并转换为特定于目标的机器码。因此,我们有一堆对象文件(*.o),稍后将它们链接在一起并合并成可执行文件或动态库。这个最后阶段的输出通常被称为“a.out”、“dylib”或“so”文件。
正如您已经看到的那样,LLVM Core 是代码进行优化的地方,中间表示法是这些优化的源头。
Swift 使用 Swift-C 编译代码。在代码优化方面,一些功能正在改变,几乎每年都会出现新功能。(我在这里写的内容适用于 Swift 4.2 和 XCode 10)
让我们来看看 Swift 的编译流程:

enter image description here

您可以看到与ObjC的相似之处很多:不仅是相同的后端,而且前端本质上也工作类似。词法分析、标记化(将一些词汇项从原始字符串中分离出来)、构建AST、类型检查。主要区别在于存在SIL(Swift Intermediate Language)- AST和LLVM IR之间的另一种中间代码表示形式。
Swift开发团队以Clang为例制定了前端,并尝试使用Clang的所有优势并弥补一些缺陷。其中一个缺陷是无法实现一些高级分析、可靠的诊断和优化,对于这些问题,ATS和LLVM IR都不是合适的材料。因此,SIL是解决此问题的方案。
附加参考资料: 差异:

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

Clang:

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/

SIL:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接