Swift编译成本地代码吗?

64

这是一个简单的问题,然而在当前开发文档中并没有直接的回答。

Swift是否编译为机器语言(例如汇编),或者编译成某种中间形式,然后在虚拟机上运行?

(我认为它会编译成某种中间形式,但对于不熟悉苹果开发世界的人来说,这可能并不明显。)


4
在Linux中,你可以使用swiftc进行本地编译。 - masoud
Swift 文档中的 Swift 编译器:https://swift.org/swift-compiler/ - mercury
4个回答

45

是的,通过LLVM位代码编译成机器语言,并像@connor所说的那样,在Objective-C运行时之上运行。


4
好的,它是在运行时还是预编译时通过llvm编译成机器语言呢? - markmnl
17
LLVM bit-code是LLVM编译器集合使用的中间格式,它允许它们都使用一个公共代码生成器。翻译过程为:Swift -> Bit-code -> 汇编程序 -> 机器语言。 - David Berry
6
《Ars Technica》关于Yosemite的文章描述了编译过程。它提到将代码转换为Swift中间语言(SIL)作为第一步。正如其他人所说,最终通过LLVM生成机器码。 - miner49r
7
Swift不能运行在Objective-C的运行时上,它有自己的运行时。当使用继承自Objective-C的类时,我可以使用Objective-C的运行时,但是Swift不是在Objective-C上方运行的。这与虚拟机不同;Swift编译为本地代码。 - rsmoz
13
Swift可以在没有Objective-C运行时的设备上运行,这证明Swift并不是在Objective-C之上运行。在Linux上安装Swift时也是如此。即使在具有Objective-C的计算机上,除非您正在使用用Objective-C编写的类,否则Swift根本不使用Objective-C。 - rsmoz
显示剩余5条评论

28
Swift不仅编译成本机代码,而且它也被专门设计用于此。与Java等专门作为JIT编译语言的语言不同,Swift通过预先编译实现最佳性能,而Java则从JIT编译中获得最大好处。
这些设计选择有很多原因,但其中一个是Swift的范围比像Java这样的托管语言要大得多。它应该在桌面计算机和硬件更受限制的手机上工作。您可以将Swift用作系统编程语言,与C#,Java或Python不同,因为它几乎没有运行时要求,并允许对内存进行相当详细的控制。因此,理论上应该能够使用Swift构建OS内核,而使用Java则会很困难。

4
Java最初是针对嵌入式系统而不是桌面系统设计的。JVM和JRE已分离,这意味着传统在桌面上使用Java时不需要使用20-200MB运行时。Java虚拟机(VM)长期以来一直在微控制器(uJ、Javelin)中运行,价格在低于5美元的性能范围内。此外,还有一个名为jNode的Java操作系统内核。然而,像Swift这样的预编译程序可能比*VM平台在手机等电池关键设备上更节能。当处理器如Jazelle直接执行Java字节码时,情况会变得更加复杂。 - user515655
1
我知道这一点,我的回复可能会增加一些细微差别。当然,有许多类似虚拟机的语言在嵌入式硬件上运行的丰富历史。例如,Erlang被用于电信设备。但是我认为这取决于应用程序。通常这些用途不需要CPU密集型,并且并非所有情况都适用。例如,当从AVR微控制器控制步进电机时,您需要完全控制时间。您不希望某个垃圾收集器突然跳入。我们已经在Android游戏中看到了这个问题。 - Erik Engheim

13

2
当你说“编译”时,是指编译时还是运行时? - markmnl
1
在编译时,Swift 代码会被编译成 LLVM 位码,就像 @David 所说的那样。 - Rod
3
是的,我看到了那个引语,但它只是听起来像是异想天开的营销,并没有提供任何实际的技术细节 - 但是你现在已经回答了我的问题,谢谢。 - markmnl

10

Swift和Objective-C一样,编译成可在Objective-C运行时上运行的机器代码。


12
我不熟悉Objective-C,但你说“_runtime_”,听起来像是一个解释中间字节码的虚拟机,也就是说Swift不能编译成本地代码? - markmnl
11
这是一个图书馆,不是虚拟机。基本上,您的代码会调用 obj-c 运行时来执行面向对象的操作。所有代码,包括 obj-c 运行时,都被编译为机器码。 - Connor
1
这里还有一些更多的信息:http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html - Connor
9
Swift 绝对不是“在 Objective-C 运行时上运行”。它使用 Objective-C 运行时来处理类和协议(那些被明确标记为 @objc 的),但是它拥有自己的运行时来完成其他几乎所有的功能。 - Vatsal Manot
2
@Connor,根据您的答案和评论,难道不应该说***"[...]与Objective-C运行时库并行运行"吗?这比"在Objective-C运行时上"***更清晰,后者似乎由某个类似于VM的程序进行管理。 - Jeach

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