swift编译器与目标c编译器

Pro*_*714 1 objective-c compiler-optimization swift

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

Ash*_*hra 9

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

\n\n

Objective-C 使用 Clang 编译器来编译代码。因此,对于好的旧 ObjC 代码,管道如下所示:

\n\n

在此输入图像描述

\n\n

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

\n\n

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

\n\n

Swift 使用 Swift-C 来编译代码。在代码优化方面,一些功能正在改变,几乎每年都会出现新功能。(我在这里写的\xe2\x80\x99m 适用于 Swift 4.2 和 XCode 10)

\n\n

让\xe2\x80\x99s 看一下 Swift 的编译管道:

\n\n

在此输入图像描述

\n\n

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

\n\n

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

\n\n

其他参考:\n区别:

\n\n

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

\n\n

铛:

\n\n

https://clang.llvm.org/docs/CommandGuide/clang.html#description \n https://clang.llvm.org/docs/CommandGuide/clang.html#code- Generation-options

\n\n

LLVM:

\n\n

视频:LLVM 简介\n视频:D. Dunbar \xe2\x80\x9cA 用于构建软件的新架构\xe2\x80\x9d

\n\n

LLVM优化:

\n\n

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

\n\n

斯威夫特编译器:

\n\n

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

\n\n

快速优化:

\n\n

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

\n\n

安全等级:

\n\n

文档\n视频:Joseph Groff 和 Chris Lattner Swift\xe2\x80\x99s 高级 IR

\n


Lan*_*nce 5

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