跳至內容

GObject

出自Taiwan Tongues 台語維基
於 2025年8月22日 (五) 13:35 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

GLib 東西系統,抑是講GObject,是一个佇咧 LGPL 落發布的自由軟體庫,伊提供一个輕便的物件系統並支援透明的多語言互通。GObject 予人設計做會當直接使用佇 C 程式當中,嘛會當去予人封裝至其他的語言,比如講 C + +,Java,Python,猶閣有會當生做 C 代碼的 Vala(遮大簡單喔 GObject 台碼的書寫)等咧。

歷史

GObject 干焦依賴佇咧 GLib 和 libc。伊是 GNOME 的基石並且佇 GTK +、Pango、輔助功能工具箱仔,佮大多數 GNOME 的進階庫佮應用程式中被廣泛使用。佇咧 GTK + 二孵空進前,GObject 代碼是 GTK + 的一部份。(這馬乎 GObject 這个名已經無佇咧 GTK + 著囉 ─ ─ 取代伊的基本類型叫做 ` GtkObject `。)

因為物件系統適用的範圍閣較闊,較有一般性,所以佇咧 GTK + 二嬸空發布的時陣,物件系統就分離出來矣,改囥到了另外一个函式庫。GtkObject 佇咧 Gtk 演進的過程里,大部份佮 GUI 無相關的部份攏徙去矣 GObject 里,造就了新的共享基礎類型 GObject 的誕生。對二空空二年三月十一號(也就是講 GTK + 二嬸空發布的日子)開始,GObject 就一直以一个分離的函式庫的形式存在。GObject 函式庫這馬予真濟非 GUI 的程式,像命令列應用程式、侍服器應用程式等等,所使用。

佮 GLib 的關係

雖然 GObject 有屬於伊家己的文件集,佮獨立的函式庫,但是原始彼个碼煞是佇咧 Glib 的原始碼仔樹仔內底,並且佮 GLib 做伙發行。所以,GObject 使用佮 GLib 仝款的版本號碼,而且一般 Linux Distro 的做法嘛是共 GObject 包佇 GLib 內底(比如講伊,Debian 共 GObject 囥佇咧 libglib 二零套件家族內底)。

類型系統

GObject 框架的基層主要倚靠泛型佮動態型別,這號做 GType。GType 系統保留所有的物件執行時期描述以予 glue code 會當方便佮其他的語言做連結。類型系統會當處理任何單一繼承的類別架構佮非類別的型別,如無透明指標、字串佮各種長度的整數佮浮點數。

類型系統知影按怎複製、指派佮釋放屬於啥物已經註冊類型的值。這對像整數這款毋是參照計數(reference-counted)彼型莫來講是足厚工碎的代誌,但是對其他是參照計數的複雜物件來講,是必要的。做類型系統複製一个參照計數的物件,伊干焦增加該物件的參照計數,對複製一个複雜、毋是參照計數的物件的時陣,著是以組態記憶體的方式建立副本。

這項基本的能力予實際做佇 GValue,GValue 是一个泛型容器的型別,內底會當用來儉註冊乎佇類型系統內底的型別的值。按呢的容器咧佮動態型別語言溝通時,特別有用。

基礎類型

無任何關聯類別類型予人號做是非類別的。遮的型別相當於根類別,也就是基礎類型,會當去予其他的類型繼承。

佇咧 GLib 二孵九 . 二搭,非類別的內建基礎類型有:

  • 空類型,對應著 C 的 void ( G \ _ TYPE \ _ NONE);
  • 對應著 C 的有號、沒有號 char、int、long 佮六十四位元整數 long long(G \ _ TYPE \ _ CHAR , G \ _ TYPE \ _ UCHAR , G \ _ TYPE \ _ INT , G \ _ TYPE \ _ UINT , G \ _ TYPE \ _ LONG , G \ _ TYPE \ _ ULONG , G \ _ TYPE \ _ INT 六十四 , and G \ _ TYPE \ _ UINT 六十四);
  • 布林類型(G \ _ TYPE \ _ BOOLEAN);
  • 列舉型別和 " 旗標 " 型別,攏對應著 C 的列舉類型,毋過後者干焦使用佇位元欄位(G \ _ TYPE \ _ ENUM and G \ _ TYPE \ _ FLAGS);
  • 單精度佮雙精度的 IEEE 浮點數,對應著 C 的 float 佮 double ( G \ _ TYPE \ _ FLOAT and G \ _ TYPE \ _ DOUBLE);
  • 字串類型,對應著 C 的 char \ * ( G \ _ TYPE \ _ STRING ) ;
  • 無透明指標,對應著 C 的 void \ *(G \ _ TYPE \ _ POINTER)。

類別內底起的基礎類型有:

  • GObject 實體的基底類別類型,標準類莫繼承樹頭的根(G \ _ TYPE \ _ OBJECT)
  • 基底介面類型,和基底這類別類型欲仝欲仝,但是標準介面繼承樹仔的根(G \ _ TYPE \ _ INTERFACE)
  • 包裝結構的類型,被用來包裝簡單的值物件抑是外來物件佇參照計數的 " 盒仔 " 內底(G \ _ TYPE \ _ BOXED)
  • " 參數規格物件的類型,用佇咧 GObject 內底做描述物件屬性的物件(G \ _ TYPE \ _ PARAM)。

會當予系統自動實體化的類型予人號做會當實體化(instantiable)。 遮的類型的一个重要特色就是實體的第一个位元組永遠包含一个指標,指向連結著該實體類型的類別結構(虛擬表格的表單)。 為此,任何會當予實體化的類型應該是類別。相對的是,任何非類別類型(像整數抑是字攕)必須愛是袂當實體化。另外咧,大部份類別類型是會當實體化的,但是某一寡類型,像介面類型,就毋是。

衍生類型

對內建 GObject 基礎類型衍生落來的,主要是有四種類型:

列舉類型佮 " 旗標 " 類型

一般來講,列舉類型抑是旗標其實攏是整數,以相對口語的單字來表示特定的數值,一般攏做為物件屬性的類型。GLib 提供矣 ` glib-mkenums ` 工具,來自動化產生的過程,並產生必要的代碼。

Boxed 類型

有一寡資料結構誠簡單,並無需要是一種類別。比如講伊,阮有一个類別,內底需要加一个 ` background-color ` 屬性,伊的值應該是某一个結構的實體,所以代碼看起來親像按呢:` struct color { int r , g , b ; } `。欲避免繼承矣 ` GObject ` 的話,咱會當建立一个 boxed 類型來呈現按呢的結構,並且提供複製佮釋放的處理函式予 GType。GObject 提供真簡便的方法,會當予你為 GLib 資料類型做包裝。

無透明的指標類型(Opaque pointer types)

有當時仔,物件是無需要複製嘛無需要作參照計數抑是釋放。這款的物件佇咧 GObject 內底,會當做無透明指標(` G _ TYPE _ POINTER `)。 通常予人用來參考著特定種類的物件。

類別佮介面類型

GObject 應用程式內底的大部份類型攏是類別,直接或者是接地繼承自根類別:` GObject `。是啊,GObject 內底嘛會使使用類似 Java 的介面(interface), 雖然真罕得去予人使用著。足少使用著的原因可能是因為介面是佇咧 GLib 二孵四(佇二空空四年三月十六日釋出)才加入去。GIMP 就有使用著 GObject 的介面。

訊息系統

GObject 訊息系統由兩个互補的部份所組成:closures 佮訊號。

Closures

GObject closure 是 callback(回呼)的一般化版本。支援現存已經用 C / C + + 抑是講其他的語言寫好的 closure(當提供結合的時陣)。 這允准以譬如講 Python 抑是 Java 等寫好的代碼去予 GObject closure 調用。

訊號

訊號(Signal)是 closure 被調用的主要機制。物件向類型系統註冊訊號 listener,咧予定的訊號佮定的 closure 間指定對應關係。做註冊的訊號被發出的時陣,對應的 closure 就會予人調用。佇咧 GTK + 內底,所有內定的 GUI 事件(像滑鼠移動佮鍵盤的動作)攏會為講 listeners 產生 GObject 訊號以進行運作。

類別實作

彼每一个 GObject 類別著愛包括至少兩个結構:類別結構佮實體結構。

類別結構

類別結構佮結構不止仔好 C + + 類別的 vtable。頭一个元素著愛是爸類別的類別結構。內底包含一組函式的指標,也就是類別的虛擬方法。囥佇遮的變數,就是像講 C + + 類別 const 抑是類別層級的成員。

實體結構

逐个物件實體攏會將會是這个實體結構的副本,仝款所在,頭一个元素,必須是實體結構的爸類別(這會當確保逐个實體攏有指標會當指向類別結構,所有的基礎類別嘛相𫝛), 佇歸入父類別了後,會當佇結構內底囥其他的變數,這个就佮 C + + 的成員變數。

C 結構無像 " public " , " protected " 抑是 " private " 等的存取層級修飾,一般的方法是借著佇咧實體結構內底提供一个指向私有資料的指標,照慣例稱作 \ _ priv。私有的結構會使宣告佇公有的表頭檔案內底,然後共實體的定義寫佇實作的檔案中,按呢作,對使用者來講,伊並毋知影私有資料是啥,猶毋過對實作者來講,煞會當真清楚的知影講。若私有結構嘛註冊佇咧 GType 內底,按呢物件系統就會自動幫伊組態空間。

GObject 框殼上蓋主要的不利點佇太過工課做大漢。親像手動定義的類型轉換巨集佮難解的型別註冊咒語等等的大量模板代碼攏是建立新類別所必要的。GObject Builder 抑是 GOB 二遮的工具咧試圖以提供模板語法來解決這个問題。以 GOB 二寫的代碼就愛事先處理過才會當編譯。另外咧,Vala 會當將 c # 的語法轉做 C,並且編譯出獨立的二進制檔。

用途

C 佮 GObject 的組合予人使用佇誠濟成功的自由軟體專案頂懸,像講 GNOME 桌面、GTK 佮 GIMP 影像處理軟體。

就算真濟的 GObject 應用程式完全以 C 來編寫,猶毋過 GObject 系統會當真好對應著真濟語言,像 C + +、Java、Ruby、Python 和 . NET / Mono 等等的原生東西系統。所以咧為已經咧用 GObject 框殼寫好的函式庫建立語言結束的時陣,通常較袂遐爾仔艱苦。

以 C 來編寫 GObject 代碼的時,煞是相對痛苦。學習曲線十分崎,有高階物件導向語言經驗的開發者可能會發現以 C 撰寫 GObject 代碼是誠無味。比如講伊,欲繼承一个類別(準做是繼承 GObject)可能就需要編寫和(抑是)複製攏上百行的款板代碼。雖然如此,袂使認真,GObject 會當做是 C 的代碼提供物件導向的功能。

GObject 應用程式咧執行時期為類別和介面所建立的元物件提供了互相操作的良好支援。可互相操作的能力予人使用佇咧語言結束起來,閣有使用者介面設計應用程式(如 Glade)上。Glade 允准載入提供放了 Widget(元件,衍生自 GObject)的函式庫,並且取得類別的屬性列表、伊的資訊佮檔案字串。

閣有其他的物件系統較

GObject 為 C 提供了近近的完整的東西系統,所以使用 C 語言配合 GObject,會使做使用其他按 C 分支出去的語言,像 C + + 和 Objective-C,的替代方案。(猶毋過 C + + 和 Objective-C 其實各人有真濟其他的特色,毋是干焦差佇咧物件系統。)  上明顯嘛上簡單的無仝,是 GObject 佮 Java 仝款,袂支援偌重繼承咧。

另外一个重要的無仝,GObject 干焦是一个函式庫,而且 C + + 和 Objective-C 的編譯器閣加額提供新的語法抑是特性。

就目前的 C + + 編譯器來講,並無標準的 ABI 會當佇所有的 C + + 編譯器運行(除了 Windows,Windows 上有 COM 會當處理), 以 A 這乎 C + + 編譯器所編譯出來的函式庫,並無一定會當予以 B C + + 編譯器所編譯的程式呼叫。若有需要這款的相容性,C + + 的方式必須愛輸出為 C 的函式,按呢就無法度享受 C + + 紮來的好處矣。這主要是因為無仝款的 C + + 編譯器使用了無仝款的名稱特殊處理(Name mangling)以確保輸出符號的獨一性。( 這是必要的,比如講伊,無仝的類別可能會有一項名稱的成員函式、被崁真濟改的函式名稱,抑是出現佇咧多個號名的空間但是仝名的函式,毋過佇宣輸出為目的檔時,遮的代碼攏是獨立的,若名稱攏仝款,會予人看做仝一份代碼,因此需要對名稱特殊處理。)對照 C 來看,C 無支援任何形式的覆載抑是名稱特殊處理,C 函式庫的作者永遠干焦會當使用真確的前置名以確保輸出名稱的全域獨一性。所以,以 C 撰寫的 GObject 基底的函式庫將袂有名稱特殊處理的問題,嘛袂受著編譯器的影響。

最後咧," 訊號 "(signal)會用講是閣較容易予人發現的相異點矣(佇咧其他的語言予人叫做事件)。 這當然是因為 GObject 上早予人設計用佇咧 GUI 工具箱仔頂懸。的呢有影,真濟物件導向語言攏已經有這个現成的訊號函式庫,猶毋過 GObject 是去予內底起佇咧物件系統內底的。所以,GObject 應用程式佮其他非 GObject 應用程式比起來,會向望去使用訊號來實作。這會使 GObject 元件,比較起來純純 C + + 抑是 Java 寫的元件,是閣較𠢕封裝,嘛容易予人去使用。毋過該注意的是,佇差不多所有的平台攏會當使用訊號,但是有時仔其實需要額外的函式庫支援,譬如講會當用佇 C + + 的 Boost . Signals 二。

參照

參見

  • Vala—是因為 GObject 的程式語言,具有 C # 語法佮到 C 源到源編譯器。
  • Genie—Vala 編譯器的會當代替的 Python 風格語法的解析器。

外部連結

  • The GObject Reference Manual(and tutorial)
  • GObject Tutorial Aug 兩千空四
  • GOB 二—the GObject Builder
  • Vala Homepage