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

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

このコミットは、Go言語の標準ライブラリの一部であった exp/wingui パッケージが、外部プロジェクト code.google.com/p/gowingui へ移管されたことを示しています。これにより、GoのコアリポジトリからWindows GUI関連の実験的なコードが削除され、独立したプロジェクトとして開発が継続されることになりました。

コミット

commit 5aee1f3a0facf301230609008a61618a44cf4363
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Wed Mar 7 17:48:09 2012 +1100

    exp/wingui: getting relocated to
    
    go get code.google.com/p/gowingui
    
    R=golang-dev, minux.ma, r
    CC=golang-dev
    https://golang.org/cl/5752067

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

https://github.com/golang/go/commit/5aee1f3a0facf301230609008a61618a44cf4363

元コミット内容

    exp/wingui: getting relocated to
    
    go get code.google.com/p/gowingui
    
    R=golang-dev, minux.ma, r
    CC=golang-dev
    https://golang.org/cl/5752067

変更の背景

このコミットが行われた2012年頃のGo言語は、まだバージョン1.0がリリースされたばかりの時期であり、言語としての安定化とエコシステムの構築が活発に進められていました。exp (experimental) ディレクトリは、Goの標準ライブラリに将来的に取り込まれる可能性のある、あるいは実験的な性質を持つパッケージを一時的に配置するための場所でした。

exp/wingui パッケージは、GoからWindowsのネイティブGUI API (WinAPI) を利用するための実験的なバインディングを提供していました。しかし、Goの設計思想として、特定のプラットフォームに強く依存するGUIライブラリを標準ライブラリに含めることには慎重な姿勢がありました。Goはクロスプラットフォームでの利用を強く意識しており、GUIツールキットは通常、OS固有の複雑な依存関係を持つため、標準ライブラリに含めるとそのポータビリティを損なう可能性がありました。

このような背景から、exp/wingui のようなプラットフォーム固有の実験的パッケージは、Goのコアリポジトリから切り離され、独立した外部プロジェクトとして開発を継続することが決定されました。これにより、Goの標準ライブラリはより汎用的なものに保たれ、特定のプラットフォームに特化した機能はコミュニティ主導の外部ライブラリとして発展していく道筋が作られました。gowingui プロジェクトへの移管は、この方針に沿ったものであり、Goのエコシステムが成熟していく過程における自然な流れと言えます。

前提知識の解説

Go言語の exp パッケージ

Go言語の初期には、exp (experimental) というプレフィックスを持つパッケージが標準ライブラリ内に存在しました。これらは、将来的に標準ライブラリに昇格する可能性のある、あるいは実験的な機能を提供するパッケージでした。しかし、Go 1の安定化に伴い、exp パッケージの多くは標準ライブラリから削除されるか、独立した外部リポジトリへと移管されました。これは、標準ライブラリの安定性と保守性を保ちつつ、実験的な開発はコミュニティ主導で行うというGoチームの方針によるものです。

WinAPI (Windows API)

WinAPIは、Microsoft Windowsオペレーティングシステムが提供するアプリケーションプログラミングインターフェース (API) の集合体です。Windows上で動作するほとんどのアプリケーションは、WinAPIを呼び出すことで、ウィンドウの作成、イベント処理、グラフィックス描画、ファイル操作など、OSの機能を利用します。WinAPIはC言語で記述されており、GoからWinAPIを呼び出すには、Goの syscall パッケージなどを利用してCの関数呼び出し規約に合わせたラッパーを作成する必要があります。

go get コマンド

go get は、Goのパッケージ管理ツールであり、指定されたURLからGoのソースコードリポジトリをダウンロードし、依存関係を解決し、必要に応じてビルド・インストールを行うコマンドです。このコミットメッセージにある go get code.google.com/p/gowingui は、gowingui パッケージがGoの標準ライブラリから独立した外部リポジトリとして提供されるようになったことを示唆しています。

Google Code

code.google.com/p/gowingui というURLは、かつてGoogleが提供していたオープンソースプロジェクトホスティングサービス「Google Code」を指します。2012年当時は多くのGo言語プロジェクトがGoogle Code上でホストされていました。Google Codeは2015年にサービスを終了し、多くのプロジェクトはGitHubなどの他のプラットフォームへ移行しました。

技術的詳細

このコミットの主要な技術的変更は、src/pkg/exp/wingui ディレクトリ以下のファイルが完全に削除されたことです。具体的には以下のファイルが削除されています。

  • src/pkg/exp/wingui/Makefile: wingui パッケージのビルド設定ファイル。
  • src/pkg/exp/wingui/gui.go: GUIアプリケーションのメインロジック、ウィンドウプロシージャ (WndProc)、メッセージループなどが実装されていたファイル。
  • src/pkg/exp/wingui/winapi.go: WinAPIの構造体 (Wndclassex, Point, Msg など) や定数 (WM_CREATE, WS_OVERLAPPEDWINDOW など) の定義、およびWinAPI関数のGo言語での宣言 (//sys コメントで定義され、mksyscall_windows.plzwinapi.go が生成される元となる)。
  • src/pkg/exp/wingui/zwinapi.go: winapi.go から mksyscall_windows.pl スクリプトによって自動生成されたファイルで、WinAPI関数への実際のシステムコール (syscall.Syscall) のラッパーが含まれていました。

これらのファイルの削除は、exp/wingui パッケージがGoの標準ライブラリから完全に切り離されたことを意味します。

また、doc/go1.htmldoc/go1.tmpl の2つのドキュメントファイルが更新されています。これらのファイルはGo 1のリリースノートやドキュメントの一部であり、exp/winguicode.google.com/p/gowingui へ移管されたことを明記するエントリが追加されています。これは、ユーザーが古い exp/wingui パッケージを探した際に、新しい場所を案内するための重要な情報です。

この変更は、Goの標準ライブラリのスコープを明確にし、特定のOSに特化した機能は外部ライブラリとして提供するというGoチームの戦略を反映しています。これにより、Goのコアはより軽量で汎用的なものに保たれ、GUIのような複雑な領域はコミュニティの貢献によって発展していくことになります。

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

このコミットでは、既存のコードの削除とドキュメントの追加が主な変更点です。

  • doc/go1.html および doc/go1.tmpl:

    • exp/winguicode.google.com/p/gowingui へ移管されたことを示す新しいテーブル行が追加されています。これは、Go 1のドキュメントにおいて、パッケージの移管情報を明確にするためのものです。
    --- a/doc/go1.html
    +++ b/doc/go1.html
    @@ -779,6 +779,10 @@ This table lists the old and new import paths:
     </tr>
     <tr><td>encoding/git85</td> <td>code.google.com/p/go.codereview/git85</tr>
     <tr><td>patch</td> <td>code.google.com/p/go.codereview/patch</tr>
    +<tr>
    +<td colspan="2"><hr></td>
    +</tr>
    +<tr><td>exp/wingui</td> <td>code.google.com/p/gowingui</tr>
     </table>
     
     <p>
    
  • src/pkg/exp/wingui/Makefile: ファイル全体が削除されています。

  • src/pkg/exp/wingui/gui.go: ファイル全体が削除されています。

  • src/pkg/exp/wingui/winapi.go: ファイル全体が削除されています。

  • src/pkg/exp/wingui/zwinapi.go: ファイル全体が削除されています。

これらの削除されたファイルは、exp/wingui パッケージを構成する主要なソースコードであり、Windows GUIアプリケーションの作成に必要なWinAPIのバインディングと基本的なGUIロジックが含まれていました。

コアとなるコードの解説

このコミットにおける「コアとなるコードの変更箇所」は、実質的に exp/wingui パッケージ全体の削除と、その移管を告知するドキュメントの追加です。

ドキュメントの変更 (doc/go1.html, doc/go1.tmpl)

これらのファイルはGo 1の公式ドキュメントの一部であり、Go 1リリースにおけるパッケージの変更点や移管先をまとめたテーブルが含まれています。このコミットでは、そのテーブルに exp/wingui エントリが追加され、code.google.com/p/gowingui へ移管されたことが明示されています。これは、Goのユーザーが古いパッケージを参照した際に、正しい情報にたどり着けるようにするための重要な変更です。

exp/wingui パッケージの削除

削除された exp/wingui パッケージは、GoからWindowsのネイティブGUIを扱うための実験的な試みでした。

  • gui.go: このファイルには、Windowsアプリケーションのエントリポイントとなる main 関数、ウィンドウプロシージャ (WndProc)、メッセージループ (GetMessage, TranslateMessage, DispatchMessage) など、基本的なGUIアプリケーションの骨格が実装されていました。ボタンの作成やイベントハンドリングの例も含まれていました。
  • winapi.go: WinAPIの構造体(例: WndclassexMsgPoint)や、ウィンドウメッセージ(例: WM_CREATEWM_CLOSE)、ウィンドウスタイル(例: WS_OVERLAPPEDWINDOW)などの定数が定義されていました。また、//sys コメントを使ってWinAPI関数のGo言語でのシグネチャが宣言されており、これらは mksyscall_windows.pl スクリプトによって zwinapi.go のような自動生成ファイルに変換されていました。
  • zwinapi.go: winapi.go//sys コメントに基づいて自動生成されたファイルで、WinAPI関数への実際のシステムコール (syscall.Syscallsyscall.Syscall6 など) を行うためのGo言語のラッパー関数が実装されていました。kernel32.dlluser32.dll といったWindowsのDLLから関数をロードし、Goの型とCの型の間で変換を行う役割を担っていました。
  • Makefile: zwinapi.go の生成プロセスや、パッケージのビルドに関する設定が含まれていました。

これらのファイルの削除は、Goの標準ライブラリがGUIフレームワークを直接提供しないという方針を明確にしたものであり、Windows GUI開発は gowingui のような外部ライブラリに委ねられることになりました。これにより、Goのコアはよりシンプルで、言語とランタイムの基盤に集中できるようになります。

関連リンク

参考にした情報源リンク

  • Go言語の exp パッケージに関する議論や歴史的背景 (GoのメーリングリストやIssueトラッカーのアーカイブ):
    • GoのIssueトラッカー (例: golang/go リポジトリの過去のIssueやPull Request)
    • golang-nutsgolang-dev メーリングリストのアーカイブ
  • WinAPIに関するMicrosoftの公式ドキュメント: https://learn.microsoft.com/en-us/windows/win32/api/
  • Go 1リリースノート (当時の情報): https://go.dev/doc/go1
  • gowingui プロジェクトに関する情報 (当時のGoogle Codeのページ、またはその後のGitHubなどへの移管先):
    • 当時の code.google.com/p/gowingui のスナップショットや、関連するブログ記事、フォーラムの議論など。
    • 現在のGoのGUIライブラリに関する情報 (例: fyne, walk, webview など) を検索することで、GoにおけるGUI開発の進化を理解する手助けになります。