言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ECOOP 2011

ECOOP というオブジェクト指向言語の学会に行ってきた。発表無しに遊びに行っただけです。

一日目は Context-oriented Programming というワークショップを覗いたが、難しくてよくわからなかった。ポツダムでお世話になった Jens Lincke 氏が Lively Kernel を使って Context-oriented Programming の動作をブラウザ内で動的にデモするというのが面白かった。

二日目は FREECO を覗いた。これは Free Composition というキーワードをテーマに、バラバラの分野の人が思い思いの事を話す会だった。同僚の Ian Piumarta 氏が、言語には content words と non-content words (区切り文字やスペース)があるという観念的な話と、特殊フォームと関数適用を一つのメカニズムで行う実装と2つのキーの辞書だけを使ったオブジェクト指向の実装の話をした。他には、Tom Dinkelaker 氏が拡張可能な設定ファイルフォーマットを作るためのツールキットを発表した。Paradigm 構文というのでマクロ的にフォーマットを拡張できる部分が興味深かった。あと、Steffen Zschaler 氏がソースコード変換という乱暴な方法で C と Java のような全然違った言語でライブラリを共有する話など。

三日目のキーノートは Bart J.F. De Smet 氏による C# の最新事情だった。これにはかなり感銘を受けた。色々なプログラミングテクニックモナドと Duality を使って綺麗な API を作ろうという話だった。モナドと書くと難しそうだが、ようは Microsoft 自慢の LINQ には、データベースのアクセス以外にも意外に沢山用途がありますよという事。Duality とは、何でも逆に考えてみよう、すると全然別物だと思っていた部品が他の部品の逆向きかもしれないよという話。

例その一は、イテレーターの反対がオブザーバーだという話。イテレーターというのはリスト処理やデータベースアクセスのようにデータを能動的に押し込んでいく処理を抽象化した物で、オブザーバーは対象を監視して変化があったら受動的に何かする処理。ということはイテレーターの反対の動きをする API を作るとそれがオブザーバーになる事になる。イテレーターもオブザーバーも実用的なシステムで多用される処理なので、これが一つにまとまると素晴らしく見やすいコードになること間違い無い。

例その二は、SQL と NoSQL は鏡像の関係にあるという話。SQL データベースというのは、表形式のデータを出来るだけ重複無く表現する方法で、ちょっとでも重複があるとそのコラムを id で参照する事にして重複部分を別の表にしてしまう仕組み。表を読むときにはバラバラになった小さな表を id を手がかりにつなげて欲しいデータを取る。整合性が取りやすいが表が多くなったり大きくなると遅い。一方で NoSQL というのはその反対で重複があっても割りきって一つの表をそのまま使ってしまう。この2つは全く相容れないようで同じ内容を反対の視点から作った物になっている。

まず、同じデータを表現した SQL と NoSQL ならば、持っている情報は同じ物だ。だけど、データのつながり方を有向グラフで描くと参照の方向が正反対になっている。まず、SQL の場合は末端の表の値から上位の表の id への矢印になる。つまり、末端の値が上位の表を「知っている」。テーブルを join する時は id を手がかりに表を再構築する。一方で NoSQL の場合、表から値への矢印になる。これは単にメモリ内でのデータ表現と同じ事でテーブルは直接値を「知って」いるけど、末端の値は表の事を知らない。このように、NoSQL を SQL の鏡像と捉える見方を CoSQL と呼ぶらしい。今更 SQL のようなアイデアに新しい視点があるとは想像もしていなかったのでびっくりした。

三日目は、同僚の Alex と大島さんが書かれた World の発表があった。World というのは副作用のあるプログラミング言語で副作用の影響範囲を閉じ込めるための仕組みで、Undo やトランザクション、非決定処理など沢山の応用がある。四日目の夜には Alan Kay のスピーチもあった。このスピーチも大変良かったが疲れる前に最終日のキーノートをメモする。

最終日は五十嵐淳氏の Featherweight Java (FJ) についてのスピーチがあった。大変専門的な内容の話で正直良くわからなかったが、ある程度素人にも付いていけるように前半ゆっくりとオブジェクト指向言語と型の研究の歴史について若干ジョークを混ぜながら時間をとって解説して下さって大変勉強になった。

話によると、オブジェクト指向と型の研究は 80 年代の Landin が最初らしい、当時の研究では、オブジェクトを再帰的に定義された関数のレコード型とみなす事から始まった。また、late binding は parametrization と解釈出来る(意味はわからんがかっこいい言葉なのでメモした)。それから 90 年代になって存在型や様々な計算(?) を使うようになって複雑化して行った。一方で、理論と実装との乖離も目立つようになってきた。

例えば、理論では subtype かどうかはメンバが存在するかの structural に決定するが、実装では単にクラスの名前で nominal に決定する。また、理論では class は first class (実行出来る) が、実装では second class (コンパイル時だけの存在) である。また class と type の混同、inheritance と subtyping の混同されているという話もあった(これは私には良くわからなかった)。

そこで、FJ では割りきって、Java の型を研究するために特別にデザインされた Java を使うことにした。FJ ではむしろ理論を実装の方に合わせ、例えば Class は second class で Nominal だ。このような制限をつける事で理論が構築しやすくなる。また、いかにも簡単そうなモデルを作る利点として、あまりにも単純なので他の研究者が色々機能を付けたくてたまらなくて人気が出たと冗談を仰っていた。

このようにして作られた FJ は Javagenerics 研究の柱となり、沢山の応用を生み出した。残念ながら私にはその辺りの知識が無く、全然ついて行けなかったが、シンプルに作られたモデルから沢山の応用があるというのは素晴らしいなと思った。

それから宿に戻ってググると、何と五十嵐氏は今話題の #CoPL http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/CoPL/ の作者さんだという言うことが分かった。すごすぎる。聞いたことある名前だなーと思っていたが、恥ずかしながら全く気がつかなかった。何日間も同じ場所にいたのに全然中身のある会話が出来なくて大変もったいない事をしてしまった。