Goへのジェネリクス追加の提案

A Proposal for Adding Generics to Go by Ian Lance Taylor

ジェネリクスの提案

私たちは、型や関数に型パラメータのサポートを追加し、ジェネリックプログラミングの一形態を可能にするGo言語の変更提案を提出しました。

なぜジェネリクスなのか

ジェネリクスは、コードを共有し、プログラムをより簡単に構築できるようにする強力な構成要素を私たちにもたらしてくれます。ジェネリックプログラミングとは、一部の型を後から指定できるようにした関数やデータ構造を書くことを意味します。たとえば、任意のデータ型のスライスに対して操作を行う関数を書き、その実際のデータ型は関数を呼び出す際にはじめて指定する、といったことができます。あるいは、任意の型の値を格納するデータ構造を定義し、実際に格納する型はそのデータ構造のインスタンスを作成するときに指定する、ということもできます。

Goが2009年に最初にリリースされて以来、ジェネリクスのサポートは最もよく要望される言語機能の一つであり続けてきました。ジェネリクスがなぜ有用なのかについては、以前のブログ記事で詳しく紹介しています。

ジェネリクスには明確なユースケースがあるとはいえ、それをGoのような言語にきれいに組み込むのは難しい作業です。Goにジェネリクスを追加する最初の(そして欠陥のある)試みの一つは、遡ること2010年にまで及びます。それ以降の10年間でも、他にいくつもの試みがありました。

ここ数年、私たちは一連の設計ドラフトに取り組んできましたが、それが型パラメータに基づく設計として結実しました。この設計ドラフトにはGoプログラミングコミュニティから数多くの意見が寄せられており、以前のブログ記事で紹介したジェネリクス用のプレイグラウンドを使って多くの人が実際に試してきました。Ian Lance TaylorはGopherCon 2019での講演で、なぜジェネリクスを追加するのか、そして私たちが現在採っている戦略について話しました。Robert GriesemerはGopherCon 2020でのフォローアップ講演で、設計と実装における変更点について話しました。これらの言語変更は完全に後方互換性があるため、既存のGoプログラムはこれまでどおり動作し続けます。私たちは、この設計ドラフトがGoに追加を提案するのに十分な出来映えであり、かつ十分にシンプルであると考えるところまでたどり着きました。

これから何が起こるのか

言語変更提案プロセスは、私たちがGo言語に変更を加える際の手順です。私たちは今、ジェネリクスを将来のバージョンのGoに追加するために、このプロセスを開始しました。実のある批判や意見をお待ちしていますが、以前のコメントの繰り返しはできるだけ避け、単純に賛成や反対だけを述べるコメントもできるだけ控えてください。その代わりに、賛成あるいは反対するコメントや提案全体に対して、賛成や反対を表す絵文字リアクションを付けてください。

すべての言語変更提案と同様に、私たちの目標は、ジェネリクスを言語に追加するか、あるいは提案を取り下げるかについて合意を形成することです。これほどの規模の変更では、Goコミュニティの全員を満足させることは不可能だと理解していますが、私たちは誰もが受け入れられる決定にたどり着くつもりです。

もし提案が受理されれば、私たちの目標は、最適化はまだ十分でないとしても、完全な実装を年内に用意して人々に試してもらうことです。おそらくGo 1.18のベータ版の一部としてになるでしょう。

By Ian Lance Taylor