The Go Blog
ジェネリクスの次なる一歩
はじめに
Goへのジェネリクス追加の可能性について前回執筆してからほぼ1年が経ちました。更新の時期です。
更新された設計
私たちはジェネリクスの設計ドラフトの改良を続けてきました。設計ドラフトに記述されているジェネリクスを使用するGoコードを解析し、型エラーを報告できるプログラムである型チェッカーを作成しました。サンプルコードも作成しました。そして、多くの方々からフィードバックをいただきました。ありがとうございます!
学んだことに基づいて、更新された設計ドラフトを公開します。最大の変更点は、契約(contracts)のアイデアを廃止することです。契約とインターフェース型の違いが混乱を招いたため、その違いをなくします。型パラメータはインターフェース型によって制約されるようになりました。インターフェース型は型リストを含めることが許可されるようになりましたが、制約として使用される場合に限られます。以前の設計ドラフトでは、型リストは契約の機能でした。より複雑なケースでは、パラメータ化されたインターフェース型が使用されます。
この設計ドラフトがよりシンプルで理解しやすいものになることを願っています。
実験ツール
設計ドラフトをさらに改良する方法を決定するのに役立つように、変換ツールをリリースします。これは、設計ドラフトに記述されているバージョンのジェネリクスを使用して記述されたコードの型チェックと実行を可能にするツールです。これは、ジェネリックコードを通常のGoコードに変換することによって機能します。この変換プロセスにはいくつかの制限がありますが、ジェネリックGoコードがどのようなものになるかを感じるのに十分であることを願っています。もし言語に受け入れられた場合、ジェネリクスの実際の実装は異なる方法で機能します。(直接のコンパイラ実装がどのようなものになるかについては、まだスケッチを始めたばかりです。)
このツールは、Goプレイグラウンドの派生版であるhttps://go2goplay.golang.orgで利用できます。このプレイグラウンドは通常のGoプレイグラウンドとまったく同じように機能しますが、ジェネリックコードをサポートしています。
ツールを自分でビルドして使用することもできます。これは、Goリポジトリのマスターブランチで利用できます。ソースからGoをインストールする手順に従ってください。これらの手順で最新のリリースPタグをチェックアウトするように指示されている箇所で、代わりに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イシュートラッカー(go.dev/issue)に提出してください。イシューのタイトルはcmd/go2go:で始めてください。イシュートラッカーはスレッド機能を提供せず、長時間の会話には適していないため、言語の変更について議論するのに最適な場所ではないことに注意してください。
皆様からのフィードバックをお待ちしております。
謝辞
まだ終わっていませんが、私たちは長い道のりを歩んできました。多くの助けがなければ、私たちはここにいることはできなかったでしょう。
Philip Wadlerとその共同研究者の皆様には、Goのジェネリクスについて正式に検討し、設計の理論的側面を明確にするのを助けてくださったことに感謝いたします。彼らの論文Featherweight Goは、Goの制限されたバージョンにおけるジェネリクスを分析し、プロトタイプをGitHubで開発しています。
また、設計ドラフトの以前のバージョンについて詳細なフィードバックを提供してくださった皆様にも感謝いたします。
そして最後に、Goチームの多くの人々、Goイシュートラッカーに貢献してくださった多くの人々、そして以前の設計ドラフトについてアイデアやフィードバックを共有してくださったすべての人々に感謝いたします。私たちはそれらすべてを読み、感謝しています。皆様がいなければ、私たちはここにいることはできなかったでしょう。
次の記事:モジュールの互換性を維持する
前の記事:Pkg.go.devはオープンソースです!
ブログインデックス