GObject
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/10/03 03:43 UTC 版)
利用
C言語とGObjectを使っているフリーソフトウェアプロジェクトとしては、GNOMEデスクトップ、GTKツールキット、GIMP画像編集プログラムなどがある。
GObjectを使ったアプリケーションはC言語で書かれていることが多いが、GObject自体はC++、Java、Ruby、Python、.NET/Monoなどのオブジェクトシステムともうまくマッピングできる。従って、GObjectフレームワークを使ったライブラリに言語バインディングを作るのは比較的簡単である。
しかし、C言語でGObjectのコードを書くのは若干大変である。特に高級オブジェクト指向言語に慣れたプログラマにとっては苦痛かもしれない。例えば、ちょっとしたサブクラスを書くだけで数百行のコードを必要とする。とはいうものの、GObjectを使うことでC言語でオブジェクト指向的なコーディングが可能となる。
一級オブジェクトは存在しないが(GTypeにはメタタイプがない)、GObjectアプリケーションは実行時にクラスやインタフェースのようなメタオブジェクトを生成でき、イントロスペクションもサポートできる。この機能は言語バインディング以外にGladeなどのGUI設計アプリケーションで使われ、GObjectクラスを提供する共有ライブラリをロードし、そのクラスの全プロパティの一覧を獲得し、型情報とドキュメンテーション文字列を完成させるといったことが可能となる。
他のオブジェクトシステムとの比較
GObjectはC言語での完全なオブジェクトシステムであり、C言語から派生したC++やObjective-Cと同等のものと見ることもできる(ただし、C++はオブジェクトシステム以外にも様々な機能がある)。C++とGObjectの明らかな違いは、GObjectが多重継承をサポートしていない点である。
もう1つの重要な違いは、C++やObjective-Cが独立した言語であるのに対して、GObjectは単なるライブラリであり、新たな構文やコンパイラ機能を追加しているわけではないという点である。例えば、GObjectベースのコードを書くとき、明示的な cast が頻繁に必要となる。従ってGObjectとC言語の組合せを通常のC言語とは別の言語と考えたとき、それはC++とは異なり、通常のC言語の厳密なスーパーセットとなっている。
C++コンパイラを対象とした標準ABIは存在しないので(例外としてWindowsではCOMがその役割を担っている)、あるC++コンパイラでコンパイルされたライブラリから、別のC++コンパイラでコンパイルされたライブラリを呼び出せないことがある。そのような互換性を必要とする場合、C++メソッドはC言語の関数としてエクスポートされる必要があり、C++のオブジェクトシステムが部分的に破綻する。原因の一部は、C++コンパイラがエクスポートするシンボルの一意性を保証するために、それぞれ独自に名前修飾しているためである。一方これとは対照的に、C言語にはオーバーロードも名前空間もないので、C言語ライブラリではエクスポートされるシンボルの一意性を保証するために明示的なプレフィックスを付けるのが一般的である。GObjectベースのライブラリはオブジェクト指向ではあるがC言語で書かれているので、コンパイラが何であっても明示的なシンボル名を使う。
おそらく最も意義のあるGObjectの特徴はSignal(他の言語ではイベントと呼ばれる)である。これは、GObjectがGUIツールキット向けに開発されたために必要になった機能である。他のオブジェクト指向言語にも同様の機能はあるが、GObjectではオブジェクトシステムそのものに組み込まれている。このため、GObjectアプリケーションはSignalを多用する傾向があり、GObjectのコンポーネントはC++やJavaよりもカプセル化とコードの再利用という面で優れている。
出典
- ^ GObject Reference ManualArchived 2007年7月3日, at the Wayback Machine.
- ^ GTypeArchived 2007年6月9日, at the Wayback Machine.
- ^ glib-mkenumsArchived 2007年8月12日, at the Wayback Machine.
- ^ GObject Builder
固有名詞の分類
- GObjectのページへのリンク