(譯)Swift 2.0比Objective-C更優(yōu)秀

在分析之前,我先把我的觀點(diǎn)表明 :"Swift 是未來"左驾。在本文中茴厉,我將慢慢揭開Swift的神秘面紗泽台。我會介紹一些Swift 2.0的關(guān)鍵點(diǎn),比如LLVM的優(yōu)化矾缓,Generics Specialization(泛型特化),Value Syntax (Value 語法)和Protocol Oriented Programming(面向協(xié)議編程).

Swift 2.0

本文目錄

  • 一切取決于編譯器
  • LLVMChris Lattne
  • 泛型
  • Value語法
  • 面向協(xié)議
  • 總結(jié)

一切取決于編譯器

前言
在古老的二進(jìn)制世界中,C語言比任何語言跑的都要快稻爬,這是一個事實嗜闻,而且這個狀態(tài)仍然存在。然而……桅锄,Swift卻在運(yùn)行時跑的更快琉雳,為什么?

并不是單純的比C語言運(yùn)行快友瘤,而是比在我們?nèi)粘9ぷ髦腥魏我粋€純C語言編寫的程序都快翠肘。雖然用大量的C語言代碼和高度優(yōu)化的超級程序可以和swift的速度比肩,但是這個程序?qū)⑹且粋€龐然大物辫秧,它需要一個龐大的團(tuán)隊協(xié)力開發(fā)束倍,這基本上是很難去管理的一個項目。

這點(diǎn)就是我們所有人共同的想法:“嗯,我們需要創(chuàng)造一個低級代碼進(jìn)行高度集成優(yōu)化的編譯器或者框架,讓普通開發(fā)人員編寫相同的豐富的代碼盟戏,并且讓所有的開發(fā)人員在實現(xiàn)軟件高性能的同時更多的去交流和創(chuàng)造藝術(shù)等高級狀態(tài),同時讓大型的開發(fā)者團(tuán)隊保持代碼的可讀性”绪妹。這就是swift的編譯器背后基本想法。

這就是編譯器……是的柿究。我們都知道,LLVM編譯將Cobjective - C的代碼放到一個低級容器中,然后編譯成機(jī)器代碼邮旷。在SwiftLLVM做著同樣的事情,編譯成匯編代碼在整個編譯階段。在這一點(diǎn)上變成真正有趣的東西蝇摸。

現(xiàn)在用編譯器可以很容易的編寫成以前需要用C來寫起來比較困難的優(yōu)秀代碼婶肩。LLVM做很多事情可以基于Swift代碼,如在一個普通的項目將大量重建相同的代碼。但請記住,這是一個Swift2.0的新特性貌夕。這種力量讓我們看到更多swift2.0的新功能律歼。

LLVMChris Lattne

前言
自他還是個大學(xué)生時 Chris Lattner便是頂尖的編譯器工程師。2005進(jìn)入蘋果公司從事LLVM編譯器的工作蜂嗽,在2011年蘋果公司給了他一個很好的機(jī)會:創(chuàng)建一個新的高級語言,可以讓他所有的天才想法作用于LLVM苗膝。Lattner與其他幾個開發(fā)者開始編寫swift語言。

Lattner感受到蘋果公司偉大目標(biāo)和責(zé)任的重大植旧。他對應(yīng)非橙杞遥快,帶著LLVMClang向更高水平發(fā)展,他創(chuàng)造了C語言Blocks功能,一塊超級優(yōu)化的代碼,在運(yùn)行時可以運(yùn)行非常快,由于其對待棧內(nèi)存病附。如果你記得iOS 4 问窃,那就知道Blocks是使GCD變成了可能。

Lattner還為objective - c創(chuàng)建ARC特性方面做出了貢獻(xiàn)完沪。正如你所看到的,他是負(fù)責(zé)了最后5年蘋果開發(fā)最先進(jìn)的特性域庇。Swift,Lattner的最大的夢想嵌戈。但是卻有一個奇怪的事情:在開發(fā)swift的時候,他都是晚上在家里完成的听皿。在秘密開發(fā)swift的一年半的時間里,他沒有告訴蘋果公司里任何人,甚至他最親密的朋友熟呛。僅僅在2011年Chris在蘋果高管會議上透露他的秘密。

蘋果指定了很少一些開發(fā)者從事swift項目工作,一年半后,swift項目成為蘋果最大的焦點(diǎn)尉姨。你能想象什么是Lattner的夢想嗎? “創(chuàng)造一個語言,并迅速的改變計算機(jī)世界”,《Wired》雜志的這樣寫道庵朝。

正如C的創(chuàng)造者(Dennis RitchieKenneth Thompson)改變了計算機(jī)世界一次,Chris Lattner再次這樣做,這次使用編譯器的力量!

現(xiàn)在蘋果在這一部分…我懷疑這樣說,因為我真的很喜歡蘋果,但讓我們看看如何蘋果的營銷是偉大的。谷歌GO語言第一次出現(xiàn)在2009年,6年后,它甚至沒有出現(xiàn)在前50名在Tiobe排名中又厉。Swift是1歲,這是達(dá)到前十名Tiobe(雖然objective - c是自由落體跌到了第5名)九府。Tiobe鏈接

嗯,當(dāng)然GOSwift之間有很大的區(qū)別,GO也達(dá)到更高的Tiobe排名在剛推出的時候,但是come on…Go是由C語言的創(chuàng)造者之一創(chuàng)造的并且Google的站在了它的背后,一個成功的組合,但是看起來效果并不好。我敢說,現(xiàn)在swift是更有可能改變計算機(jī)世界的對比任何其他語言覆致。
  
  現(xiàn)在,swift是開源的,正如去年Mike Ash希望的那樣侄旬。

泛型

前言
  我最喜歡的東西之一,Swift是泛型的!然而,對于運(yùn)行時泛型是一個定時炸彈。

為了運(yùn)行可靠的代碼,編譯器應(yīng)該增加更多的檢查和雙重檢查使用一個通用的指令煌妈。但是在swift 2.0 并沒有更多的了儡羔。再一次,“編譯器的力量!“LLVM現(xiàn)在可以處理更多的事情在我們的代碼,不只是檢查一個文件,而是檢查整個項目。通過這樣,編譯器可以創(chuàng)建特定版本的泛型,這稱為泛型特化声旺。

// 思考一個泛型函數(shù)
func maxFunc(x: T, _ y: T) -> T {
    if x < y {
    return y
  }
  return x
}
...
// 另一個文件
var a = 4
var b:Int = 2 + 3
var c = maxFunc(a, b)

現(xiàn)在swift 2.0編譯器可以推斷,上面的代碼可以取而代之的是:

 // 通過泛型專業(yè)化生成的版本
func maxFunc (x: Int, _ y: Int) -> Int {
  if x < y {
    return y
  }
  return x
}

通過這個優(yōu)化版本,編譯器在運(yùn)行時能保證更高的性能笔链。
  
  這和多年前的isEqual:isEqualToString:是相同的概念。都做同樣的工作,您可以使用兩個NSString實例,但是第二個可以運(yùn)行得更快,因為它可以避免不必要類型檢查腮猖。

Value 語法

前言
  這一特性在Swift 1.x 版本中就已經(jīng)存在鉴扫。但現(xiàn)在它比以前更優(yōu)秀了。Value語法剛好和引用語法(Reference Syntax)相反,它是一個用于C指針和consequentely objective - C的類澈缺。C語言的struct和C的基本數(shù)據(jù)類型使用Value 語法,所以這里沒有最新進(jìn)展坪创。
只是要記住,這里有兩種語法的一個例子:(objective - c)

// Value 語法, 內(nèi)存復(fù)制.
CGRect rect = {0.0, 0.0, 100.0, 100.0};
CGRect rectVS = rect;

rect.size.width = 50;
rectVS.origin.x = 10;

NSLog(@"%@", NSStringFromCGRect(rect)); // Prints {{0, 0}, {50, 100}}
NSLog(@"%@", NSStringFromCGRect(rectVS)); // Prints {{10, 0}, {100, 100}}
//這里表達(dá)的意思是在賦值的同時,把rect的值是在內(nèi)存重新復(fù)制了1    份姐赡,這是一個新的內(nèi)存地址莱预,
而不是引用的原來rect的內(nèi)存地址

// 引用語法,內(nèi)存共享
CGRect *rectRS = &rect

rect.size.width = 25;
(*rectRS).origin.x = 10;

NSLog(@"%@", NSStringFromCGRect(rect)); // Prints {{10, 0}, {25, 100}}
NSLog(@"%@", NSStringFromCGRect(*rectRS)); // Prints {{10, 0}, {25, 100}}
//在這里 rectRS 直接飲引用了rect的內(nèi)存地址项滑,所以在內(nèi)存中并沒有開辟新的內(nèi)存空間依沮,
所以這兩個指針都指向了同一塊內(nèi)存地址,所以修改的時候不管是修改那個指針的值枪狂,
都是修改的同一塊內(nèi)存空間危喉,所以最后是width和x同時改變了  

正如你所看到的,都有它的用途和價值。objective - C的事情是,你必須知道C指針和C的數(shù)據(jù)類型 為了正確處理ValueReference(引用)語法州疾。Swift 2.0中的新特性再次具備了推斷事物的能力,所以…“編譯器的力量!”

LLVM可以推斷出更多基于代碼和項目文件辜限。它能夠確定一個變量/常數(shù)必須使用value語法或引用語法。Swift是默認(rèn)值基于Value語法的,但是您可以使用這兩種方式如果你想要通過改變代碼的架構(gòu)(如創(chuàng)建封裝類)或通過強(qiáng)制(使用inout指令)的引用严蓖。inout(地址引用),你猜怎么著……它的語法和在C語言中是一樣的,用“&”薄嫡。太棒了!

func fooSum(inout varA:Int, varB:Int)
{
  varA += varB
}
var a = 5
let b = 3
fooSum(&a, varB: b)
print(a)

面向協(xié)議

前言
  這是我想談?wù)劦淖詈笠徊糠?但我認(rèn)為這是Swift 2.0最令人興奮的事情氧急。你猜怎么著,這又是編譯器的事:“編譯器的力量!”,但這一次,它是如此巨大,這是一個完全改變范式和真的可以改變我們的方式。

Swift2.0現(xiàn)在被稱為面向協(xié)議的編程毫深,相對于面向?qū)ο缶幊谭园印D鞘菫槭裁?在Swift 2.0中引入的協(xié)議擴(kuò)展改變了一切。伴隨Where Clauses的力量,這個新協(xié)議特性使我們想象一個沒有類和多態(tài)的全新世界哑蔫。

首先,作為一個副作用協(xié)議擴(kuò)展消除了模擬測試,一個我認(rèn)為丑陋的和不必要的钾恢。模擬是很糟糕的,協(xié)議擴(kuò)展是偉大的并且可以做同樣的事情。這是其他文章的主題,現(xiàn)在讓我們來關(guān)注這個新特性如何改變我們的世界鸳址。

你已經(jīng)知道值類型在Swift是偉大的和強(qiáng)大的。因為編譯器可以處理枚舉泉懦、結(jié)構(gòu)和類用同樣的方式在底層,我們可以創(chuàng)建方法,屬性和擴(kuò)展在所有這些類型并且在運(yùn)行時獲得同樣的性能稿黍。

只是為了說明這個功能是多么強(qiáng)大,想想看:在Swift標(biāo)準(zhǔn)庫、數(shù)組崩哩、集合和字典結(jié)構(gòu)類型(實際上幾乎所有Swift標(biāo)準(zhǔn)庫的結(jié)構(gòu)與許多擴(kuò)展)巡球。所有這三個類型共享相同的CollectionType協(xié)議。這個協(xié)議也由許多人共享,如字符串邓嘹。

假設(shè)您希望創(chuàng)建一個數(shù)組和集合擴(kuò)展酣栈。在Swift 1.x,甚至在objective - c中,你可以創(chuàng)建一個分類(稱為擴(kuò)展在Swift中)為這個數(shù)組和為集合創(chuàng)建另一個分類,在這種情況下你可以開始復(fù)制代碼。現(xiàn)在,隨著協(xié)議擴(kuò)展您可以為CollectionType和所有的類創(chuàng)建一個擴(kuò)展,并且實現(xiàn)這個協(xié)議獲得免費(fèi)的新功能汹押。

但是等一下,你可能不想給這個函數(shù)所有CollectionType,因為字典和字符串也會擁有它矿筝。沒有問題,Where Clause(即約束)你可以做到在一行代碼中,在協(xié)議擴(kuò)展上定義,將只作用于一個單一的元素類型的集合。

請注意,協(xié)議擴(kuò)展和創(chuàng)建協(xié)議繼承(或?qū)哟?是完全不同的棚贾。就像子類化一個類的層次結(jié)構(gòu),這并不是什么新鮮事物,Obj-C已經(jīng)存在窖维。Swiftj叫(Extension)擴(kuò)展,我們以前用的叫分類(Category),所以Swift 2.0可以創(chuàng)建具體和抽象分類的協(xié)議,這是完全不同于協(xié)議繼承。

花點(diǎn)時間思考這個新特性多么偉大,它可以打破范式和開放我們的世界的可能性妙痹。有些人可能會說不是太多,而且他們可能會考慮如何達(dá)到類似的行為,在其他語言編碼一次铸史。這不是重點(diǎn)。討論一種語言沒有多少膠水代碼可以使用來達(dá)到相同的行為怯伊。討論語言是它的語法和模式如何改變我們的思維和編寫方式琳轿。

Swift 2.0這個協(xié)議特性足以把我們跳出的多態(tài)性和類的盒子。記住,類試圖說明這個真實的世界,但是他們有很多問題,如單鏈,這不是現(xiàn)實世界是如何工作的耿芹。語言像c++這樣嘗試用多重繼承給類一點(diǎn)力量,但是……OMG……你知道,這個嘗試可能是有史以來最糟糕的特性之一崭篡。

簡而言之,OOP(面向?qū)ο缶幊蹋┰噲D重現(xiàn)真實世界結(jié)構(gòu)和創(chuàng)建新的編程范式,但這并不是現(xiàn)實世界的工作方式。現(xiàn)在流行一種新的方式思考,一種新的方式來處理現(xiàn)實和轉(zhuǎn)錄真實世界的東西進(jìn)入我們的小編程世界猩系。

總結(jié)

從這篇文章中媚送,記住下面這幾件事,將是非常美好的:

  • Swift的性能來自編譯器
  • Swift 2.0 即將改變我們的范例
  • Swift是未來

我將開始寫一系列關(guān)于Swift的文章,談?wù)撍男绿匦?秘密,分享Playgrounds和算法寇甸。

由于水平有限塘偎,肯定有很多地方翻譯的不準(zhǔn)確疗涉,那么你可以查看原文地址db-in。轉(zhuǎn)載請注明出處哦吟秩!簡書-蘿卜疙瘩

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咱扣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涵防,更是在濱河造成了極大的恐慌闹伪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮池,死亡現(xiàn)場離奇詭異偏瓤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椰憋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門厅克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橙依,你說我怎么就攤上這事证舟。” “怎么了窗骑?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵女责,是天一觀的道長。 經(jīng)常有香客問我创译,道長抵知,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任昔榴,我火速辦了婚禮辛藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互订。我一直安慰自己吱肌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布仰禽。 她就那樣靜靜地躺著氮墨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吐葵。 梳的紋絲不亂的頭發(fā)上规揪,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音温峭,去河邊找鬼猛铅。 笑死,一個胖子當(dāng)著我的面吹牛凤藏,可吹牛的內(nèi)容都是我干的奸忽。 我是一名探鬼主播堕伪,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栗菜!你這毒婦竟也來了欠雌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤疙筹,失蹤者是張志新(化名)和其女友劉穎富俄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體而咆,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霍比,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暴备。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桂塞。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馍驯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玛痊,我是刑警寧澤汰瘫,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站擂煞,受9級特大地震影響混弥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜对省,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蝗拿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒿涎,春花似錦哀托、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玻淑,卻和暖如春嗽冒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背补履。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工添坊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箫锤。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓贬蛙,卻偏偏與公主長得像雨女,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子速客,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容