首页 > Swift是编译性语言还是脚本性语言 ?

Swift是编译性语言还是脚本性语言 ?

问题在知乎上问过, http://zhi.hu/dZxU
http://www.cocoachina.com/bbs/read.php?tid=204471看到这个帖子说: "
这个swift应该也是这个思路,底层仍然是cocoa/cocoa touch类库,上面弄出个简练的脚本层调用这些库,由于LLVM编译器极其优秀,所以编译成一体的本地机器码时,反而比从复杂的objective-c调用这些库更快些。

为什么swift竟然会比objective-c执行效率高?我们一般都认为脚本语言是解释执行的,所以运行速度慢,但不都是这样,有编译运行的,比如Perl就是即时编译后运行的。有文章说swift是苹果搞编译器开发的人设计出来的,他一定会让swift编译运行,由于swift去掉了与c语法兼容的包袱,很精炼,所以没有多少语法糖反复包裹主要代码,当然速度快了,尤其在大循环里面调用函数,调用开销很多消耗在函数包装上,对速度的提升会更明显,WWDC 2014视频中显示加密算法对执行速度的提升最多,大家都知道加密算法就是大循环套小循环再在其中调用函数的典型应用。"


1 swift是编译型语言。

2 目前cocoa框架仍然是Objective-C实现的,苹果在cocoa的OC接口上做了一层桥接,使得swift可以调用cocoa接口。

3 同样是编译型语言,执行效率也会有区别的。OC虽说是编译型语言但有很多动态的特性。调用OC对象的方法实际上是给一个OC对象发消息,对象收到消息会通过自己的isa指针找到对象的类(这个类也是一个对象),然后查找有没有对应的方法实现,有就调用,没有就到父类中去找。如果一直到根类NSObject都找不到,则丢弃这个消息。整个过程都在运行期完成,还是比较耗时的。C++的面向对象则不同,调用对象的方法执行哪段代码在编译期就确定了,运行时只是简单地根据函数指针找到对应的实现,效率自然不一样。记得好像是C++要快几百倍。个人猜测swift是强类型语言,面向对象的实现可能更接近于C++,在调用对象的方法这一步上比OC快多了。


swift是静态语言,相对的是动态语言,比如Ruby

运行swfit程序要编译才能运行,而动态语言(脚本语言)可以直接运行


其实你英语OK的话,去随便Google下就有了。

随便给你个传送门吧:en.wikipedia.org
看不懂的话左边点中文吧。


首先,swift不是脚本。swift 官方主页上写的“The Swift compiler is also faster...",提到了Swift是一个编译器。所以它是编译的。

一直以来,关于语言,有三大流派争论,编译器、解释器、基于字节码的即时编译。即时编译技术比较新,因为java,c#而声名大噪,可实际上,在桌面上需要及时响应用户的,比拼下来实在不怎么样,感觉很糟,不要说渣一样的swing和awt,即使做桌面出身的牛逼如MS的,win form也实在表现一般。服务器的话,主要瓶颈是网络,所以编译码效率慢点也就看不出来。

swift 比OC效率高完全可能。都是编译型的,还不需要头文件插入、预处理(两遍编译)之类的古老的拖后腿的语法,为什么不能快。苹果是做桌面OS和手机OS的,追求的是客户使用体验,再加上即时编译这些年的进步缺乏,不可能拿即时编译来混弄客户的。

脚本的速度还是算了,你的浏览器的内部刷新和真正的桌面或者iOS的应用的顺滑,比得了吗?

然而,swift 的语法,确实引入了很多脚本的强力表达特征,比如

数组直接嵌套:

let a = [[],[]]

字典以字面量直接表达:

let populatedDic = ["key1": "value1", "key2": "value2"]

主流编译语言看不到这么牛的表达能力,即时编译的都看不到。

牛逼。


按照你的选择 是编译性语言


与编译型语言相对的不是脚本语言,而是解释(直译)型语言,虽然一般来说脚本语言都是解释型,但是不排除例外。swift的运行效率这么高,估计应该是编译型。

【热门文章】
【热门文章】