美思 [Objective-C] 程式設計教學:簡介

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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

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

Objective-C 的當代意義

目前來說,Objective-C 的存在具有以下意義:

  • 蘋果生態圈的主力語言之一
  • 不太成功的跨平台語言
  • 為 C 加上 Smalltalk 風格的物件系統

原本 Objective-C 是開發蘋果軟體的唯一標準,現在則和 Swift 並列為官方選項之一。按照目前蘋果公司規畫的方向,不會繼續為 Objective-C 新增語法特性,但龐大的 Objective-C API 也不是說停就停的。所以 Objective-C 仍然是可用的技術。

在非蘋果平台上,可以用 GCC 搭配 GNUstep 撰寫 Objective-C 程式。但 Objective-C 的編譯器和標準物件庫在不同平台間的歧異性,讓 Objective-C 很難像 C++ 般成為實用的跨平台物件導向語言。

在非蘋果平台上推廣 Objective-C 對蘋果公司沒什麼實質好處,可想而知蘋果公司不會投入資源去做這件事。所以 Objective-C 開發工具在異質平台間的不相容現象也不會消除。

Objective-C 的特色是為 C 帶來 Smalltalk 風格的物件系統。但語法特性甚少成為程式語言成功的因素。程式語言的運行環境及實務應用才會決定該語言是否受到程式設計者的青睬。

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 已經落伍了,Swift 才是新鮮貨。

然而,大量現存蘋果軟體依頼著蘋果系統的 Objective-C API,只為了換語言就重寫軟體是浪費時間。所以,會有很長一段時間是 Objective-C 和 Swift 並存的狀態。

此外,Swift 的語法特性尚未穩定。在 Swift 5 之前,每次的大版本號變動都帶來不相容的改變。Swift 程式設計者只得耗費無謂的時間修改程式碼。不穩定的語言也不利於推廣社群函式庫。

Swift 官方團隊承諾 Swift 5 的 ABI 穩定性 (出處),可以關注一下。相對於 Swift,Objective-C 是穩定、立即可用的技術,在蘋果平台上不會有相容性議題。

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 特有的部分。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。