swift 是先翻译成 Objctive-C 代码再 c 再汇编在 01?

2015-10-14 00:41:23 +08:00
 Ixizi
看到篇文章如下

CocoaChina 上的 xu54 认为 Swift 本质其实就是 Objective-C 的文本变种,对于这门全新的语言,苹果做的工作其实远没有我们想像的艰巨。 LLVM 编译器做工作只是先把 Swift 翻译成 Objective-C 代码,然后再把 Objective-C 代码翻译成 C 语言代码,然后再把 C 语言代码翻译成汇编,最终翻译成机器码。至于为什么编译器厂商这么绕,不直接把自己的语言翻译成汇编和机器码,那是由于现有的语言编译器( Objective-C 、 C )已经非常成熟,而高级语言间的文本转换开发成本和维护成本都极其小。 Swift 之所以要翻译成 Objective-C ,是由于 Swift 仍然需要 Objective-C 中的 ARC 、 GCD 等环境。既然 Swift 其实就是 Objective-C , 对入门者而言远比 Objective-C 好学,对资深开发者来说又能节约很多无谓的低级重复的机械代码(这些代码在 LLVM 翻译成 Objective-C 时,编译器自动帮你写上),并且开发者关注的应该是业务逻辑,而不把精力分散在语法等低级问题上,语法消耗的时间越少,这门语言也就越成功,所以他觉得 Swift 必定会替代 Objective-C 。

感觉不对劲啊………………………………………意义何在…为什么…
4101 次点击
所在节点    iDev
22 条回复
sherlocktheplant
2015-10-14 01:01:17 +08:00
应该不会有这么蠢的设计 swift 作者就是 llvm 最初的作者
Ixizi
2015-10-14 01:08:47 +08:00
@sherlocktheplant 别应该啊 … 郁闷
ipconfiger
2015-10-14 01:14:24 +08:00
胡扯!
Perry
2015-10-14 01:16:39 +08:00
并不关心,反自己用着舒服就可以了
msg7086
2015-10-14 01:33:29 +08:00
你说反了。明明有现成的编译器组件,为何还要从头重写一遍?

GCC 也好 LLVM 也好,都是分前后端,先转码成一种中间形态,然后再转译成汇编和机器码的。

如果 Swift 是 Obj-C 的一个变种环境,那么做成 Swift -> Obj-C -> 汇编 我不觉得有什么不妥。
rainex
2015-10-14 02:29:32 +08:00
@sherlocktheplant
是不是这种搞法没细看,但这搞法倒也有先例, C++ Builder 就是先把代码翻译成 Pascal ,用成熟的 Delphi 编译器来生成 Windows 的可执行代码,估计还是有时间和维护成本的问题,不然要说做写编译器,当时 Borland 公司里可是一帮好手,未必比 Apple 弱。


@msg7086
缺点还是有的,多转换一步肯定要慢一点,除非代码量少, C++ Builder 的用户为这个没少骂。

因为这话题,又想起 Anders Hejlsberg 来了,真是个天才。
msg7086
2015-10-14 02:32:57 +08:00
@rainex 嗯,基于成本考虑的话多一步比较便宜。基于性能考虑的话少一步比较快。
dorentus
2015-10-14 08:43:58 +08:00
Swift 一堆 Objective-C 无法支持的特性和数据结构,怎么先编译成 Objective-C ……
jiyee
2015-10-14 09:17:04 +08:00
如果成立,那 iOS 7 为啥不能用...
wxl1380610
2015-10-14 09:21:44 +08:00
@jiyee 好有道理
sherlocktheplant
2015-10-14 09:34:28 +08:00
@Ixizi
我反正搜了很多资料都没提到 swift 编译成 objective-c 的
sherlocktheplant
2015-10-14 09:38:23 +08:00
@rainex
@Ixizi

根据这个 stackoverflow swift 是先编译成 llvm 字节码 再编译成机器码 只是最终是在 Objective-C 的运行环境里运行

就相当于 Groovy 、 Scala 和 Java 的关系
Ixizi
2015-10-14 09:43:42 +08:00
@sherlocktheplant 上 stackoverflow 地址..
swift 和 objective c 用的同一套 runtime?...
Ixizi
2015-10-14 09:48:00 +08:00
请教下偶像 : ) @onevcat
sherlocktheplant
2015-10-14 09:48:23 +08:00
sherlocktheplant
2015-10-14 09:53:42 +08:00
@rainex
@Ixizi

这里找到一篇讲详细编译过程的 swift 是编译成一种他们自己设计的中间语言 swift intermediate language 再编译成 LLVM IR 再编译成机器码
http://arstechnica.com/apple/2014/10/os-x-10-10/22/
fo2w
2015-10-14 10:30:57 +08:00
LLVM 那哥们是什么人......
他做什么我都觉得是对的....
dorentus
2015-10-14 10:33:53 +08:00
@sherlocktheplant 但其实它脱离 Objective-C runtime 也一样可以运行。
onevcat
2015-10-14 17:20:25 +08:00
@Ixizi 编译分为前端和后端,对于 Swift 来说,和 Objective-C 编译上的区别主要在前端(废话...后端的话 LLVM 能编译的语言都是一样的...)。 Swift 编译器先把 Swift 源码转换为 SIL ,就是上面 @sherlocktheplant 说的 Swift Intermediate Language 。 SIL 基本就是对 Swift AST 的组织,然后中间多了一步从 SIL 优化生成 LLVM IR 。到这里之后的后端的话,是和 objc 的处理基本是一样的,因为输入的同样是 LLVM IR 。

转换成 Objective-C 的说法简直是无稽之谈...
jiang42
2015-10-14 18:18:14 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/227821

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX