[Jollen's AFC] 1.2 C & Object-oriented

jollen 發表於 April 8, 2012 12:11 PM

Linux 核心是 implicit of object-oriented 的典型實例。例如,在開發驅動程式的過程中,雖然不需要特別了解驅動程式的物件導向架構,但其架構則是依循嚴謹的物件導向觀念。Linux 核心與驅動程式,都是以 C 語言實作。

另外一個例子,就是筆者在 Android Framework & HAL 課程中所提到的 HAL Stub 觀念。HAL Stub 可採用 C 語言實作,編譯後以 *.so 形式佈署,但它不是程式庫(Library),而是一個物件(Object)。


圖1.2 HAL Stub 架構

HAL 的模組稱為 Stub,Stub 是一種物件。Stub 在軟體工程領域代表「樁」的角色,也就是整體架構中的一小段基礎程式碼,這段程式碼有著以下二個特色:

1. 符合架構的程式碼(打地基)
2. 一段程式碼範本,最終的實作 (final implementation) 是代理人 (proxy) 的角色

但是,Android 將上述的物件導向封裝得非常好,不需要懂這些架構面的觀念,也能依循「步驟」實作出基本的 HAL Stub。

在軟體裡加上自已的實作,最重要的第一門課就是練習寫「樁」,也是打地基的程式碼。所以,我們要知道 Android 的整體架構,並依循其架構,設計並實作自已的 HAL Stub。由此可知,從事 Android 軟體整合開發,重要的背景知識是物件導向、軟體工程與 HAL 架構,而不是硬體的知識。另外,還有很重要的背景知識,就是如何以 C 語言實作物件導向設計。

步驟性的知識可以解決部份的工程(實作)問題,但因為缺乏系統性的觀念,將會影響解決整體性問題的能力。這就是「隱性物件導向」的概念,大部份我們接觸過的軟體,都是嚴謹的物件導向設計,只是因為它被封裝得很好,所以常常會忽略它,或是認為它不存在。

有一種誤解,可以說明這個現象。有些工程師,會誤以為使用 C 語法實作的軟體,並不是物件導向的架構,實則不然。Linux 核心便是一個很好的例子。Axel-Tobias Schreiner 在 1993 年發表了著作「Object-oriented programming with ANSI-C」,解釋了如何使用標準 C 語言 (ANSI C) 撰寫物件導向程式碼;國外有些大學,甚致將這個科目列為必修課。

因此,C 語言是隱性的物件導向程式碼,因為它不像 C++ 或 Java,有著明顯的物件導向語法特徵。這點對於研究工作其實是個麻煩,因為 C 語言沒有鮮明的物件導向語法,所以經常需要花費時間,來探索隱藏其中的物件導向設計。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw