在分析之前,我先把我的觀點(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
語言比任何語言跑的都要快稻爬,這是一個事實嗜闻,而且這個狀態(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
編譯將C
和objective - C
的代碼放到一個低級容器中,然后編譯成機(jī)器代碼邮旷。在Swift
中LLVM
做著同樣的事情,編譯成匯編代碼在整個編譯階段。在這一點(diǎn)上變成真正有趣的東西蝇摸。
現(xiàn)在用編譯器可以很容易的編寫成以前需要用C來寫起來比較困難的優(yōu)秀代碼婶肩。LLVM
做很多事情可以基于Swift
代碼,如在一個普通的項目將大量重建相同的代碼。但請記住,這是一個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
項目工作,一年半后,swift
項目成為蘋果最大的焦點(diǎn)尉姨。你能想象什么是Lattner的夢想嗎? “創(chuàng)造一個語言,并迅速的改變計算機(jī)世界”,《Wired》雜志的這樣寫道庵朝。
正如C的創(chuàng)造者(Dennis Ritchie
和Kenneth 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)然GO
和Swift
之間有很大的區(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ù)類型 為了正確處理Value
和Reference
(引用)語法州疾。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
最令人興奮的事情氧急。你猜怎么著,這又是編譯器的事:“編譯器的力量!”,但這一次,它是如此巨大,這是一個完全改變范式和真的可以改變我們的方式。
Swift
2.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)存在窖维。Swift
j叫(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)載請注明出處哦吟秩!簡書-蘿卜疙瘩