我正在准备一项关于Swift性能的研究,以下是我的问题:我们能在编译Objective项目的同时进行优化吗?如果Swift和Objective有相同的编译器,为什么我们只讨论Swift编译器的优化?
发布于 2015-07-07 18:16:22
目标C编译器是Clang。Swift使用"Swift编译器“。虽然它们都利用LLVM来生成最终的机器代码,但实际上它们是完全独立的编译器。
发布于 2020-02-07 15:14:39
Swift和ObjC有不同的管道,但它们都得到了LLVM的支持。
Objective使用Clang编译器编译代码。因此,对于好的旧ObjC代码,管道如下所示:

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

您可以看到与ObjC的相似之处:不仅相同的后端,而且前端的工作方式也是相似的。词法分析、标记化(从原始字符串中分离一些词法项)、构建AST、类型检查。主要区别在于SIL (Swift中间语言)的存在-- AST和LLVM IR之间的另一种中间代码表示形式。
Swift开发团队以Clang为例,尝试利用Clang的所有优势并弥补一些缺陷。其中一个缺陷是无法实现一些高层次的分析、可靠的诊断和优化,对于这些分析和优化,ATS和LLVM IR都不是合适的材料。所以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 (编译器级优化部分) level (XCode构建设置参考)
快速编译器:
https://modocache.io/reading-and-understanding-the-swift-driver-source-code
迅速优化:
https://swift.org/blog/osize/ https://swift.org/blog/whole-module-optimizations/
SIL:
文档录像: Joseph Groff & Chris Lattner Swift的高级别IR
https://stackoverflow.com/questions/31275721
复制相似问题