Swift 是一門(mén)多范式的編譯型語(yǔ)言,是 Apple 生態(tài)中的重要開(kāi)發(fā)工具 。官網(wǎng)介紹 Swift 的設(shè)計(jì)目的是讓開(kāi)發(fā)者們更容易編寫(xiě)和維護(hù)正確的程序,使用體驗(yàn)如下 :
安全:所有編碼行為都以安全的方式進(jìn)行。
快速:為了替代基于 C 的語(yǔ)言(C、C++、Objective-C),Swift 的性能必然不能相差太多,且必須持續(xù)可預(yù)測(cè)的,而不只是在一些特定情況下。
表達(dá)力強(qiáng):受益于計(jì)算機(jī)科學(xué)幾十年的發(fā)展,Swift 提供了足夠有樂(lè)趣、現(xiàn)代的開(kāi)發(fā)過(guò)程,且仍然在持續(xù)發(fā)展中。
Swiftlogo
# 誕生#
在 WWDC 2010 期間,Chris Lattner 剛帶團(tuán)隊(duì)經(jīng)過(guò)大量的努力完成了 Clang 對(duì) C++ 語(yǔ)言的支持,任務(wù)完成雖然開(kāi)心,但其中真正細(xì)節(jié)的工作也讓人感到無(wú)比心累,由此 Chris Lattner 萌生了創(chuàng)造更好的語(yǔ)言的想法 [3]。
最開(kāi)始 Chris Lattner 只是和 Bertrand Serlet、Dave Zarzycki 討論這個(gè)新語(yǔ)言的設(shè)計(jì),語(yǔ)言名字叫“Shiny”,寓意“you’re building a shiny new thing”。當(dāng)時(shí)雖然已經(jīng)有了很多想法,但新語(yǔ)言的未來(lái)其實(shí)是完全不確定的,因此在 Bertrand Serlet 的推動(dòng)下,一些想法先在 Objective-C 得到了實(shí)現(xiàn),比如 ARC、modules 甚至是 literals,這些特性都來(lái)自于背后 Swift 初期的一些討論。但也有 Objective-C 無(wú)法實(shí)現(xiàn)的,比如內(nèi)存安全,要實(shí)現(xiàn)內(nèi)存安全意味著大部分 C 代碼都要被移除,那 Objective-C 也不再是 Objective-C 。
Chris Lattner 自己實(shí)現(xiàn)了大部分基本架構(gòu),但一個(gè)人不可能完成所有,2011 年 4 月經(jīng)過(guò)與管理層討論后,Chris Lattner 開(kāi)始拉人入伙。這也是 Swift 第一次在內(nèi)部公開(kāi)被審視,不可避免地收到了很多刺耳的反饋,但這可能也是很多項(xiàng)目成長(zhǎng)的必經(jīng)之路,批判同時(shí)意味著關(guān)注,其中可能也指明了未來(lái)的方向。
團(tuán)隊(duì)化運(yùn)作后 Swift 發(fā)展飛快,2013 年 7 月開(kāi)始 Swift 成為了蘋(píng)果開(kāi)發(fā)者工具部門(mén)的重點(diǎn)項(xiàng)目 。在閉門(mén)開(kāi)發(fā) 4 年后,2014 年 Swift 正式發(fā)布,當(dāng)時(shí)官宣標(biāo)簽是“Objective-C without C”,Swift 在設(shè)計(jì)上就可以與 Objective-C 共存。
# 演進(jìn)#
Swift 1.0 在 WWDC 2014 首次亮相,由當(dāng)時(shí)蘋(píng)果的軟件工程高級(jí)副總裁 Craig Federighi 正式發(fā)布,并邀請(qǐng) Chris Lattner 上臺(tái)做了 Demo 演示。發(fā)布后第一個(gè)月的下載就超過(guò)了 1100 萬(wàn)。
2015 年初 Stack Overflow 的調(diào)研中,Swift 是最受喜愛(ài)的編程語(yǔ)言 [6]。2015 年 11 月 Swift 正式開(kāi)源,代碼托管在 GitHub,第一周的 clone 超過(guò)了 6 萬(wàn) ,可見(jiàn)初期開(kāi)發(fā)者對(duì)于 Swift 的好奇與熱情。
2015 年 Stack Overflow 調(diào)研:最喜歡的語(yǔ)言
但 Swift 在 3.0、4.0 時(shí)期,一直有穩(wěn)定性問(wèn)題,幾乎每年都有大變動(dòng),有一些更新是向后不兼容的,也意味著這個(gè)階段的 Swift 還未準(zhǔn)備好應(yīng)用于大型商業(yè)項(xiàng)目。
2019 年 Swift 5.0 發(fā)布,終于帶來(lái)了 ABI 穩(wěn)定。Swift 5.0 后,不再引入大的變動(dòng),不同版本的 Swift 最終可以編譯為同一個(gè) App,這標(biāo)志著 Swift 語(yǔ)言的成熟。2019 年另一個(gè)標(biāo)志性事件是 SwiftUI 發(fā)布,意在統(tǒng)一所有蘋(píng)果設(shè)備的開(kāi)發(fā)體驗(yàn)。
Swift 的 TIOBE 指數(shù)變化及一些關(guān)鍵演進(jìn)
目前 Swift 有完整的工具鏈支撐開(kāi)發(fā),融入了蘋(píng)果的開(kāi)發(fā)者生態(tài),替代 Objective-C 成為主流的蘋(píng)果生態(tài)開(kāi)發(fā)語(yǔ)言已是必然趨勢(shì)。
2021 年 JetBrains 開(kāi)發(fā)者調(diào)研:Swift and Objective-C 開(kāi)發(fā)者人數(shù)對(duì)比
值得一提的是,Chris Lattner 在 2017 年離開(kāi)蘋(píng)果加入了谷歌,在谷歌期間主導(dǎo)了 S4TF 項(xiàng)目,這也是 Swift 在 AI 領(lǐng)域的一次重要嘗試。2020 年 Chris Lattner 從谷歌離職,開(kāi)始了 AI 編譯器的探索,目前 S4TF 項(xiàng)目已是歸檔狀態(tài),但這個(gè)嘗試驗(yàn)證了 Swift 應(yīng)用于 AI 的可行性 ,Swift 在性能上較 Python 有一定優(yōu)勢(shì)。
# 蘋(píng)果官方生態(tài)#
# 工具鏈
官方提供的工具鏈?zhǔn)?Swift 生態(tài)的核心部分,除了 Swift 的編譯器、標(biāo)準(zhǔn)庫(kù)等,蘋(píng)果還提供了一系列支撐學(xué)習(xí)、開(kāi)發(fā)的優(yōu)秀工具:
核心庫(kù) :核心庫(kù)提供了比標(biāo)準(zhǔn)庫(kù)更高級(jí)的功能,包括常用的數(shù)據(jù)、字符集合,單元測(cè)試,日期計(jì)算等。
調(diào)試器 & REPL :基于 LLDB 調(diào)試器開(kāi)發(fā)的調(diào)試環(huán)境,同時(shí)也是交互式解釋器。
包管理 SPM :與 Swift 構(gòu)建系統(tǒng)集成,可以自動(dòng)化下載、編譯和鏈接依賴(lài)的過(guò)程。蘋(píng)果官方還未提供中心倉(cāng)服務(wù),仍需要通過(guò) git 來(lái)下載三方庫(kù),三方庫(kù)的注冊(cè)服務(wù)已有計(jì)劃,但仍未發(fā)布 。
Playgrounds :2016 年發(fā)布,是一款適用于 iPad 的教育類(lèi) App,2022 年 5 月發(fā)布的 4.1 版本開(kāi)始適用于 iPad 與 Mac,不僅僅是一款教育類(lèi) App,也可以用于開(kāi)發(fā),其中利用 iPad 性能開(kāi)發(fā)的輕點(diǎn)拖拽等操作,進(jìn)一步提升了編碼過(guò)程的互動(dòng)性。
# 框架
2019 年 WWDC 上,蘋(píng)果發(fā)布了基于 Swift 的聲明式框架 SwiftUI,可以用于開(kāi)發(fā) watchOS、macOS、iOS 等平臺(tái),基本上涵蓋了所有蘋(píng)果產(chǎn)品的系統(tǒng)。
Swift 和 SwfitUI 可以說(shuō)是直接從語(yǔ)言和開(kāi)發(fā)工具層面直接統(tǒng)一了開(kāi)發(fā)者的開(kāi)發(fā)體驗(yàn)。在 SwiftUI 推出之前,蘋(píng)果不同設(shè)備的開(kāi)發(fā)框架并不互通,移動(dòng)端和桌面端的開(kāi)發(fā)需要掌握不同的知識(shí)內(nèi)容,移動(dòng)端開(kāi)發(fā)者需要使用 UIKit,桌面端的開(kāi)發(fā)者需要使用 AppKit,WatchOS 的開(kāi)發(fā)者需要使用一種類(lèi)似堆疊的邏輯 。
SwiftUI 針對(duì)現(xiàn)有的問(wèn)題給出了一些解決思路,聲明式編程對(duì)比指令式的編程又加了一層抽象,比如坐標(biāo)、寬度、字形字號(hào)等變量由系統(tǒng)接管,開(kāi)發(fā)者只需要直觀地告訴系統(tǒng)需要放置一個(gè)圖像、加點(diǎn)文字等,由此,SwiftUI 的代碼量小了很多,也可以更方便地適配不同尺寸的設(shè)備。此外,在數(shù)據(jù)流通方面,SwiftUI 在 Combine 的協(xié)助下實(shí)現(xiàn)了單一數(shù)據(jù)源的管理 。
在開(kāi)發(fā)者的實(shí)際體驗(yàn)中,代碼量和可讀性無(wú)疑都有了本質(zhì)性的提升 。
WWDC 2019 SwiftUI Demo
但近期也有開(kāi)發(fā)者表明自己在嘗試應(yīng)用 SwiftUI 到項(xiàng)目時(shí)遇到了問(wèn)題,比如不好用的實(shí)時(shí)檢查器、延遲問(wèn)題等,最終直言要暫時(shí)放棄 SwiftUI 。
不可否認(rèn) SwiftUI 提供了一些很棒的思路,但目前仍未非常成熟,在真正的應(yīng)用中還未達(dá)到設(shè)想的效果,要想替換 AppKit、UIKit 還有很長(zhǎng)一段路要走。
# 學(xué)習(xí) Swift
蘋(píng)果為了追求不同設(shè)備上用戶(hù)體驗(yàn)的一致,對(duì)于軟件開(kāi)發(fā)有一套非常詳細(xì)嚴(yán)格的標(biāo)準(zhǔn);但又必須降低開(kāi)發(fā)門(mén)檻來(lái)吸引更多開(kāi)發(fā)者開(kāi)發(fā)蘋(píng)果設(shè)備軟件,因此開(kāi)發(fā)工具必須足夠易學(xué)好用,才能解決這個(gè)矛盾 [16]。Swift 在設(shè)計(jì)上就是一門(mén)易學(xué)習(xí)的編程語(yǔ)言,同時(shí)又有很多現(xiàn)代編程語(yǔ)言的特性,上限很高。
除了語(yǔ)言設(shè)計(jì),文檔也是學(xué)習(xí)一門(mén)語(yǔ)言的關(guān)鍵。蘋(píng)果官方提供了學(xué)習(xí)文檔和代碼規(guī)范,也有大量三方組織或個(gè)人分享了優(yōu)秀的視頻圖文教程,特別是對(duì)于初學(xué)者來(lái)說(shuō),可以大大降低學(xué)習(xí)成本。
此外,為了開(kāi)發(fā)者能更快上手 Swift,蘋(píng)果也提供了大量好用的工具,其中 Playgrounds 以代碼玩游戲的設(shè)計(jì)理念更是革命性的,即使是沒(méi)有編碼基礎(chǔ)的人,也可以通過(guò) Playgrounds 迅速掌握 Swift。
Swift Playgrounds Demo
# 社區(qū)#
# Swift 開(kāi)源
2015 年 Swift 正式開(kāi)源,開(kāi)源后社區(qū)可以直接參與到 Swift 的設(shè)計(jì)和實(shí)現(xiàn)。已開(kāi)源的部分包括編譯器、標(biāo)準(zhǔn)庫(kù)、核心庫(kù)、LLDB 調(diào)試器、包管理和 Xcode 的 Playground 支持 。
不過(guò) Swift 開(kāi)源項(xiàng)目中超過(guò) 90% 的提交還是來(lái)自蘋(píng)果(除去 ci、未知等賬號(hào)的提交),其次谷歌有 800+ 次提交,但占比還不到 1%,剩下其他團(tuán)隊(duì)或個(gè)人的提交都不超過(guò) 500 次。
除了直接貢獻(xiàn)代碼,開(kāi)源社區(qū)也是用戶(hù)與項(xiàng)目開(kāi)發(fā)團(tuán)隊(duì)直接溝通的重要渠道,用戶(hù)可以通過(guò)提交 issue 來(lái)反饋問(wèn)題和建議。從 Swift 編譯器項(xiàng)目中所有 issue 來(lái)看,每月新建 Issue 數(shù)在逐漸減少,同時(shí) bug、Compiler 相關(guān)的 issue 數(shù)量也在逐年下降,印證了項(xiàng)目的穩(wěn)定性。
每月新建 Issue 數(shù)量
每年相關(guān)標(biāo)簽的 Issue 數(shù)量
# 開(kāi)發(fā)者社區(qū)
發(fā)布后開(kāi)發(fā)者社區(qū)即用戶(hù)社區(qū),是語(yǔ)言演進(jìn)非常直接的驅(qū)動(dòng)力,編程語(yǔ)言項(xiàng)目團(tuán)隊(duì)里的開(kāi)發(fā)者是寫(xiě)編譯器的人,但可能用的還是 C++,社區(qū)里的開(kāi)發(fā)者才是每天在使用 Swift 的人!用戶(hù)真正的需求甚至可能改變最初設(shè)計(jì)者的想法,比如最開(kāi)始 Swift 核心團(tuán)隊(duì)認(rèn)為語(yǔ)言不需要 Result,但社區(qū)有很多聲音說(shuō)“我們需要”,因此 Swift 5 又加入了 Result 。
在語(yǔ)言本身的語(yǔ)法模塊都已經(jīng)穩(wěn)定的情況下,社區(qū)的活躍度可以反映語(yǔ)言的流行程度。
Swift 在 Stack Overflow 的熱度自 2016 年后持續(xù)下降,相反 Dart 從 2018 年至今熱度在持續(xù)升高;在 Swift 各版本的對(duì)比中,一般剛發(fā)布后會(huì)有一個(gè)高峰,隨后逐漸下降,近 3 年,只有 SwiftUI 的熱度相對(duì)較高且穩(wěn)定 [21]。
Stack Overflow 中語(yǔ)言熱度
Stack Overflow 中 Swift 各版本熱度
# 開(kāi)發(fā)者調(diào)研
SlashData 2022 年的開(kāi)發(fā)者生態(tài)報(bào)告中估計(jì) Swift 開(kāi)發(fā)者人數(shù)在 3500 萬(wàn),較去年的 2500 萬(wàn)上升了 40%,不過(guò)因?yàn)榇蟛糠珠_(kāi)發(fā)者還是和 Objective-C 一起使用,且由于 Objective-C 在嵌入式設(shè)備和 AR/VR 領(lǐng)域的應(yīng)用, Objective-C 開(kāi)發(fā)者的人數(shù)也上升了 50% 。
開(kāi)發(fā)者社區(qū)活躍人數(shù)
JetBrains 2021 年的 Swift/Objective-C 開(kāi)發(fā)者調(diào)研中,有 84% 的開(kāi)發(fā)者表示自己同時(shí)使用 Swift 和 Objective-C,其中已經(jīng)有 64% 的開(kāi)發(fā)者大部分代碼是 Swift。
JetBrains 開(kāi)發(fā)者調(diào)研:是否同時(shí)使用 Swift 和 Objective-C
調(diào)研中絕大部分開(kāi)發(fā)者(89%)并不使用 Swift 開(kāi)發(fā)服務(wù)端項(xiàng)目,Swift 更多還是應(yīng)用于客戶(hù)端開(kāi)發(fā)。
JetBrains 開(kāi)發(fā)者調(diào)研:是否使用 Swift 開(kāi)發(fā)服務(wù)端項(xiàng)目[9]
# 三方庫(kù)
對(duì)比 Java、Python 等語(yǔ)言,Swift 的三方庫(kù)數(shù)量并不算很多。目前因?yàn)?CocoaPods 有索引功能,仍有大量開(kāi)發(fā)者使用 CocoaPods 來(lái)管理項(xiàng)目依賴(lài)且短期內(nèi)不會(huì)用 SPM 替換 [9]。CocoaPods 上共有 9 萬(wàn)多 Swift 和 OC 的庫(kù),其中搜索 Swift 的結(jié)果為 1 萬(wàn)多 。
JetBrains 開(kāi)發(fā)者調(diào)研:使用什么工具管理依賴(lài)
另外雖然官方?jīng)]有提供三方庫(kù)注冊(cè)服務(wù),但 GitHub 有一個(gè)開(kāi)源項(xiàng)目 Swift Package Index,目前已收集了近 5000 個(gè) GitHub 上的 Swift 項(xiàng)目 [24],其中 json、cli 和 networking 等標(biāo)簽相關(guān)的倉(cāng)庫(kù)較多(剔除了不同系統(tǒng)、框架等相關(guān)標(biāo)簽)。
Swift Package Index 中的倉(cāng)庫(kù)相關(guān)標(biāo)簽
2016 年至今每年新建的庫(kù)數(shù)量并沒(méi)有明顯增長(zhǎng),甚至 2021 年、2022 年新建的庫(kù)數(shù)量有所減少,不過(guò)其中約 70% 庫(kù)倉(cāng)庫(kù)今年仍有過(guò)活躍行為。
Swift Package Index 中的倉(cāng)庫(kù)創(chuàng)建年份
# 應(yīng)用#
# 官方應(yīng)用
根據(jù)開(kāi)發(fā)者 Timac 關(guān)于蘋(píng)果使用 Swift 和 SwiftUI 的分析報(bào)告 [25],iOS 15 中二進(jìn)制文件共 4738 個(gè),其中使用了 Swift 的二進(jìn)制文件共 607 個(gè)(占比 13%),使用了 SwiftUI 的二進(jìn)制文件共 114 個(gè)(占比 2%),使用最多的語(yǔ)言仍然是 Objective-C,占比 89%。對(duì)比 iOS 14 中,使用了 Swift 的二進(jìn)制文件占比為 8.4%,使用了 SwiftUI 的二進(jìn)制文件占比僅為 1%,占比均有所提高。
iOS 系統(tǒng)中二進(jìn)制文件使用編程語(yǔ)言情況
iOS 系統(tǒng)的編程語(yǔ)言仍然以 Objective-C 為主,且短時(shí)間內(nèi)不會(huì)完全替換,但蘋(píng)果官方對(duì)于 Swift、SwiftUI 的應(yīng)用在不斷加速,iOS 15 中常用應(yīng)用如 App Store、Health、分屏等已開(kāi)始使用 Swift,其他如 Books、Maps、Notes 等已開(kāi)始使用 SwiftUI。Swift 基本上還是會(huì)和 Objective-C 一起使用,還不能完全剔除 Objective-C。
在 macOS 中,也可以非常明顯地看到應(yīng)用 SwiftUI 的增長(zhǎng),從 Monterey 到 Ventura,使用了 SwiftUI (可能同時(shí)使用了 AppKit)的比例從 4% 上升到了 10% 。
macOS 系統(tǒng)中三種 UI 框架的使用占比
整體來(lái)看,蘋(píng)果官方的策略是從風(fēng)險(xiǎn)較低的少量應(yīng)用開(kāi)始試驗(yàn),隨著每次系統(tǒng)更新和 Swift、SwiftUI 的演進(jìn),使用比例在不斷加大。
# 第三方應(yīng)用使用 Swift 情況
2019 年到 2021 年,國(guó)內(nèi) Top 100 的免費(fèi)應(yīng)用中,Swift 混編應(yīng)用的占比從 22% 上升到了 78%;國(guó)外 Top 100 的免費(fèi)應(yīng)用中,Swift 混編應(yīng)用的占比一直較高,2019 年已有 78%,2021 年達(dá)到了 82.3% 。
國(guó)內(nèi)外 Top 100 應(yīng)用中 Swift 混編應(yīng)用占比的變化趨勢(shì)
國(guó)內(nèi)互聯(lián)網(wǎng)頭部廠商基本上都已經(jīng)支持 Swift,但也不能代表未來(lái)將轉(zhuǎn)型 Swift 技術(shù)。Swift 混編應(yīng)用占比迅速提高的原因可能是受 2020 年新增的 WidgetKit 導(dǎo)致的,開(kāi)發(fā)者若要提供應(yīng)用小組件則必須使用 Swift 相關(guān)技術(shù) [27]。
# GitHub 開(kāi)源項(xiàng)目
2016 年至 2021 年,GitHub 上 Swift 開(kāi)源項(xiàng)目每年新增數(shù)量變化不大,基本在 15000 至 20000 之間。GitHub 上 Swift 開(kāi)源項(xiàng)目增長(zhǎng)呈現(xiàn)的平穩(wěn)趨勢(shì)和前文 Swift 三方庫(kù)增長(zhǎng)、Swift 在 Stack Overflow 的討論度變化基本一致,后續(xù) Swift 大概率會(huì)逐步替換現(xiàn)有代碼,有穩(wěn)定的市場(chǎng)份額,但暫無(wú)大規(guī)模爆發(fā)的契機(jī)。
GitHub 上 Swift 開(kāi)源項(xiàng)目每年新增數(shù)量
*數(shù)據(jù)來(lái)源:GH archive
# 總計(jì)#
Swift 已經(jīng) ABI 穩(wěn)定,語(yǔ)言本身基本完善。作為 Objective-C 的替代產(chǎn)品,與 Objective-C 兼容,足夠安全、高性能,且易于學(xué)習(xí)閱讀,下限低而上限高;同時(shí)有蘋(píng)果官方的支持,官方系統(tǒng)中每年使用 Swift 混編的原生應(yīng)用占比在逐年提升,官方發(fā)布的 SDK 也可能綁定使用 Swift。
但重要的框架 SwiftUI 還處于成長(zhǎng)階段,大部分場(chǎng)景 Swift 仍需要與 Objective-C 混編使用,很難單獨(dú)支撐起大型項(xiàng)目的搭建;三方生態(tài)發(fā)展緩慢,比如在服務(wù)端、機(jī)器學(xué)習(xí)、AR/VR 等領(lǐng)域都沒(méi)有長(zhǎng)足發(fā)展,目前基本還是應(yīng)用于客戶(hù)端開(kāi)發(fā)場(chǎng)景。
近幾年 Swift 的成長(zhǎng)不算快,應(yīng)用領(lǐng)域相對(duì)單一,暫時(shí)沒(méi)有爆發(fā)契機(jī),但在蘋(píng)果開(kāi)發(fā)者生態(tài)中會(huì)繼續(xù)穩(wěn)定發(fā)展,在官方支持下可以逐步替換 Objective-C。下一個(gè)機(jī)會(huì)點(diǎn)也許在蘋(píng)果新的設(shè)備,我們拭目以待。
審核編輯:劉清
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
137005 -
SWIFT
+關(guān)注
關(guān)注
0文章
116瀏覽量
23806 -
WWDC
+關(guān)注
關(guān)注
0文章
139瀏覽量
19462
原文標(biāo)題:Swift 生態(tài)發(fā)展之路
文章出處:【微信號(hào):編程語(yǔ)言Lab,微信公眾號(hào):編程語(yǔ)言Lab】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論