GTK/GTKプログラミング言語バインディング
表示
< GTK
はじめに
[編集]GTKは多くのプログラミング言語からアクセス可能です。各言語用のバインディングにより、ネイティブのように GTK を利用できます。
主要な言語バインディング
[編集]Python (PyGObject)
[編集]import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk class MyWindow(Gtk.Window): def __init__(self): super().__init__(title="Hello Python") button = Gtk.Button(label="Click Me") button.connect("clicked", self.on_button_clicked) self.set_child(button) def on_button_clicked(self, button): print("Hello World") app = Gtk.Application(application_id="org.example.myapp") window = MyWindow() window.present() app.run(None)
Rust (gtk-rs)
[編集]use gtk::prelude::*; use gtk::{Application, ApplicationWindow, Button}; fn main() { let app = Application::builder() .application_id("org.example.myapp") .build(); app.connect_activate(|app| { let window = ApplicationWindow::builder() .application(app) .title("Hello Rust") .build(); let button = Button::with_label("Click Me"); button.connect_clicked(|_| { println!("Hello World"); }); window.set_child(Some(&button)); window.present(); }); app.run(); }
JavaScript (GJS)
[編集]imports.gi.versions.Gtk = '4.0'; const { Gtk } = imports.gi; class MyWindow extends Gtk.Window { constructor() { super({ title: "Hello JavaScript" }); let button = new Gtk.Button({ label: "Click Me" }); button.connect('clicked', () => { print("Hello World"); }); this.set_child(button); } } let app = new Gtk.Application({ application_id: 'org.example.myapp' }); app.connect('activate', () => { let win = new MyWindow(); win.present(); }); app.run([]);
C++ (gtkmm)
[編集]#include <gtkmm.h> class MyWindow : public Gtk::Window { public: MyWindow() { set_title("Hello C++"); button.set_label("Click Me"); button.signal_clicked().connect( sigc::mem_fun(*this, &MyWindow::on_button_clicked)); set_child(button); } private: void on_button_clicked() { std::cout << "Hello World" << std::endl; } Gtk::Button button; }; int main(int argc, char* argv[]) { auto app = Gtk::Application::create("org.example.myapp"); return app->make_window_and_run<MyWindow>(argc, argv); }
Vala
[編集]public class MyWindow : Gtk.Window { public MyWindow () { Object (title: "Hello Vala"); var button = new Gtk.Button.with_label ("Click Me"); button.clicked.connect (() => { print ("Hello World\n"); }); this.set_child (button); } } void main (string[] args) { var app = new Gtk.Application ("org.example.myapp", ApplicationFlags.FLAGS_NONE); app.activate.connect (() => { var win = new MyWindow (); win.present (); }); app.run (args); }
バインディングの特徴比較
[編集]パフォーマンス
[編集]- C/C++: ネイティブパフォーマンス
- Rust: ネイティブに近いパフォーマンス
- Vala: 高パフォーマンス(Cにコンパイル)
- Python/JavaScript: インタプリタ言語のオーバーヘッド
開発効率
[編集]- Python: 高い生産性、豊富なライブラリ
- JavaScript: Webプログラマーに馴染みやすい
- Vala: GTK向けに設計された言語
- Rust: 安全性と高性能の両立
- C++: オブジェクト指向プログラミングの恩恵
メモリ管理
[編集]- Python/JavaScript: 自動ガベージコレクション
- Rust: コンパイル時メモリ管理
- C++: 手動メモリ管理(スマートポインタ利用可)
- Vala: 自動メモリ管理
バインディング固有の機能
[編集]Python (PyGObject)
[編集]- GObject Introspection による動的バインディング
- 豊富なサードパーティライブラリとの統合
- RADツールのサポート
Rust (gtk-rs)
[編集]- 型安全なバインディング
- パターンマッチングの活用
- ゼロコスト抽象化
JavaScript (GJS)
[編集]- GNOME Shell との統合
- モダンなJavaScript機能のサポート
- 非同期プログラミングの容易さ
C++ (gtkmm)
[編集]- テンプレートの活用
- STLとの統合
- シグナル/スロットの型安全な実装
Vala
[編集]- GTKに特化した言語機能
- コンパイル時の最適化
- GObjectシステムとの完全な統合
プロジェクト構成例
[編集]Python
[編集]myapp/ ├── __init__.py ├── main.py ├── window.py └── data/ └── ui/ └── window.ui
Rust
[編集]myapp/ ├── Cargo.toml ├── src/ │ ├── main.rs │ ├── window.rs │ └── config.rs └── resources/ └── ui/ └── window.ui
ビルドシステムの統合
[編集]Meson
[編集]project('myapp', 'cpp', version: '0.1.0', default_options: ['cpp_std=c++17']) gtk_dep = dependency('gtkmm-4.0') executable('myapp', 'main.cpp', dependencies: gtk_dep)
Cargo (Rust)
[編集][package] name = "myapp" version = "0.1.0" [dependencies] gtk = { version = "0.4", package = "gtk4" }
まとめ
[編集]GTKの言語バインディングは、各プログラミング言語の特性を活かしながらGTKの機能を提供します。プロジェクトの要件や開発チームのスキルセットに応じて、適切な言語バインディングを選択することが重要です。