Swift 與 Objective-C

Objective-C 歷史總整理:賈伯斯喜愛的語言故事(直到 NS 前綴的由來)

開始學習 iOS 開發後,一定會遇到一種語言:充滿中括號的陌生語法,以及 NSString 這類讓人摸不著頭緒的前綴。

閱讀 5 分鐘
Objective-C 歷史總整理:賈伯斯喜愛的語言故事(直到 NS 前綴的由來) 封面圖

開始學習 iOS 開發後,一定會遇到一種語言:充滿中括號的陌生語法,以及像 NSString 這樣讓人摸不著頭緒的前綴。

這就是 Objective-C。

第一次在舊有程式碼中遇到這種語言時,很容易納悶:「這到底是哪裡來的語法?」了解它的歷史後,程式碼看起來會完全不同。

先說重點:Objective-C 是在 1980 年代初期,將 Smalltalk 的物件概念加到 C 語言上所打造的語言。

而那個著名的 NS 前綴,來自史蒂夫・賈伯斯創立的 NeXT,其作業系統 NeXTSTEP。

這篇文章會帶你了解以下內容。

  1. Objective-C 的誕生背景(C + Smalltalk)
  2. NS 前綴的由來與技術原因
  3. 隨著 iPhone 到來的全盛時期
  4. 在 Swift 時代存活下來的原因

Objective-C 是如何誕生的?

1980 年代初期,有兩位名為 Brad Cox 和 Tom Love 的工程師。他們想要的是兩件事。

  • C 語言:速度快,但沒有物件導向概念
  • Smalltalk:優雅的物件導向語言,但速度太慢

因此他們提出了 Objective-C:在 C 上加上一層非常薄的物件導向層,同時完全不修改 C。

Objective-C 是 C 的嚴格超集合。

世界上所有 C 程式碼,不需修改就能直接成為有效的 Objective-C 程式碼。

用一小段程式碼看看它實際上是什麼樣子。

// 一般的 C 程式碼,同時也是原封不動有效的 Objective-C 程式碼
int sum = 1 + 2;

// Objective-C加上的: Smalltalk形式的訊息傳送(中括號)
NSString *text = [NSString stringWithFormat:@"總和 %d", sum];

上面兩行完全使用 C 語法,下面中括號的那一行就是 Objective-C 新增的全部內容。

它的身體來自 C,靈魂(物件模型與訊息傳送)則來自 Smalltalk。中括號語法 [receiver message] 正是從 Smalltalk 繼承而來的遺產。

可以把它想成和 C++ 幾乎同一時期,使用相同材料(C + 物件導向)做出完全不同的料理。


NS 前綴代表什麼?

NS 前綴的真相,就在 NeXT 時代
NS 前綴的真相,就在 NeXT 時代

1985 年,史蒂夫・賈伯斯被自己創立的 Apple 趕了出去。

接著他創立了 NeXT,而這家公司的作業系統 NeXTSTEP,其官方開發語言正是 Objective-C。

NSStringNSArray 中的 NS,就是 NeXTSTEP 的縮寫。即使是 2026 年最新的 iPhone App 程式碼裡,也像化石般刻著 1980 年代末賈伯斯公司的名稱。

但為什麼非得加上前綴?這有技術上的原因。

  • Objective-C 沒有命名空間
  • 類別名稱必須在全域唯一,因此相同名稱相遇時就會發生衝突
  • 於是形成加上公司或專案縮寫的慣例(Apple 使用 NS,AFNetworking 使用 AF)

Apple 甚至正式說明:「兩個字母的前綴保留給 Apple,第三方請使用三個字母。」這是以文化補上語言缺口的案例。

Swift 引入了模組層級的命名空間,因此不再需要這項慣例。這就是沒有 NS 的 StringArray 成為 Swift 時代象徵的原因。


隨著 iPhone 到來的全盛時期

1996 年,Apple 以 4 億美元收購 NeXT,賈伯斯在 12 年後回歸。

NeXTSTEP 成為 Mac OS X 的骨架,而 Objective-C 也成為 Apple 的官方語言。

接著 App Store 在 2008 年開幕。能夠開發 iPhone App 的語言只有一種:Objective-C。

隨著全球開發者湧入,這個默默無名超過 20 年的語言,轉眼間成為最熱門的語言。

以語言人氣指標 TIOBE index 來看,它在 2012 年與 2014 年兩度獲選「年度語言」,一度升至僅次於 C 和 Java 的第三名。

App Store 初期,大家都是用這種語言開發 App
App Store 初期,大家都是用這種語言開發 App

Objective-C 現在還有人使用嗎?

2014 年 Apple 發表 Swift 後,Objective-C 的時代似乎即將落幕。然而十多年過去,這門語言仍未消失。原因有三個。

  1. Apple 系統框架:UIKit 與 Foundation 的根基依然是 Objective-C,因此 Swift 程式碼也會透過橋接與它們溝通。
  2. 舊有程式碼庫:數百萬行的大型 App 不可能一夜之間重寫,因此維護開發者的需求持續存在。
  3. 執行環境的動態特性:可以在執行期間替換方法,也就是方法調配,因此分析 SDK 仍然依賴這個執行環境。

Q. 現在還需要重新學 Objective-C 嗎?

幾乎不會有人用這門語言開始新專案。不過,如果你是處理老舊程式碼庫的 iOS 開發者,至少能讀懂它會是很大的優勢。

Q. 只懂 Swift 就夠了嗎?

新功能開發只懂 Swift 就足夠了。不過,了解 NS 的由來,以及中括號為何出現,會讓你更容易理解 Apple 的框架。


總結

Objective-C 不是死去的語言,而更像是一位準備退休的老將。它與賈伯斯一同在 Apple 外成長,又隨賈伯斯回歸,成為全球最有價值公司的一顆心臟。

下次在舊程式碼中遇到 NSString,請用親切的眼光看待它。那兩個字母承載了 40 年的歷史。

參考資料

延伸閱讀