7

C ++などのオブジェクト指向言語に何を提供しますか?またはそれなしでGTK+を使用することはできませんか?

オブジェクトのGObject実装は、両方の例で同じコンパイラを使用していると仮定すると、実行可能ファイルのサイズと速度の点でC ++と同様の品質ですか?GObjectまたは、それが提供する追加機能のために遅くなるいくつかのトレードオフがありますか?

4

3 に答える 3

7

GObject(Windowsの世界ではCOMに少し似ています)は、言語間の相互運用性を念頭に置いて設計されたCAPIです。

これは、 C関数の呼び出しをサポートする任意の言語でGObjectを使用できることを意味しますが、これにより、どの言語からも真に再利用可能な非C言語でGObjectを作成することが非常に困難になります(たとえば、PythonでGObject派生クラスを作成する場合) 、Cでこのクラスのオブジェクトを使用するたびに、Pythonインタープリターを埋め込む必要があります)。

多くの言語(Python、Perl、JSなど)のバインディングの作成を半自動化することが可能であり、ここにGObjectの長所の1つがあります。これは、GObjectが提供するやや不透明なAPIを説明しています。これは、完全に理解するのが非常に難しいことを私は告白します。

残念ながら、C++言語にもうまく適合しません。GObjectsはC++クラスとささいな関係はなく、バインディングが利用可能であっても(Gtkmm)、「GObjectから継承する」C++クラスを簡単に記述して世界に公開することはできません。これにはCを書く必要があります。

[世界が必要とするのは、WindowsのC ++ Cxに少し似た、GObjectとの相互運用を容易にするC ++言語の拡張機能ですが、1)それは難しい作業であり、おそらくGCCを介して達成できます。プラグイン、および2)Gnomeの世界、または一般的にLinuxの世界ではC ++への勢いはありません(KDEは注目すべき例外です)。今のところ、Gtkmmバインディングで立ち往生しています。]

于 2011-11-05T14:13:35.527 に答える
3

ウィキペディアのGObjectに関する記事には、C++との比較が含まれています。彼らが言及していることのいくつかは、多重継承の欠如と信号の存在です。さらに、GObjectは、エクスポートされたC関数の名前がC ++とは異なり、選択したコンパイラに依存しないという事実から恩恵を受けています。したがって、GObjectを使用してオブジェクト指向ライブラリを開発する場合は、C++ライブラリよりもリンクする方がおそらく簡単です。

GObjectをターゲットとするValaプログラミング言語を見るのも興味深いでしょう。

于 2011-11-05T14:27:41.910 に答える
2

Vladが示唆することについて少し詳しく説明します。Cを支持する主なポイントは、ABIを標準化するという点で、コンパイラーまたは言語間の相互運用性を「可能」(保証)にすることです。これにより(単純化しすぎている場合はご容赦ください)、Cコンパイラまたは他の言語からの呼び出し元がエクスポートされたシンボルをどのように使用できるかについての保証が可能になります。したがって、GTK+が他のさまざまな言語(GTKmmのC ++を含む)にバインドされているのはなぜですか。後者は両方の世界で最高です。私見:GTK +の定評のあるAPIですが、C++の言語機能を備えています。

C ++にはまだ公式の標準ABIがありませんが、Aチームが取り組んでいるため、すべてが失われているわけではありません:https ://isocpp.org/files/papers/n4028.pdf

于 2016-02-12T09:35:08.163 に答える