位元詩人 [Objective-C] 程式設計教學:簡介

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

Objective-C 是基於 C 的物件導向編譯語言。原本這個語言是開發蘋果軟體的主力語言,在蘋果公司發布 Swift 後,Objective-C 的定位了出現一些變化。

我們在這裡先不動手寫程式。本文會對 Objective-C 做概念上的說明,討論 Objective-C 在蘋果系統及非蘋果系統的相關事項。

當前定位

Objective-C 語言本身依舊穩健,但考量到現今的開發生態系,它目前主要適用於以下情境:

  • 維護既有專案:承接與持續優化早期的 App。
  • 封裝底層 API:撰寫 C / C++ 橋接(Binding)層供 Swift 呼叫。

隨著 Apple 將核心資源全面挹注於 Swift,且網路上的社群範例與學習資源皆已改以 Swift 為主流,目前完全不建議使用 Objective-C 開啟全新專案。

至於 GNUstep,其定位更傾向於練習 Objective-C 語法的實驗工具。由於該生態系過於分眾,並不適合將其作為跨平台移植的目標或核心開發平台。

Objective-C 的用途

Objective-C 定位是應用程式語言,其用途如下:

  • 蘋果手機軟體
  • 蘋果桌面軟體
  • 蘋果物聯網軟體 (電視、手錶等)
  • (少見) 命令列工具
  • (少見) 非蘋果桌面軟體
  • (少見) 網頁程式

前三者是 Objective-C 的標準應用,很容易理解。除此之外,Objective-C 也可以當成通用型程式語言,撰寫其他層面的應用程式。但 Objective-C 在非蘋果平台的社群資源甚少,所以這方面的應用相對也少。

學 Objective-C 需要買蘋果電腦嗎?

如果學習 Objective-C 的目的是寫蘋果軟體賺錢,當然就得買蘋果電腦。但蘋果電腦相對高價,只是要拿來學程式設計的話太貴了。

假若只是想先學一下 Objective-C 本身,暫時沒有要寫蘋果軟體的話,可以先用 GCC 搭配 GNUstep 來學 Objective-C。GNUstep 在 Windows 或 GNU/Linux 上皆可免費取得。

Objective-C 真的落伍了嗎?與 Swift 的共生現況

雖然蘋果公司全力推動 Swift,且市場上的學習資源多向新技術傾斜,讓人容易產生 Objective-C 已經過時的錯覺。然而,現實開發中兩者依然長期並存。

這主要歸因於以下三個關鍵因素:

  • 龐大的既有資產:無數現存的 Apple 軟體與系統底層仍依賴 Objective-C API,為了更換語言而盲目重寫,並不符合商業與時間成本。
  • 語言成熟度的轉變:過去 Swift 在 5.0 版本之前,常因版本升級導致語法不相容;但如今 Swift 的 ABI 與語法早已高度穩定,當初的陣痛期已成過去。
  • 生態系的定位差異:Objective-C 在 Apple 平台上依然具備極高的穩定性與相容性。相較之下,Swift 雖然在 Apple 生態系大放異彩,但在非 Apple 平台(如伺服器端或跨平台開發)的普及率仍相對小眾。

因此,Objective-C 並非被立即淘汰,而是與 Swift 各司其職,共同建構現今的蘋果開發世界。

Objective-C 編譯器的歧異性

Objective-C 可用的編譯器是 Clang 和 GCC。在 Objective-C 的發展中,GCC 所提供的 Objective-C 特性落後於 Clang。這個現象應該會持續很長一段時間,不太會改變。

基本上,語法特性只是輔助寫程式的手段,這些特性本身不是目的,也不是最後的產出。不使用 Clang 所帶來的新特性的話,使用 Clang 或 GCC 都可以。

在蘋果平台寫 Objective-C 程式的話,一定是用 Clang 編譯 Objective-C 程式碼。這時候就可以放心地使用 Clang 所帶來的新特性。

Objective-C 的標準函式庫

原先 Objective-C 只是在 C 的基礎上外加物件系統,沒有自己的標準函式庫。現行實務是會搭配一套預寫好的 Objective-C 物件庫,不要重造輪子。常見的 Objective-C 物件庫有三種:

  • Cocoa
  • GNUstep
  • ObjFW

Cocoa 是蘋果系統提供的 Objective-C 物件庫。由於蘋果公司是 Objective-C 的實質維護者,Cocoa 可視為 Objective-C 的標準物件庫。

但 Cocoa 是僅限蘋果系統可用的專有 API。GNU 基金會在無法取得 Cocoa 的原始碼的前提下,儘可能地仿作 Cocoa API,其實作品就是 GNUstep 專案。由於 GNUstep 沒有商業公司支援,完全由志願開發者維護,其 API 落後 Cocoa 甚多。

ObjFW 則是另一套獨立開發的 Objective-C 物件庫。由於 ObjFW 和 Cocoa 或 GNUstep 使用相異的前綴,兩者可以在同專案中並存。

在 Objective-C 程式中可用的 C 標準

在 Objective-C 現存的編譯器中,不論是 Clang 或 GCC,對於 C 標準都支援得不錯。因此,在寫 Objective-C 程式時,大可放心地使用現代 C 語言 (C99、C11 等) 的特性來寫程式,不用刻意守在 ANSI C (C89)。

Objective-C++

Objective-C++ 並不是新的語言,而是混合 Objective-C 和 C++ 程式碼的模式。這個 Objective-C 方言的資料很少,連官網都把相關資料給下架了,只能在網路上找到零散的資料。

實際上只有在寫 C++ 函式庫的 Objective-C binding 會用到 Objective-C++。不建議在 Objective-C 主程式中混入 C++ 程式碼。因為 Objective-C++ 和原生 C++ 有一些差異,在 Objective-C 中使用 C++ 會受到額外限制。

把 Objective-C 當成 C 的物件系統

由於 Objective-C 和 C 是相容的,是否可以將 Objective-C 當成 C 的物件系統來使用?

理論上是可行的,不過實務面上會有一些問題。GNUstep 在 GNU/Linux 發行版間的支援不是那麼普遍。基礎物件庫的部分通常有支援,但圖形物件庫則不一定。

另外,GNUstep 的基礎物件庫 Foundation 不僅僅是 C 物件系統而已,還包了一大堆常用函式庫。即使只是編個 Hello World 程式,也會夾帶一堆 DLL 檔。或許有些開發者覺得這樣包山包海的物件系統太浪費系統資源。

實際上,可以只用 libobjc 函式庫寫物件,繞過整個 Foundation 函式庫。筆者在拙著中有一個章節展示了不使用 Foundation 的 Objective-C 基礎物件。有興趣的讀者可自行參考。

由於 Objective-C 是小眾語言,GNUstep 沒有的函式庫幾乎不會有開發者為其寫可用的 binding。要肯動手自己寫 binding 來用。

本系列文章方向

在本系列文章中,我們會以 Objective-C 的語法為主,不會接觸到 iOS 或 macOS 程式設計的部分,日後有機會或許再另開一個系列的文章。除了語法外,我們這系列文章會介紹如何建立 Objective-C 開發環境,分別針對 Cocca 和 GNUstep 兩種開發環境來介紹。

由於 Objective-C 是 C 語言的嚴格超集,合法的 C 程式碼也是合法的 Objective-C 程式碼。但 Objective-C 引入了一些新的特性,原本在 C 語言中會用到的手法就變得不適用。像是在 C 語言中時常用結構體 (struct) 模擬物件,但 Objective-C 有真正的類別 (class) 語法,就沒必要再用結構去模擬。

由於本網站已經有 C 語言的教程,和 C 重覆的部分,我們不會著墨太多。我們會專注在 Objective-C 特有的部分。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,喜歡用開源技術來解決各式各樣的問題。這類技術跨平台、重用性高、技術生命長。

除了開源技術以外,位元詩人喜歡日本料理和黑咖啡,會一些日文,有時會自助旅行。

近期在學習韓文,並將語言學習的心得轉化為開源專案,回饋社群。

這裡是位元詩人的 GitHub 個人頁