[インデックス 19385] ファイルの概要
このコミットは、Go 1.3 リリースに関する公式ドキュメント doc/go1.3.html
の更新です。主に、Go 1.3 でサポートされるオペレーティングシステムとアーキテクチャの変更点について、その状態を正確に反映させるための修正が行われています。具体的には、Windows 2000 のサポート終了、DragonFly BSD の新規サポート、FreeBSD、NetBSD、OpenBSD、Plan 9、Solaris の各プラットフォームにおけるサポート要件の更新が含まれています。
コミット
commit 37323fe05e1f142ba81bc5071a2d23517fd7de95
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Sat May 17 06:54:05 2014 +0900
doc/go1.3.html: update the state of supported platforms
LGTM=r
R=golang-codereviews, aram, 0intro, gobot, r
CC=golang-codereviews
https://golang.org/cl/100490044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/37323fe05e1f142ba81bc5071a2d23517fd7de95
元コミット内容
このコミットは、Go 1.3 のリリースノートの一部である doc/go1.3.html
ファイルを更新し、Go がサポートするプラットフォームの最新の状態を反映させています。主な変更点は以下の通りです。
- Windows 2000 のサポートが正式に終了したことの明記。
- DragonFly BSD の実験的サポートが追加されたことの記述。
- FreeBSD のサポート要件(FreeBSD 8 以降、FreeBSD 10 の ARM プラットフォームでの要件、
COMPAT_FREEBSD32
フラグの必要性)の更新。 - NetBSD および OpenBSD のサポート要件(それぞれ NetBSD 6.0 以降、OpenBSD 5.5 以降)の追加。
- Plan 9 のサポート要件(
Tsemacquire
システムコール)の更新。 - Solaris のサポート要件(illumos または Solaris 11 以降)の更新。
これらの変更は、Go 1.3 のリリースに伴うプラットフォームサポートの進化を正確に文書化することを目的としています。
変更の背景
Go 言語は、その設計思想の一つとして、多様なプラットフォームでの動作を重視しています。しかし、オペレーティングシステムの進化、メンテナンスコスト、特定の機能の実装難易度などにより、サポート対象プラットフォームは常に変動します。このコミットは、Go 1.3 のリリースサイクルにおいて、以下の背景からプラットフォームサポートの状況を更新する必要が生じたために行われました。
- Windows 2000 のサポート終了: Microsoft が Windows 2000 のサポートを2010年に終了したことに伴い、Go ランタイムにおいても、例外処理(Unix におけるシグナルに相当)に関する実装上の困難さから、Go 1.3 でのサポートを終了することが決定されました。これは、古いOSの維持にかかるコストと、新しい機能開発へのリソース集中を考慮した結果です。
- 新規プラットフォームのサポート: DragonFly BSD のように、Go コミュニティからの要望や、特定のユースケースにおける需要に応える形で、新たなプラットフォームへの対応が進められました。これは、Go の適用範囲を広げ、より多くの開発者がGoを利用できるようにするための取り組みです。
- 既存プラットフォームの要件変更: FreeBSD のように、OS自体の進化や、Go ランタイムの内部的な変更(例: ARM プラットフォームでの EABI システムコールへの切り替え)により、Go を実行するためのOS側の最小バージョン要件やカーネル設定が変更されることがあります。これらの変更は、Go ランタイムの効率性や安定性を向上させるために必要となる場合があります。
- ドキュメントの正確性維持: Go の公式ドキュメントは、ユーザーがGoを適切に利用するための重要な情報源です。Go 1.3 のリリースに際し、サポートされるプラットフォームに関する情報を最新かつ正確なものに保つことは、ユーザーの混乱を防ぎ、スムーズな開発体験を提供するために不可欠でした。
このコミットは、Go 1.3 のリリースにおける重要な変更点の一つとして、Go ランタイムが動作する環境の範囲を明確にし、ユーザーに適切な情報を提供することを目的としています。
前提知識の解説
このコミットの変更内容を理解するためには、以下の技術的な前提知識が役立ちます。
- オペレーティングシステム (OS) の種類と特性:
- Windows 2000: Microsoft が開発した商用OSで、2000年にリリースされました。このOSは、Go 1.3 リリース時点では既にサポートが終了しており、現代的なOSと比較してセキュリティや機能面で制約があります。
- BSD (Berkeley Software Distribution) 系OS: Unix 系OSの一種で、FreeBSD, NetBSD, OpenBSD, DragonFly BSD などがあります。これらはそれぞれ異なる開発目標を持ち、特定の用途に特化しています。
- FreeBSD: 高性能で安定しており、サーバー用途で広く利用されます。
- NetBSD: 非常に高い移植性を持ち、多様なハードウェアで動作します。
- OpenBSD: セキュリティを最優先に設計されています。
- DragonFly BSD: FreeBSD 4.8 から派生し、SMP (Symmetric Multi-Processing) やクラスタリングに焦点を当てています。
- Plan 9 from Bell Labs: ベル研究所で開発された分散OSで、Unix の後継を目指しました。ファイルシステム中心の設計が特徴です。
- Solaris / illumos: Sun Microsystems が開発したUnix 系OSで、現在はオープンソース版の illumos が存在します。エンタープライズ環境で利用されることが多いです。
- Go 言語のクロスコンパイルとランタイム:
- Go 言語は、異なるOSやアーキテクチャ向けにバイナリを生成するクロスコンパイル機能を強力にサポートしています。
- Go ランタイムは、Go プログラムが実行される際に必要な低レベルの機能(ガベージコレクション、スケジューリング、システムコールインターフェースなど)を提供します。OSごとに異なるシステムコールを抽象化し、Go プログラムが共通のインターフェースでOS機能を利用できるようにしています。
- システムコール (syscall):
- アプリケーションがOSのカーネル機能(ファイルI/O、ネットワーク通信、メモリ管理など)を利用するためのインターフェースです。OSやアーキテクチャによってシステムコールの呼び出し規約や番号が異なります。
- EABI (Embedded Application Binary Interface): ARM アーキテクチャ向けのバイナリインターフェース標準の一つで、システムコールの呼び出し規約などを定義します。Go ランタイムが特定の EABI に準拠することで、その環境での互換性が確保されます。
Tsemacquire
システムコール (Plan 9): Plan 9 OSにおけるセマフォ操作に関連するシステムコールの一つと考えられます。Go ランタイムが Plan 9 で動作するために、このシステムコールが利用可能であることが要件となります。
- 例外処理とシグナル:
- プログラム実行中に発生する異常なイベント(エラー、割り込みなど)を処理するメカニズムです。
- Unix 系OSでは、シグナルがプロセスに送信されることで、特定のイベント(例: セグメンテーション違反、Ctrl+C)を通知し、プログラムがそれに対応するハンドラを実行できます。
- Windows の例外処理メカニズムは Unix のシグナルとは異なります。Go ランタイムがこれらのOS固有のメカニズムを適切に扱う必要があります。Windows 2000 の場合、この部分の実装が困難であったことがサポート終了の一因とされています。
COMPAT_FREEBSD32
フラグ (FreeBSD):- FreeBSD カーネルのコンパイルオプションの一つで、32ビットアプリケーションが64ビットシステム上で動作するための互換性レイヤーを提供します。Go の一部のコンポーネントや依存関係が32ビットのシステムコールを必要とする場合に、このフラグが重要になります。
- Google Native Client (NaCl):
- ウェブブラウザ内でネイティブコードを安全に実行するための技術です。Go は NaCl 向けにコンパイルされたバイナリを生成でき、ウェブアプリケーションの一部として高性能なGoコードを実行することを可能にします。
これらの知識は、Go ランタイムが各OSの特性やシステムコールインターフェースにどのように適応しているか、また、なぜ特定のOSのサポートが追加または削除されるのかを理解する上で不可欠です。
技術的詳細
このコミットにおける技術的な変更は、主に doc/go1.3.html
というドキュメントファイルの内容更新ですが、その背後には Go 1.3 ランタイムにおける各プラットフォームへの対応状況の具体的な技術的詳細が反映されています。
- Windows 2000 のサポート終了の技術的背景:
- コミットメッセージに「implementation difficulties regarding exception handling (signals in Unix terminology)」とあるように、Windows 2000 における例外処理のメカニズムが、Go ランタイムが期待するシグナル処理モデルと整合性が取れなかったことが主な理由です。Go ランタイムは、ガベージコレクションや goroutine スケジューリングのために、低レベルのシグナルハンドリングを多用します。Windows 2000 の古い例外処理APIでは、これらの Go ランタイムの要件を効率的かつ堅牢に満たすことが困難であったと考えられます。また、OS自体のサポート終了により、Go 開発チームがこの古いOS固有の問題に対応するためのリソースを割くことが非効率になったことも背景にあります。
- DragonFly BSD の実験的サポート:
- Go 1.3 で DragonFly BSD (amd64, 386) の実験的サポートが追加されました。これは、Go ランタイムが DragonFly BSD のカーネルインターフェース(システムコール、スレッドモデル、メモリ管理など)に適合するように調整されたことを意味します。実験的サポートであるため、まだ安定性やパフォーマンスの最適化が進行中である可能性を示唆しています。
- FreeBSD のサポート要件の詳細:
- FreeBSD 8 以降: Go 1.2 以降、FreeBSD 8 が最低要件となりました。これは、Go ランタイムが利用する特定のシステムコールやカーネル機能が FreeBSD 8 で導入されたか、安定したためと考えられます。
COMPAT_FREEBSD32
フラグ: Go 1.3 から、FreeBSD で Go を実行する際にカーネルがCOMPAT_FREEBSD32
フラグを有効にしてコンパイルされている必要があると明記されました。これは、Go のツールチェインやランタイムの一部が、32ビット互換のシステムコールインターフェースを必要とする場合があるためです。特に、64ビットシステム上で32ビットのGoバイナリを実行する場合や、特定のライブラリが32ビットのABIに依存している場合に重要となります。- FreeBSD 10 (ARM) と EABI システムコール: ARM プラットフォームでは、Go 1.3 から EABI (Embedded Application Binary Interface) システムコールへの切り替えが行われました。これにより、Go 1.3 は ARM 上の FreeBSD 10 でのみ動作するようになりました。EABI は、ARM プロセッサ向けのバイナリインターフェース標準であり、システムコールの呼び出し規約やデータ表現などを定義します。この切り替えは、ARM アーキテクチャにおける Go ランタイムの効率性や互換性を向上させるための重要な変更であり、古い FreeBSD バージョンとの互換性を犠牲にしてでも、より現代的なABIに準拠することを選択したことを示しています。x86 (386, amd64) プラットフォームは影響を受けません。
- NetBSD および OpenBSD のサポート要件:
- Go 1.3 は NetBSD 6.0 以降、OpenBSD 5.5 以降を必要とします。これは、これらのOSの特定のバージョンで、Go ランタイムが依存するシステムコールやカーネル機能が利用可能になったことを示しています。Go ランタイムは、各BSD系のOSの差異を吸収し、共通のGoコードベースで動作するように調整されています。
- Plan 9 のサポート要件:
- Go 1.3 の Plan 9 (386) サポートは、2012年6月以降に導入された
Tsemacquire
システムコールを必要とします。これは、Go ランタイムがセマフォ(並行処理における同期プリミティブ)を実装するためにこの特定のシステムコールを利用していることを示唆しています。Plan 9 の分散システムモデルにおいて、セマフォは重要な同期メカニズムであり、Go の goroutine スケジューラや並行処理モデルが Plan 9 上で効率的に動作するために不可欠です。
- Go 1.3 の Plan 9 (386) サポートは、2012年6月以降に導入された
- Solaris のサポート要件:
- Go 1.3 の Solaris (amd64) サポートは、illumos または Solaris 11 以降を必要とします。illumos はオープンソースの Solaris フォークであり、Go ランタイムがこれらの現代的な Solaris 系OSのカーネルインターフェースに適合するように設計されていることを意味します。特に、ZFS ファイルシステムや DTrace などの高度な機能との連携も考慮されている可能性があります。
これらの技術的詳細は、Go ランタイムが各OSの低レベルな特性(システムコール、メモリ管理、例外処理など)にどのように適応し、特定のバージョン要件がなぜ存在するのかを明確にしています。Go の「Write once, run anywhere」という目標は、これらのプラットフォーム固有の調整によって支えられています。
コアとなるコードの変更箇所
このコミットは、Go 1.3 のリリースノートの一部である doc/go1.3.html
ファイルのみを変更しています。Go ランタイムの実際のコードベース(Go言語で書かれた部分やアセンブリコードなど)には直接的な変更はありません。
変更されたファイル: /home/orange/Project/comemo/doc/go1.3.html
具体的な変更は、HTMLドキュメント内のテキストコンテンツとセクションの順序の調整です。
--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -14,7 +14,7 @@ precise garbage collection,
a major refactoring of the compiler tool chain that results in
faster builds, especially for large projects,
significant performance improvements across the board,
-and support for Solaris, Plan 9 and Google's Native Client architecture (NaCl).
+and support for DragonFly BSD, Solaris, Plan 9 and Google's Native Client architecture (NaCl).
It also has an important refinement to the memory model regarding synchronization.
As always, Go 1.3 keeps the <a href="/doc/go1compat.html">promise
of compatibility</a>,
@@ -24,6 +24,38 @@ will continue to compile and run without change when moved to 1.3.
<h2 id="os">Changes to the supported operating systems and architectures</h2>
+<h3 id="win2000">Removal of support for Windows 2000</h3>
+<p>
+Microsoft stopped supporting Windows 2000 in 2010.
+Since it has <a href="https://codereview.appspot.com/74790043">implementation difficulties</a>
+regarding exception handling (signals in Unix terminology),
+as of Go 1.3 it is not supported by Go either.
+</p>
+
+<h3 id="dragonfly">Support for DragonFly BSD</h3>
+<p>
+Go 1.3 now includes experimental support for DragonFly BSD on the <code>amd64</code> (64-bit x86) and <code>386</code> (32-bit x86) architectures. It uses DragonFly BSD 3.6 or above.
+</p>
+
+<h3 id="freebsd">Support for FreeBSD</h3>
+<p>
+It was not announced at the time, but since the release of Go 1.2, support for Go on FreeBSD
+requires FreeBSD 8 or above.
+</p>
+<p>
+As of Go 1.3, support for Go on FreeBSD requires that the kernel be compiled with the
+<code>COMPAT_FREEBSD32</code> flag configured.
+</p>
+<p>
+In concert with the switch to EABI syscalls for ARM platforms, Go 1.3 will run only on
+FreeBSD 10. The x86 platforms, 386 and amd64, are unaffected.
+</p>
+
<h3 id="nacl">Support for Native Client</h3>
<p>
@@ -36,43 +68,28 @@ how to set up the Go version is described <a href="http://golang.org/wiki/NativeClient">here</a>.
</p>
-<h3 id="solaris">Support for Solaris</h3>
+<h3 id="netbsd">Support for NetBSD</h3>
<p>
-Go 1.3 now includes experimental support for Solaris on the <code>amd64</code> (64-bit x86) architecture.
+As of Go 1.3, support for Go on NetBSD requires NetBSD 6.0 or above.
</p>
-<h3 id="plan9">Support for Plan 9</h3>
+<h3 id="openbsd">Support for OpenBSD</h3>
<p>
-Go 1.3 now includes experimental support for Plan 9 on the <code>386</code> (32-bit x86) architecture.
-</p>
-\n-<h3 id="win2000">Removal of support for Windows 2000</h3>
-\n-<p>
-Microsoft stopped supporting Windows 2000 in 2010.
-Since it has <a href="https://codereview.appspot.com/74790043">implementation difficulties</a>
-regarding exception handling (signals in Unix terminology),
-as of Go 1.3 it is not supported by Go either.
+As of Go 1.3, support for Go on NetBSD requires OpenBSD 5.5 or above.
</p>
-\n-<h3 id="freebsd">Support for FreeBSD</h3>
+<h3 id="plan9">Support for Plan 9</h3>
<p>
-It was not announced at the time, but since the release of Go 1.2, support for Go on FreeBSD
-requires FreeBSD 8 or above.
+Go 1.3 now includes experimental support for Plan 9 on the <code>386</code> (32-bit x86) architecture. It requires the <code>Tsemacquire</code> syscall, which has been in Plan 9 since June, 2012.
</p>
-<p>
-As of Go 1.3, support for Go on FreeBSD requires that the kernel be compiled with the
-<code>COMPAT_FREEBSD32</code> flag configured.
-</p>
+<h3 id="solaris">Support for Solaris</h3>
<p>
-In concert with the switch to EABI syscalls for ARM platforms, Go 1.3 will run only on
-FreeBSD 10. The x86 platforms, 386 and amd64, are unaffected.
+Go 1.3 now includes experimental support for Solaris on the <code>amd64</code> (64-bit x86) architecture. It uses illumos, equivalent to Solaris 11 or above.
</p>
<h2 id="memory">Changes to the memory model</h2>
コアとなるコードの解説
このコミットは、Go 言語のランタイムやコンパイラのコード自体を変更するものではなく、Go 1.3 のリリースノートの一部であるドキュメント doc/go1.3.html
の内容を更新するものです。したがって、「コアとなるコードの解説」という観点では、Go ランタイムの内部実装に関する直接的なコード変更の解説はできません。
しかし、このドキュメントの変更が示唆する Go ランタイムの各プラットフォームへの対応に関する技術的な側面は、前述の「技術的詳細」セクションで詳しく解説しました。具体的には、Go ランタイムが各OSのシステムコール、例外処理、ABI (Application Binary Interface) などにどのように適応しているか、そしてそれがなぜ特定のOSバージョンやカーネル設定を必要とするのか、といった点です。
このドキュメントの更新は、Go 開発チームが各プラットフォームの特性を深く理解し、Go プログラムがそれらの環境で効率的かつ安定して動作するように、ランタイムレベルでの継続的な努力を行っていることを示しています。例えば、FreeBSD の ARM プラットフォームにおける EABI システムコールへの切り替えは、Go ランタイムが最新のOS機能やハードウェア特性を積極的に取り入れ、パフォーマンスと互換性を向上させている証拠です。
このコミット自体はドキュメントの変更ですが、その内容は Go 1.3 の重要な技術的進歩、特にクロスプラットフォーム対応の進化を反映していると言えます。
関連リンク
- Go 1.3 Release Notes: このコミットが更新しているドキュメントの最終版は、Go 1.3 の公式リリースノートとして公開されています。
- https://golang.org/doc/go1.3 (Go 1.3 の公式リリースノート)
- Go の互換性に関する約束 (Go 1 Compatibility Guarantee):
- Google Native Client (NaCl) 公式サイト:
- Go と Native Client の連携に関するWikiページ:
参考にした情報源リンク
- Go 1.3 の公式リリースノート (このコミットが更新しているドキュメントの最終版):
- Go のコードレビューシステム (Gerrit) 上の関連する変更リスト (CL):
- Windows 2000 のサポート終了に関する議論 (Go のコードレビューシステム):
- FreeBSD の
COMPAT_FREEBSD32
フラグに関する情報 (一般的な FreeBSD ドキュメントやフォーラム):- https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/linuxemu.html (FreeBSD ハンドブックの Linux エミュレーションに関するセクション。
COMPAT_FREEBSD32
は32ビット互換性に関連する)
- https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/linuxemu.html (FreeBSD ハンドブックの Linux エミュレーションに関するセクション。
- EABI (Embedded Application Binary Interface) に関する一般的な情報 (ARM のドキュメントなど):
- https://developer.arm.com/documentation/den0013/d/ (ARM の EABI に関する概要)
- illumos プロジェクトの公式サイト:
- Plan 9 のシステムコールに関する情報 (Plan 9 のマニュアルページや関連ドキュメント):
- http://man.cat-v.org/plan_9/2/semacquire (
semacquire
システムコールに関するマニュアルページ) - http://man.cat-v.org/plan_9/2/Tsemacquire (
Tsemacquire
システムコールに関するマニュアルページ)
- http://man.cat-v.org/plan_9/2/semacquire (
これらの情報源は、このコミットが反映している Go 1.3 のプラットフォームサポートに関する技術的な決定と、その背景にある各OSの特性を深く理解するために参照されました。