Go ブログ

ジェネリクスの次のステップ

Ian Lance Taylor と Robert Griesemer
2020年6月16日

はじめに

Go にジェネリクスを追加する可能性について最後に書いてからほぼ1年が経ちました。そろそろアップデートの時間です。

更新された設計

私たちは、ジェネリクス設計ドラフトの改良を続けてきました。私たちは、そのための型チェッカーを作成しました。これは、設計ドラフトに記述されているようにジェネリクスを使用する Go コードを解析し、型エラーを報告するプログラムです。サンプルコードを作成しました。そして、多くの人々からフィードバックを収集しました。ご提供いただきありがとうございます。

得られた知見に基づき、更新された設計ドラフトをリリースします。最大の変更点は、コントラクトのアイデアを廃止したことです。コントラクトとインターフェイスタイプの違いが混乱を招いていたため、その違いをなくしました。型パラメータは désormais インターフェイスタイプによって制約されます。インターフェイスタイプには désormais 型リストを含めることができますが、制約として使用する場合のみです。以前の設計ドラフトでは、型リストはコントラクトの機能でした。より複雑なケースでは、パラメータ化されたインターフェイスタイプを使用します。

この設計ドラフトがよりシンプルで理解しやすいものになることを願っています。

実験ツール

設計ドラフトをさらに改良する方法を決定するために、変換ツールをリリースします。これは、設計ドラフトに記述されているバージョンのジェネリクスを使用して記述されたコードの型チェックと実行を可能にするツールです。ジェネリックコードを通常の Go コードに変換することで機能します。この変換プロセスにはいくつかの制限がありますが、人々がジェネリック Go コードがどのようになるかを感じることができるのに十分であることを願っています。ジェネリクスが言語に採用された場合、実際の実装は異なる動作をします。(直接コンパイラ実装がどのようになるかについては、まだ概要を説明し始めたばかりです。)

このツールは、https://go2goplay.golang.orgにある Go Playground のバリアントで利用できます。この Playground は通常の Go Playground と同様に機能しますが、ジェネリックコードをサポートしています。

ツールを自分でビルドして使用することもできます。マスター Go リポジトリのブランチで利用できます。ソースから Go をインストールする手順に従ってください。これらの手順で最新のリリースバージョンをチェックアウトするように指示されている場合は、代わりに `git checkout dev.go2go` を実行してください。次に、指示に従って Go ツールチェーンをビルドします。

変換ツールについては、README.go2goに記載されています。

次のステップ

このツールが Go コミュニティにジェネリクスを試す機会を提供することを願っています。私たちが学びたい主なことが2つあります。

まず、ジェネリックコードは理にかなっていますか?Go のように感じますか?人々はどのような驚きに出会いますか?エラーメッセージは役に立ちますか?

次に、多くの人が Go にはジェネリクスが必要だと言っていることは知っていますが、それが正確に何を意味するのかは必ずしもわかっていません。このドラフト設計は、問題に役立つ方法で対処していますか?「Go にジェネリクスがあればこれを解決できる」と思わせる問題がある場合、このツールを使用すればその問題を解決できますか?

Go コミュニティから収集したフィードバックを使用して、今後の方針を決定します。ドラフト設計が好評で、大幅な変更が必要ない場合、次のステップは正式な言語変更提案になります。期待を設定するために、全員が設計ドラフトに完全に満足し、それ以上の調整が必要ない場合、ジェネリクスが Go に追加されるのは、2021年8月に予定されている Go 1.17 リリース以降になります。もちろん、実際には予期しない問題が発生する可能性があるため、これは楽観的なタイムラインであり、明確な予測はできません。

フィードバック

言語変更に関するフィードバックを提供する最良の方法は、メーリングリスト `golang-nuts@googlegroups.com` です。メーリングリストは不完全ですが、初期の議論には最適な選択肢のようです。設計ドラフトについて書くときは、件名行の先頭に `[generics]` を付け、異なる具体的なトピックごとに異なるスレッドを開始してください。

ジェネリック型チェッカーまたは変換ツールにバグが見つかった場合は、go.dev/issueにある標準の Go イシュートラッカーに報告してください。イシューのタイトルは `cmd/go2go:` で始めてください。イシュートラッカーは、スレッドを提供せず、長い会話には適していないため、言語の変更について話し合うのに最適な場所ではないことに注意してください。

皆様からのフィードバックをお待ちしております。

謝辞

私たちはまだ完成していませんが、長い道のりを歩んできました。多くの助けがなければ、ここにたどり着くことはできませんでした。

Go のジェネリクスについて正式に検討し、設計の理論的側面を明確にするのに役立った Philip Wadler と彼の共同研究者に感謝します。彼らの論文Featherweight Goは、Go の制限されたバージョンでジェネリクスを分析し、GitHubでプロトタイプを開発しました。

また、設計ドラフトの以前のバージョンに詳細なフィードバックを提供してくれた人々にも感謝します。

そして、最後に重要なことですが、Go チームの多くの人々、Go イシュートラッカーへの多くの貢献者、そして以前の設計ドラフトについてアイデアやフィードバックを共有してくれたすべての人に感謝します。私たちはすべてを読みました。そして、感謝しています。あなたがいなければ、私たちはここにいません。

次の記事:モジュールの互換性を維持する
前の記事:Pkg.go.dev がオープンソースになりました!
ブログインデックス