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

はじめに

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

Go 1は2つのことを定義しています。第一に、言語の仕様。第二に、コアAPI群、つまりGoライブラリの「標準パッケージ」の仕様です。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.1とは必ずしも互換性がありません。これは、Go 1.2で追加された機能のみを使用する可能性があるためです。

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

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

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

サブリポジトリ

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

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

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

ツール

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

これらの注意点を除けば、Go 1はGoとそのエコシステムの発展のための確固たる基盤となると私たちは信じています。