前言
就程式碼內部的組織來說,以往我們經常重新定義一些基本的東西,並透過這些 '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