kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Java Generics 導入の裏側

このエントリは、これまで自分がさんざんTwitterで書いてきたことですし、Martin Odersky教授へのインタビュー

www.artima.com

でおおむね語られていることでもあります。ただ、この辺の事情についてあまり詳しくない方も居るようなので、上記インタビューの引用を交えて、JavaGenericsが入るに至った経緯や関連して活躍した人物についても書いてみようと思います。

事の始まりは1995年にJavaが発表されたことでした。これに触発された、Philip Wadler先生(世界的に有名なコンピュータ科学者)、Martin Odersky先生と同じ研究室に居た助手さん?がこれでなんかやってみないかと煽ったらしく、翌年の1996年には、JavaGenerics高階関数、ADTなど関数型プログラミング言語の機能を入れ込んだPizza言語をMartin Odersky先生が発表することになります。

このPizza言語に関する仕事を知った、当時Sunのコアチームに居たGilad Brachaらが、「PizzaのGenericsは興味深いのでうんたらかんたら」といったことを言ったようで、これがJava Genericsの前身である「Generic Java(GJ)」チームの結成につながったようです。

GJチームの構成は公式ページにかかれていますが、

  • Philip Wadler
  • Martin Odersky
  • Gilad Bracha
  • Dave Stoutamire

というそうそうたる面子です(どのように凄いのかは略)。GJチームによって、1998年にはGJコンパイラが動作するようになりました。さて、実はこの時点で現時点でのJava Genericsの仕様は(Wildcardを除いて)ほぼ動作するようになっていたようです。raw typeのような仕様も、ソースコードの完全後方互換のためにこの時点でどうやら入ったようです。

個人的には、もっと早めにGenericsを取り込んでおけば良かったのに…と思うのですが、GJコンパイラはSunに買収され、JDK1.3から、Genericsをオフにして出荷されるということになったのでした。それから約6年の歳月を経て、ようやくJava Genericsは陽の目をみることになったのでした。

とはいっても、Sunがその空白の6年間、何もしていなかったかというとそういうわけではなく、

  • May 1999: Sun proposes to Add Generics to Java, based on GJ.(JSR14)
  • May 2001: Sun releases prototype for Adding Generics to Java.(based on the GJ compiler.)
  • January 2003: Generics headed for inclusion in Java 1.5.

このように、GenericsJavaに導入すべく動いていたようです。しかし、GJコンパイラとGJの仕様が1998年に既にあったことを考えると、あまりにも長い空白期間であったように思えます(政治的な事情があったのかもしれません。あとは、ワイルドカード導入(これはGJとの差分にあたる)にあたって何かあったのかもしれません)

ちなみに、Javaが初期にGenericsを持っていなかったのは、特別な設計ポリシーがあったわけではなく

Martin Odersky: When Java first shipped, Bill Joy and James Gosling and the other members of the Java team thought that Java should have generics, only they didn't have the time to do a good job designing it in.

意訳: Javaが最初に出荷されたとき、Bill JoyJames GoslingといったJavaチームはJavaにはGenericsがあるべきだと考えていたが、良い設計をする時間がなかったのだ

ということで、初期のJavaGenericsがないことを弁護していた方々はこれを知ったら何と思うんでしょうね…。

P.S. GJチームの中で、Odersky先生は主にGJコンパイラを書くことに注力していたようですが、他の面々はどの辺りの貢献があったのでしょうか?識者の方のツッコミお待ちしております。