Go 1 と Go プログラムの未来

はじめに

Go バージョン 1 (略して Go 1) のリリースは、この言語の開発における大きな節目です。Go 1 は、Go で書かれたプログラムやプロジェクトの成長のための安定したプラットフォームです。

Go 1 は、2 つのものを定義しています。1 つ目は、言語の仕様。2 つ目は、Go ライブラリの「標準パッケージ」であるコア API のセットの仕様です。Go 1 リリースには、2 つのコンパイラスイート (gc と gccgo)、およびコアライブラリ自体の実装が含まれています。

Go 1 仕様に合わせて作成されたプログラムは、その仕様の有効期間中、変更なしに正しくコンパイルおよび実行され続けることが意図されています。いつかは未定ですが、Go 2 仕様が登場する可能性がありますが、それまでは、現在動作する Go プログラムは、将来の Go 1 の「ポイント」リリース (Go 1.1、Go 1.2 など) が登場しても動作し続けるはずです。

互換性はソースレベルです。コンパイル済みパッケージのバイナリ互換性は、リリース間で保証されていません。ポイントリリース後、新しいリリースにリンクするために、Go ソースを再コンパイルする必要があります。

API は、新しいパッケージと機能を取得して成長する可能性がありますが、既存の Go 1 コードを壊すような方法ではありません。

期待

ほとんどのプログラムは、時間の経過とともにこの互換性を維持すると予想していますが、将来の変更がプログラムを壊さないことを保証することは不可能です。このドキュメントは、将来の Go 1 ソフトウェアの互換性に対する期待を設定するための試みです。今日コンパイルおよび実行されるプログラムが、将来のポイントリリース後に失敗する可能性のある方法がいくつかあります。それらはすべてありそうもないことですが、記録しておく価値があります。

もちろん、これらの可能性がすべて発生した場合、既存のコードに影響を与えることなく、可能な限りいつでも仕様、コンパイラ、またはライブラリを更新するように努めます。

これらの同じ考慮事項は、連続するポイントリリースにも適用されます。たとえば、Go 1.2 で実行されるコードは、Go 1.2.1、Go 1.3、Go 1.4 などと互換性があるはずですが、Go 1.2 でのみ追加された機能を使用する可能性があるため、必ずしも Go 1.1 と互換性があるとは限りません。

ソースリポジトリでは利用可能だが、番号付きのバイナリリリースの一部ではない、リリース間に追加された機能は、活発に開発中です。リリースされるまで、そのような機能を使用するソフトウェアの互換性は保証されません。

最後に、正確性の問題ではありませんが、プログラムのパフォーマンスは、依存するコンパイラまたはライブラリの実装の変更によって影響を受ける可能性があります。リリース間で特定のプログラムのパフォーマンスについて保証することはできません。

これらの期待は Go 1 自体に適用されますが、Go 1 に基づいて外部で開発されたソフトウェアの開発でも同様の考慮事項が考慮されることを願っています。

サブリポジトリ

golang.org/x/net などのメイン Go ツリーのサブリポジトリのコードは、より緩やかな互換性要件の下で開発される場合があります。ただし、サブリポジトリには、Go 1 のポイントリリースと互換性のあるバージョンを識別するために、適切にタグ付けされます。

オペレーティングシステム

外部の関係者によって変更されるオペレーティングシステムインターフェイスとの長期的な互換性を保証することは不可能です。したがって、syscall パッケージは、ここで保証される範囲外です。Go バージョン 1.4 の時点で、syscall パッケージはフリーズされています。システムコールインターフェイスの進化は、go.sys サブリポジトリなど、他の場所でサポートする必要があります。詳細と背景については、このドキュメントを参照してください。

ツール

最後に、Go ツールチェーン (コンパイラ、リンカー、ビルドツールなど) は活発に開発されており、動作が変更される可能性があります。これは、たとえば、ツールの場所とプロパティに依存するスクリプトが、ポイントリリースによって壊れる可能性があることを意味します。

これらの注意点は別として、Go 1 が Go とそのエコシステムの開発のための強固な基盤になると信じています。