分类: LINUX
2009-03-19 15:28:14
前言
就程式碼內部的組織來說,以往我們經常重新定義一些基本的東西,並透過這些 '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 外,還包含:
天啊!真是太好了,Glib 把以前常用的技術都「提出共通的部份」,讓我們更容易寫程式。
Threads
POSIX thread(亦稱為 pthread)是重要的 Linux user-space thread 函數庫,雖然 pthread 並無法做到所謂的「效能提昇」,但是因為 application framework 規劃的需要,因此還是被大量採用。以往,有鑑於 thread 的產生與管理經常都是「差不多」的程式碼,因此我也會定義一組屬於自己的 thread 通用 API,大部份都是以 macro 形式來定義。Glib 也提供一組彈性相當好、高度可移植且容易使用的 thread 介面,透過 Glib 的定義來實作 multi-threaded application 不但簡單,而且也很容易管理所有的 thread。