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

    前言

    即使 Swift (西元 2014 年) 已經問世五年了,Objective-C 仍在蘋果 (Apple Inc.) 生態系中占有一席之地。本文來談談為什麼 Objective-C 仍然可以學習。

    為了事業 (for profit) 或純興趣 (for fun)

    相較於 C 或 C++ 或 Java 等主流語言,Objective-C 流行度沒那麼高。對於想學 Objective-C 的讀者,要想想自己為什麼要學 Objective-C?

    如果是為了事業上的需求,不論是要進入科技公司就職就是自行創業,Objective-C 目前最主要的用途仍是寫 iOS 和 Mac 程式。Mac 是 Objective-C 主要的平台,購買 Mac 主機算是基本的投資。

    相對來說,如果只是把 Objective-C 當成一個有物件系統的 C 語言來用,倒不急著買 Mac 主機。因為 GCC 可用來編譯 Objective-C 程式,在非 Mac 家族系統上也可以用 GNUstep 這個 Cocoa 框架的再製品來學 Objective-C 的物件庫。

    雖然 GNUstep 和 Cocoa 不完全相容,但其實對於學習 Objective-C 本身算是足夠了。此外,GNUstep 本身可以用來寫 GUI 程式,只是 GNUstep 相當小眾,會以 GNUstep 為主要運行環境做的程式人甚少。

    Objective-C 在不同平台間的差異

    Objective-C 本身沒有成為國際標準,目前能編譯 Objective-C 的編譯器是 Clang 和 GCC。Clang 對 Objective-C 做了不相容於舊版的更新,但 GCC 沒能跟上這些變化。所以,同樣的 Objective-C 程式碼,對不同編譯器來說可能是不相容的。

    此外,Cocoa 和 GNUstep 的 API 和運行期行為只能說是相近,也不完全相容。由於 Cocoa 本身是閉源軟體,無法藉由觀看其原始碼了解其內部實作。GNUstep 團隊只能藉由模仿和猜測去儘量貼近 Cocoa 的 API。

    由於 Objective-C 沒有真正的國際標準,目前 Objective-C 主流的方向應是以 Apple 系統為準。Apple 在官網上有 Objective-C 程式設計的文件。但在非 Apple 平台上練習 Objective-C 時,也應該查閱一下 GNUstep 的教學文件,以了解兩者的差異。

    為什麼要 Objective-C 仍然值得學?

    蘋果 (Apple Inc.) 長期的態勢應該是要用 Swift 完全取代 Objective-C,但是也不會一下子就把 Objective-C 的支援拿掉。

    Cocoa 本身的 API 就是使用 Objective-C 來撰寫,現在 AppStore 上至少有數以百萬計的應用程式依賴著 Objective-C 寫的 API,要把這些軟體以 Swift 來移植就不知道要花多少時間;只是為了換個語言就要大費周章移植,其實很不符合經濟效益。所以 Objective-C 至少還可以再吃好幾年。

    承上,除非我們自己剛好都只寫新專案或是寫興趣的,那當然可以直接用 Swift 來寫。但是,這種機會比較少,對於實際要上線的程式來說,多多少少還是有機會接手先前的專案,這時候就會用到 Objective-C 了。

    如果要混搭 C 或 C++ 的程式碼,現階段使用 Objective-C 還是會比 Swift 方便一些。另外,在同一個 iOS 或 Mac 專案中,可以混合 Objective-C 和 Swift 的程式碼,Objective-C 的知識不會變成完全無用。

    Swift 還在進化中

    相對於 Objective-C 來說,Swift 仍然是一個年輕的語言。表面上 Swift 的版本號來到 5.x 了,但 Swift 在每個大版本號之間都引入了一些不相容的改變,在換版本時得修改專案程式碼,代表 Swift 的語法特性其實還沒穩定下來。此外,Swift 的 ABI 也沒有穩定下來,故針對不同 Swift 版本所發布的套件無法交互使用。

    追逐不穩定的語言並不是真正的學習,說穿了這些版本間的不相容只是蘋果公司丟給開放者的技術債。如果沒有迫切需求,等 Swift 真正穩定下來再學習也不遲。Swift 開發團隊承諾在 Swift 5 之後其 ABI 會穩定下來,可以持續關心一下這方面的新聞。

    Objective-C 相當穩定

    Objective-C 在 2007 年發布 2.0 板後就沒有大的語法變動,代表 Objective-C 的語法相當穩定。對於穩定的技術,相關的知識才能夠累積。

    Java 已經來到 11 版 (西元 2018 年)了,但是使用 Java SE 6 (西元 2006 年) 的語法寫的程式仍然可以運行,只是少用了一些新的語法特性。Unix 終端機環境的操作邏輯 30 多年來幾乎沒有改變,只是這幾年增加一些新的指令和更動一些參數,同樣的知識可以在 Mac、GNU/Linux、FreeBSD 等類 Unix 平台間通用。

    同樣的,即使 Objective-C 沒有增加新的特性,仍然足以用來撰寫應用程式。另外,沒有加入新特性不代表棄置專案,只是會以維護 (maintenance) 模式為主。

    Objective-C 的物件系統

    撇除寫 iOS 或 Mac 程式這個實用性質的目的,Objective-C 有一套有趣的物件系統。由於 Objective-C 的目的是將 SmallTalk 的物件系統帶到 C 語言上,所以 Objective-C 延伸出來的新的物件語法其實是從 SmallTalk 的語法搬過來的。

    相較於 C++、Java、C# 等語言一脈相承的物件體系,Objective-C 的物件系統在行為上不太一樣,在學習時不妨相互比較一下。

    由於 Smalltalk 風格的語法相對少見,對於學過 C++、Java、C# 或其他語言的讀者來說,相當不習慣。的確一開始需要花一些時間適應,不過,Objective-C 是 C 語言的嚴格超集,對於物件之間和物件以外的程式碼刻意採用截然不同的語法,對於辨識程式碼反而容易。

    Objective-C 的物件庫

    Objective-C 當初在設計時,只是在 C 語言加上一層物件系統,沒有自己的標準函式庫。現階段程式設計師能用的就是 Cocoa (或 GNUstep) 這套準標準物件庫。此外,Objective-C 也沒有原生的套件格式或套件管理程式,要安裝函式庫只能手動安裝標頭檔和二進位檔,基本上是沿用 C 的函式庫的格式。

    近年來出現 CocoaPodsCarthage 這類由社群維護的套件管理程式,改善了 Objective-C 的套件管理議題。但這兩套軟體只能在 MacOS 上執行。由於目前 Objective-C 在非蘋果生態圈上相當小眾,大概也不會有開發者願意去開發這樣的軟體。

    由於 Objective-C 是 C 語言的嚴格超集,要使用 C 的第三方函式庫倒不會太困難。我們也可以自己寫個物件,包住相對應的 C 函式庫。在非蘋果系統上,沿用 C 函式庫應該是最快取得社群資源的方式。

    本系列文章方向

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

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

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

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤本站】
    Facebook Facebook Twitter Plurk