Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10467] ファイルの概要

このコミットは、Go言語の標準ライブラリの実験的パッケージ exp/gui および exp/gui/x11 を削除するものです。これらのパッケージは、x-go-binding.googlecode.com という別のプロジェクトへ移行されることが理由とされています。これにより、Goの標準ライブラリからGUI関連の実験的なコードが整理されました。

コミット

  • コミットハッシュ: dbb591d8da7e1958c40bc5ed631590029b94f764
  • 作者: Nigel Tao nigeltao@golang.org
  • 日付: Sun Nov 20 21:56:17 2011 +1100

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dbb591d8da7e1958c40bc5ed631590029b94f764

元コミット内容

exp/gui: delete exp/gui and exp/gui/x11. They are moving to
x-go-binding.googlecode.com.

R=rsc, rogpeppe
CC=golang-dev
https://golang.org/cl/5406041

変更の背景

この変更の背景には、Go言語の標準ライブラリにおけるパッケージの役割分担と、GUI開発の方向性に関する当時の議論があります。exp (experimental) パッケージは、Goの標準ライブラリに将来的に組み込まれる可能性のある、実験的な機能やAPIを提供するために存在していました。しかし、GUIツールキットのような大規模で複雑な機能は、標準ライブラリのコア部分に含めるには時期尚早である、あるいは特定のプラットフォーム(この場合はX11)に強く依存しすぎるという判断があったと考えられます。

コミットメッセージにある「They are moving to x-go-binding.googlecode.com」という記述は、これらのGUI関連コードがGoの公式リポジトリから切り離され、独立した外部プロジェクトとして開発が継続されることを示しています。これにより、Goの標準ライブラリはより軽量で汎用的なものに保たれ、GUI開発はコミュニティ主導の外部プロジェクトに委ねられる形となりました。

前提知識の解説

Go言語の exp パッケージ

Go言語の初期には、exp というプレフィックスを持つパッケージ群が存在しました。これらは「experimental(実験的)」の略で、Goの標準ライブラリに将来的に組み込まれる可能性のある、新しい機能やAPIを試すために用意されていました。exp パッケージのコードは、まだ安定しておらず、APIが変更される可能性がありました。十分に成熟し、安定したと判断されたパッケージは、exp プレフィックスを外して標準ライブラリに昇格するか、あるいはこのコミットのように外部プロジェクトとして独立するかのいずれかの道を辿りました。

X Window System (X11)

X Window System(一般にX11またはXと呼ばれる)は、Unix系オペレーティングシステムでグラフィカルユーザーインターフェース (GUI) を構築するための基盤となるシステムです。X11はクライアント・サーバーモデルを採用しており、アプリケーション(クライアント)がXサーバーに描画要求を送信し、Xサーバーが実際の描画処理や入力イベントの管理を行います。exp/gui/x11 パッケージは、Go言語からこのX11プロトコルを直接操作するためのバインディングを提供していたと考えられます。

x-go-binding.googlecode.com

x-go-binding.googlecode.com は、Go言語の初期におけるX Window Systemバインディングを開発するためのGoogle Code上のプロジェクトでした。Google Codeは、かつてGoogleが提供していたオープンソースプロジェクトのホスティングサービスです。このプロジェクトは、Go言語でX11アプリケーションを開発するための低レベルなAPIを提供することを目的としていました。exp/gui および exp/gui/x11 がこのプロジェクトに移行されたということは、GoのGUI開発が、より低レベルなX11プロトコルバインディングのレイヤーで進められることになったことを示唆しています。

技術的詳細

このコミットは、Go言語の標準ライブラリからGUI関連のコードを完全に削除するという、技術的に大きな決断を反映しています。削除されたファイルは、Go言語でX11ベースのGUIアプリケーションを構築するための基本的なインターフェース (gui.go) と、X11プロトコルとの通信を扱う低レベルな実装 (x11/auth.go, x11/conn.go) を含んでいました。

特に src/pkg/exp/gui/x11/conn.go は、X11サーバーとの接続、認証、イベント処理、画像描画(PutImage リクエスト)といった、X11クライアントの核心部分を実装していました。このファイルには、X11プロトコルの詳細なバイトオーダー処理(リトルエンディアン/ビッグエンディアン)、リクエストとレスポンスのパース、キーボードマッピングの取得、マウスイベントや露出イベントの処理などが含まれていました。

これらのコードが削除されたことにより、Goの標準ライブラリは、特定のGUIシステム(X11)への依存をなくし、よりプラットフォームに依存しない形で進化する道を選んだと言えます。GUI開発は、Goの標準ライブラリの範囲外で、より専門的な外部ライブラリやフレームワークに委ねられることになりました。これは、Go言語が当初から目指していた「シンプルさ」と「汎用性」を維持するための一環であったと考えられます。

コアとなるコードの変更箇所

このコミットでは、以下のファイルが削除され、src/pkg/Makefile が変更されています。

  • src/pkg/Makefile: exp/guiexp/gui/x11 への参照が削除されました。
  • src/pkg/exp/gui/Makefile: 削除されました。
  • src/pkg/exp/gui/gui.go: 削除されました。gui.Window インターフェースや KeyEvent, MouseEvent, ConfigEvent, ErrEvent などのGUIイベント構造体が定義されていました。
  • src/pkg/exp/gui/x11/Makefile: 削除されました。
  • src/pkg/exp/gui/x11/auth.go: 削除されました。Xauthorityファイルからの認証情報読み込みを扱っていました。
  • src/pkg/exp/gui/x11/conn.go: 削除されました。X11サーバーとの接続、プロトコルハンドシェイク、イベント処理、画像描画など、X11バックエンドの主要なロジックが含まれていました。

合計で6ファイルが変更され、811行が削除されています。

コアとなるコードの解説

削除されたファイルは、Go言語でX11ベースのGUIアプリケーションを構築するための基盤を提供していました。

  • src/pkg/exp/gui/gui.go: このファイルは、Go言語におけるGUIの抽象インターフェースを定義していました。Window インターフェースは、画面への描画、イメージのフラッシュ、UIイベントのチャネル提供、ウィンドウのクローズといった基本的なGUI操作をカプセル化していました。また、キーイベント、マウスイベント、設定変更イベント、エラーイベントといった、GUIアプリケーションが処理すべき様々なイベントの型も定義されていました。
  • src/pkg/exp/gui/x11/auth.go: X11サーバーへの接続には認証が必要です。このファイルは、Xauthorityファイル(Xサーバーへのアクセスを許可する認証情報を含むファイル)を読み込み、認証キーと値を抽出するロジックを実装していました。これにより、GoのGUIアプリケーションがXサーバーに安全に接続できるようになっていました。
  • src/pkg/exp/gui/x11/conn.go: このファイルは、X11プロトコルとの低レベルな通信を担う最も重要な部分でした。Xサーバーへのソケット接続の確立、プロトコルハンドシェイク(サーバーのバージョンやサポートするフォーマットの確認)、ウィンドウの作成とマッピング、グラフィックコンテキストの作成、そしてキーボードやマウスからの入力イベントの読み取りと処理、さらにはGoの image パッケージで作成された画像をXサーバーに描画するための PutImage リクエストの送信ロジックが含まれていました。特に writeSocket ゴルーチンは、Goの image.RGBA をX11のBGRXフォーマットに変換し、効率的に描画するためのバイト操作を行っていました。

これらのファイルの削除は、Goの標準ライブラリがGUIの低レベルな実装から手を引き、より高レベルな抽象化や、外部の専門的なGUIライブラリにその役割を譲るという方針転換を示しています。Makefile からの参照削除は、ビルドシステムからこれらのパッケージが完全に除外されたことを意味します。

関連リンク

参考にした情報源リンク

  • Go言語の exp パッケージに関する一般的な情報
  • X Window System (X11) プロトコルに関する一般的な情報
  • Google Code のアーカイブ情報 (x-go-binding.googlecode.com は現在アーカイブされており、直接アクセスはできませんが、当時のプロジェクトの性質を理解するために参照しました)
  • Go言語の初期のGUI開発に関するコミュニティの議論やドキュメント(一般的な知識として)