給Objective-C的“悼詞”
Aaron Hillegass 是知名的 Objective-C 開發者和布道者,他于 90 年代在 NeXT 公司工作,后來專注技術布道,是 Big Nerd Ranch 的創始人兼 CEO。他撰寫了多本 Objective-C 書籍,在蘋果發布 Swift 后,目前他開始將布道重心轉向 Swift。
在 6 月 8 日舉辦的 AltConf2015上,他向與會者做了《給 Objective-C 的悼詞》的演講,回顧了 Objective-C 的發展和它的影響,但在最后他話鋒一轉,說明了為什么 Objective-C 沒有真正死亡。
回顧 Objective-C 的發展歷程
要回顧 Objective-C 真正的起源,我們需要從 1962 年談起。在那個連互聯網都沒有的年代,在 NR 計算中心的兩個小伙為了改善 ALGOL,創造了 Simula,并在 1967 年發布了 Simula-67. 它第一次使用了點式語法,從此你使用對象方法就用小圓點去調用了。
稍后,Smalltalk 團隊開始打造另外一個面向對象語言,到 1980 年他們推出了“標簽:變量”風格的語言 Smalltalk。Smalltalk 做了很多超前的事情,它不僅僅是一個語言,還包括一個完整的操作系統。方括號也是它引入到編程語言中的,Smalltalk 使用它處理變量,Objective-C 則用它來放置消息。
研發 Smalltalk 的那群人后來去了施樂帕洛阿圖研究中心,繼續鼓搗他們感興趣的東西。
Smalltalk 十分超前,對后來者有很大的影響,但它的問題在于,使用 Smalltalk 需要完全拋棄以前的東西,并需要你成為它的一部分,這無論對于開發者還是用戶都不是很友好。
后來一個叫 Brad Cox 的人來了,他認為與其進行語言革命,不如進行漸進式的創新。他拿一個大家熟悉的系統級編程語言,然后給它加上面向對象的 Smalltalk 風格的消息傳遞,這就是 Objective-C 的由來。Brad Cox 在他的書籍《Object-Oriented Programming: An Evolutionary Approach》中解釋了這些。
Brad Cox 和 Objective-C 的聯合創始人 Tom Love 為這門語言創建了公司以專門支持它,這就是 Stepstone。但是,Stepstone 版本的語言僅僅是一個C語言的預處理器或者說編譯器,它會將消息傳遞轉換為C語言的函數。此時它還沒用引用計數等功能,其標準庫為 ICpak 210.
此時它也并不叫 Objective-C,等到 NeXT 從 Stepstone 購買下這個語言的商標時,它才改名叫“Objective C”,并且加入了點式語法。
NeXT 將 Objective-C 作為它編寫 GUI 的工具,毫無疑問這是物盡其用的,因為 GUI 天生適合使用面向對象的語言來編寫——GUI 里的控件就是一個一個的對象。
NeXT 的 GUI 系統包含一個 PostScript 服務器,里面都是用 Objective-C 編寫的 GUI 對象。不過當時的系統還很粗糙,當項目逐漸變大后出現了很多問題。
此時 Scott Ritchie、Steve Naroff、Blaine Garst 等人出來拯救世界。他們給 Objective-C 帶來了更多的特性和更好的性能。諸如 blocks、動態機制、緩存機制等特性都是他們創造的。
Objective-C 的先進性
由于引入了 Smalltalk 中的很多理念和特性,在那個年代,Objective-C 在很多方面很先進,甚至超越時代。
Objective-C 的一個美妙的地方是它的動態特性。這給我們帶來很多好處。比如在很早的時候它就有內省(introspection),但直到 Java 出了這個 API 并給它命名之后我們才知道它是什么;然后是弱類型,最初所有變量的類型都是 id 對象,后來才稱這種類型為 NSArray*,它對于 unarchiving 和 target-action 模式很有用;然后是 isa-swizzling,faulting 機制就是利用它來提高性能;以及在運行時創建類的能力,雖然一般編程中很少用到,但 KVO 正是依靠了這個機制。
另外還有一個特性現在人們認為非常好,但當時認為簡直是瘋了,那就是 category。它改變了我們編程的方式,以及對 frameworks 的看法,不過因為它違反了當時人們認為的面向對象編程的教條,當時 Java 派的人不是很喜歡它。
對 Objective-C 的改進
自 Objective-C 被 NeXT 收購后,介紹 Objective-C 的書籍紛紛出爐。當時有《Objective-C: Object-Oriented Programming Techniques》和《Object-Oriented Programming and the Objective-C Language》,后者有 NeXT 出品,是當時介紹 Objective-C 最好的書籍。
當 NeXT 意識到語言中存在的問題后,它們開始重寫 OpenStep 操作系統,這次他們給 Objective-C 加上了引用計數、前綴、更多的類型等。OpenStep 還被授權給 Sun 公司使用,作為交易的一部分,OpenStep 需要以某種方式開源,于是他們創建了 GNUstep 項目,這是 OpenStep 的一個實現,繼承了 OpenStep 的大部分 API。
但是,改進后的 Objective-C 仍然存在問題,就是它的基類很脆弱,里面定義了大量的實例變量,導致后期無論是對基類進行修改還是另建基類都很困難。
Objective-C 2.0 的出現解決了這個問題,它還添加了快速枚舉、GC 以及后面的 ARC 等。但是,有些歷史遺留問題仍然沒有得到解決。
Swift 的出現
但是,無論如何改進,改變不了 Objective-C 已經存在幾十年的事實,有些歷史遺留問題無法解決,有些語言特性也已經落后時代。只有另起爐灶才能徹底消滅這些問題,而蘋果陷入有魄力去做這一件事。
Swift 相對于 Objective-C 是一個很大的進步,它的C語言風格更少,更加現代,因此我們可能會損失一些底層的編程能力,但它也給開發者工具帶來了更多創新的可能性,比如 Playgrounds。
但 Swift 也并不是毫無缺點,為了保持和 Objective-C 的互操作性,在有些地方不得不做妥協,蘋果在繼續發展 Objective-C 和徹底拋棄 UIKit 之間選擇了一條中間道路,這就是 Swift。
慢著,Objective-C 未死
但是,Objective-C 并沒有真正死亡,蘋果在 Objective-C 的庫上投入了很多,如 UIKit、AppKit、Foundation 等。所有蘋果軟件都基于 Objective-C 編寫,并且蘋果仍在積極的改進這門語言,比如最近添加的模板、non-nil 類型,毫無疑問 Objective-C 仍將在蘋果的生態系統中存在很長時間。
并且,Aaron Hillegass 認為,Objective-C 仍然是編寫與C/C++語言代碼交互的最佳選擇,Swift 更適合高級別一些的事情。
不過,就連 Aaron Hillegass 本人都轉向了 Swift 的布道,這說明 Swift 值得目前就投入精力去學習和研究。
Objective-C 自從 NeXT 時代開始,就深深打上了蘋果的烙印,它具體還能走多遠,還要看蘋果對它的支持,但至少目前,它還沒有死亡。