Swift 與 Objective-C

Swift 誕生背景:Chris Lattner 為什麼放棄 Objective-C?

開始 iOS 開發後,相信每個人都曾經好奇過:「Apple 明明已經很熟練地使用 Objective-C,為什麼還要特別重新打造 Swift?」

閱讀 5 分鐘
Swift 誕生背景:Chris Lattner 為什麼放棄 Objective-C? 封面圖

開始 iOS 開發後,相信每個人都曾經好奇過:「Apple 明明已經很熟練地使用 Objective-C,為什麼還要特別重新打造 Swift?」

我用 Swift 製作第一個 App 時,也覺得它的語法非常簡潔;但深入了解背後的故事後,才發現這段歷史相當有趣。

先說結論,Swift 是一門由一位名為 Chris Lattner 的工程師從 2010 年開始,幾乎獨自秘密打造的語言。目的在於從根本改善使用超過 30 年、幾乎原封不動的 Objective-C 之安全性問題。

今天就輕鬆聊聊 Swift 是如何走入世界的。


Swift 是什麼時候、由誰打造的?

Swift 的開發始於2010 年 7 月

主角是 Chris Lattner。這個名字可能有些陌生,但只要是開發者,其實每天都在使用他的作品。

他正是打造LLVMClang編譯器的人。這些都是支撐 Apple 開發工具底層的核心技術。

據說早期真的是 Lattner 一個人的專案。他利用下班後與週末的零碎時間,安靜地打磨設計,這段故事相當有名。

約從 2011 年開始,Apple 內部的其他工程師加入,專案逐漸成長為正式的團隊專案。

最後在2014 年 6 月的 WWDC正式公開。當天在場的開發者都大吃一驚,至今仍有人談起這段反應,因為沒有人預料到這場發表。

同年 9 月,Swift 隨 Xcode 6 正式發佈,任何人都能使用。


Chris Lattner 為什麼要取代 Objective-C?

最大的原因只有一個。

Objective-C 是在 1980 年代初期設計的語言,因此缺乏現代化的安全機制。

簡單來說,Objective-C 是「在 C 語言上加入訊息傳遞功能」的架構。它繼承了 C 的彈性,但這份彈性也可能帶來危險。

其中最具代表性的就是nil(空值)處理問題。

在 Objective-C 中,即使對 nil 物件傳送訊息,App 也不會當掉,只是什麼事都不會發生。

乍看之下很方便,但這其實是陷阱。因為由於缺少值而產生的錯誤會悄悄被掩蓋,最後在其他不相干的地方爆發。

Lattner 在打造 LLVM 與 Clang 的過程中,已經長期與 Objective-C 的記憶體安全性問題搏鬥。後來據說他得出了這樣的結論。

「與其持續修補既有語言,不如重新打造一門從一開始就阻止錯誤發生的語言。」

這種想法不只是找出錯誤,而是要讓錯誤本身變得不可能發生。


Swift 到底有哪些不同?

Swift 帶來的變化中,最具象徵性的就是**選擇型別(Optional)**概念。

它要求在語法層級明確標示「這個值可能是空的」,讓開發者一定要處理沒有值的情況。

看看下面的程式碼,就能清楚看出兩種語言在理念上的差異。

首先,Objective-C 即使遇到 nil 也會直接略過。

// name如果是 nil?什麼事都不會發生,安靜地繼續執行
NSString *name = [user fetchName];
NSUInteger len = [name length];  // 結果是 0, 很容易漏掉錯誤

相較之下,Swift 會直接要求開發者面對值可能不存在的情況。

// name是 String? 型別 — 型別明確表示值可能不存在
let name: String? = user.fetchName()
if let name = name {   // 只有在值存在時才安全使用
    print(name.count)
}

雖然只是短短幾行程式碼,卻完整呈現了「放任錯誤存在」與「阻止錯誤發生」的差異。

此外,Swift 兼具型別推論、簡潔語法與快速執行速度,因此廣受歡迎。順帶一提,Swift 的設計除了參考 Objective-C,也借鑑了 Rust、Haskell、Python、Ruby 等多種語言的優點。


Swift 後來發展得如何?

Swift 發表後迅速站穩了腳步。

簡單整理主要發展如下。

時間 事件
2010 年 7 月 Chris Lattner 開始開發
2014 年 6 月 在 WWDC 正式發表
2014 年 9 月 隨 Xcode 6 正式發佈
2015 年 12 月 以開放原始碼形式公開(Apache 2.0)
2017 年 1 月 Lattner 離開 Apple,轉往 Tesla 任職

有趣的是,這門語言之父 Lattner 在 2017 年離開了 Apple。之後 Swift 專案由 Ted Kremenek 接任負責人。

即使如此,Swift 至今仍穩居 Apple 生態系的核心語言。開放原始碼化後,也拓展到 Linux 與伺服器端領域。

即使 Lattner 離開後,Swift 仍持續成長
即使 Lattner 離開後,Swift 仍持續成長

一位工程師在週末安靜啟動的專案,竟成為全球開發者使用超過 10 年的語言,這件事讓我深受感動。

這是一門從「為什麼?」這個問題出發的語言,了解背景後,Swift 的每一個語法都會呈現不同的樣貌。

了解背景後再回頭看,連一行程式碼的解讀方式都會不同
了解背景後再回頭看,連一行程式碼的解讀方式都會不同

如果你剛開始學 Swift,只要確實理解選擇型別,就能逐漸掌握這門語言為什麼如此設計。希望今天的文章能成為你的第一步。


參考資料

延伸閱讀