開放原碼架構設計:Glib 小談 (1)

jollen 發表於 May 25, 2007 10:31 AM

前言

就程式碼內部的組織來說,以往我們經常重新定義一些基本的東西,並透過這些 're-defidition' 的巨集或函數(亦稱為 wrapper function)來撰寫程式。有時,也能透過重新定義的方式,將框架(framework)的實作隱藏起來。這種技巧,大量被應用在許多軟體專案中。

Glib 小談

Glib 是 GTK+ 計畫下的「副產品」,Glib 原本主要是給 GTK+ 與 GNOME 使用,不過,現在也有越來越多的應用程式開始使用 Glib 來開發軟體。Glib 就本質來看,他提供一套重新定義過的 data type、event loop 框架、thread 框架、以及物件(object)系統。

Glib 以一種「宏觀」的方式,提供 C 語言一套高度可攜性、簡單易學且通用的工具庫(toolkit)。由於 Glib 實在太優異了,除了 GTK+ 與 GNOME 本身外,也有非常多的 Free / Open Source Software 也開始採用 Glib 來開發軟體。

Glib 主要提供的內容,以及使用 Glib 來撰寫程式時需要具備的核心觀念,簡單說明如下。

Data Type

Glib 提供一組簡單易用且可攜性佳的 data type 定義。例如,我們想要擺放身高的資料,那麼傳統的 ANSI C 會以 unsigned int 來宣告變數;但是,改用 Glib 來做的話,就要改用 guint 這個由 glib 提供的 data type 來宣告變數。

以 guint 來說,Glib 的內部實作為:

typedef unsigned int	guint;

雖然 Glib 仍以 ANSI C 的 data type 來定義 guint,但提供了高度可攜的 data type。

Event Loop

以前,如果您要規劃一套以事件驅動(event-driven)為主的應用程式框架(application framework),在 event loop 的設計上常會遭遇到許多困難;我想,對 Linux system programming 有經驗的朋友,也一定曾遇過「如何與硬體事件整合」的麻煩題目。

Event loop 的程式架構往往「長的很像」,所以我們以前常會思考,是否能寫出一套「萬用」的 event loop 框架;以後,只要是撰寫事件驅動程應用程式,就照著套用就好了!

Glib 把這個想法實現了。對於「core application」的支援,Glib 不僅提供一套宏觀且通用的 event loop 定義,連其他好用的技術也都一併定義完成了。

我們在規劃程式的核心架構時,經常使用的技術也都有包含在 Glib 的支援裡。除了 Event Loop 外,還包含:

  • Threads
  • Dynamic Loading of Modules,也就是 plug-ins 的功能。
  • Memory Allocation
  • IO Channels,也就是檔案、pipes 與 sockets 的功能。
  • Message Output and Debugging Functions,常常用 printf() 在做除錯嗎?Glib 也定義了一組通用的介面!
  • Message Logging

天啊!真是太好了,Glib 把以前常用的技術都「提出共通的部份」,讓我們更容易寫程式。

Threads

POSIX thread(亦稱為 pthread)是重要的 Linux user-space thread 函數庫,雖然 pthread 並無法做到所謂的「效能提昇」,但是因為 application framework 規劃的需要,因此還是被大量採用。以往,有鑑於 thread 的產生與管理經常都是「差不多」的程式碼,因此我也會定義一組屬於自己的 thread 通用 API,大部份都是以 macro 形式來定義。Glib 也提供一組彈性相當好、高度可移植且容易使用的 thread 介面,透過 Glib 的定義來實作 multi-threaded application 不但簡單,而且也很容易管理所有的 thread。 《待續》

來源: www.jollen.org

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

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