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

本文目錄
- 一切取決于編譯器
-
LLVM和Chris Lattne - 泛型
-
Value語法 - 面向協(xié)議
- 總結(jié)
一切取決于編譯器
前言
在古老的二進(jìn)制世界中,C語言比任何語言跑的都要快,這是一個事實(shí),而且這個狀態(tài)仍然存在。然而……,Swift卻在運(yùn)行時跑的更快,為什么?
并不是單純的比C語言運(yùn)行快,而是比在我們?nèi)粘9ぷ髦腥魏我粋€純C語言編寫的程序都快。雖然用大量的C語言代碼和高度優(yōu)化的超級程序可以和swift的速度比肩,但是這個程序?qū)⑹且粋€龐然大物,它需要一個龐大的團(tuán)隊(duì)協(xié)力開發(fā),這基本上是很難去管理的一個項(xiàng)目。
這點(diǎn)就是我們所有人共同的想法:“嗯,我們需要創(chuàng)造一個低級代碼進(jìn)行高度集成優(yōu)化的編譯器或者框架,讓普通開發(fā)人員編寫相同的豐富的代碼,并且讓所有的開發(fā)人員在實(shí)現(xiàn)軟件高性能的同時更多的去交流和創(chuàng)造藝術(shù)等高級狀態(tài),同時讓大型的開發(fā)者團(tuán)隊(duì)保持代碼的可讀性”。這就是swift的編譯器背后基本想法。
這就是編譯器……是的。我們都知道,LLVM編譯將C和objective - C的代碼放到一個低級容器中,然后編譯成機(jī)器代碼。在Swift中LLVM做著同樣的事情,編譯成匯編代碼在整個編譯階段。在這一點(diǎn)上變成真正有趣的東西。
現(xiàn)在用編譯器可以很容易的編寫成以前需要用C來寫起來比較困難的優(yōu)秀代碼。LLVM做很多事情可以基于Swift代碼,如在一個普通的項(xiàng)目將大量重建相同的代碼。但請記住,這是一個Swift2.0的新特性。這種力量讓我們看到更多swift2.0的新功能。
LLVM 和Chris Lattne
前言
自他還是個大學(xué)生時 Chris Lattner便是頂尖的編譯器工程師。2005進(jìn)入蘋果公司從事LLVM編譯器的工作,在2011年蘋果公司給了他一個很好的機(jī)會:創(chuàng)建一個新的高級語言,可以讓他所有的天才想法作用于LLVM。Lattner與其他幾個開發(fā)者開始編寫swift語言。
Lattner感受到蘋果公司偉大目標(biāo)和責(zé)任的重大。他對應(yīng)非???帶著LLVM和Clang向更高水平發(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項(xiàng)目工作,一年半后,swift項(xiàng)目成為蘋果最大的焦點(diǎn)。你能想象什么是Lattner的夢想嗎? “創(chuàng)造一個語言,并迅速的改變計(jì)算機(jī)世界”,《Wired》雜志的這樣寫道。
正如C的創(chuàng)造者(Dennis Ritchie 和Kenneth Thompson)改變了計(jì)算機(jī)世界一次,Chris Lattner再次這樣做,這次使用編譯器的力量!
現(xiàn)在蘋果在這一部分…我懷疑這樣說,因?yàn)槲艺娴暮芟矚g蘋果,但讓我們看看如何蘋果的營銷是偉大的。谷歌GO語言第一次出現(xiàn)在2009年,6年后,它甚至沒有出現(xiàn)在前50名在Tiobe排名中。Swift是1歲,這是達(dá)到前十名Tiobe(雖然objective - c是自由落體跌到了第5名)。Tiobe鏈接
嗯,當(dāng)然GO和Swift之間有很大的區(qū)別,GO也達(dá)到更高的Tiobe排名在剛推出的時候,但是come on…Go是由C語言的創(chuàng)造者之一創(chuàng)造的并且Google的站在了它的背后,一個成功的組合,但是看起來效果并不好。我敢說,現(xiàn)在swift是更有可能改變計(jì)算機(jī)世界的對比任何其他語言。
現(xiàn)在,swift是開源的,正如去年Mike Ash希望的那樣。
泛型
前言
我最喜歡的東西之一,Swift是泛型的!然而,對于運(yùn)行時泛型是一個定時炸彈。
為了運(yùn)行可靠的代碼,編譯器應(yīng)該增加更多的檢查和雙重檢查使用一個通用的指令。但是在swift 2.0 并沒有更多的了。再一次,“編譯器的力量!“LLVM現(xiàn)在可以處理更多的事情在我們的代碼,不只是檢查一個文件,而是檢查整個項(xiàng)目。通過這樣,編譯器可以創(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實(shí)例,但是第二個可以運(yùn)行得更快,因?yàn)樗梢员苊獠槐匾愋蜋z查。
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同時改變了
正如你所看到的,都有它的用途和價(jià)值。objective - C的事情是,你必須知道C指針和C的數(shù)據(jù)類型 為了正確處理Value和Reference(引用)語法。Swift 2.0中的新特性再次具備了推斷事物的能力,所以…“編譯器的力量!”
LLVM可以推斷出更多基于代碼和項(xiàng)目文件。它能夠確定一個變量/常數(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ū)ο缶幊?。那是為什?在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)大的。因?yàn)榫幾g器可以處理枚舉、結(jié)構(gòu)和類用同樣的方式在底層,我們可以創(chuàng)建方法,屬性和擴(kuò)展在所有這些類型并且在運(yùn)行時獲得同樣的性能。
只是為了說明這個功能是多么強(qiáng)大,想想看:在Swift標(biāo)準(zhǔn)庫、數(shù)組、集合和字典結(jié)構(gòu)類型(實(shí)際上幾乎所有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ù)制代碼?,F(xiàn)在,隨著協(xié)議擴(kuò)展您可以為CollectionType和所有的類創(chuàng)建一個擴(kuò)展,并且實(shí)現(xiàn)這個協(xié)議獲得免費(fèi)的新功能。
但是等一下,你可能不想給這個函數(shù)所有CollectionType,因?yàn)樽值浜妥址矔碛兴?。沒有問題,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)性和類的盒子。記住,類試圖說明這個真實(shí)的世界,但是他們有很多問題,如單鏈,這不是現(xiàn)實(shí)世界是如何工作的。語言像c++這樣嘗試用多重繼承給類一點(diǎn)力量,但是……OMG……你知道,這個嘗試可能是有史以來最糟糕的特性之一。
簡而言之,OOP(面向?qū)ο缶幊蹋┰噲D重現(xiàn)真實(shí)世界結(jié)構(gòu)和創(chuàng)建新的編程范式,但這并不是現(xiàn)實(shí)世界的工作方式。現(xiàn)在流行一種新的方式思考,一種新的方式來處理現(xiàn)實(shí)和轉(zhuǎn)錄真實(shí)世界的東西進(jìn)入我們的小編程世界。
總結(jié)
從這篇文章中,記住下面這幾件事,將是非常美好的:
Swift的性能來自編譯器
-
Swift 2.0即將改變我們的范例 -
Swift是未來
我將開始寫一系列關(guān)于Swift的文章,談?wù)撍男绿匦?秘密,分享Playgrounds和算法。
由于水平有限,肯定有很多地方翻譯的不準(zhǔn)確,那么你可以查看原文地址db-in。轉(zhuǎn)載請注明出處哦!簡書-蘿卜疙瘩