2009-07-17 [長年日記]
λ. 日本Ruby会議2009 1日目
これから出発。
メモ
- Using Git and GitHub to Develop One Million Times Faster / Scott Chacon
- gitはよく知らなかったけど、gitの内部の概念は面白そうだ。 あと、githubでのforkがマージされた比率とかのデータも面白かった。
- Rubyの数 / 後藤 謙太郎
- Rubyの数クラスがどうしてこうなっているとか、1.9でRationalとComplexが組み込みになったとか。背景としてMatzがあるのに笑った。
- Ruby の標準乱数生成器とその改良案 / 村田賢太
- Array#shuffle が Kernel.rand に固定されているのは確かに困るか。 モンテカルロには乱数よりもLDS(Low-Discrepancy Sequences)が良いが、間違った使い方をしたときは、乱数を使ったときよりも酷いとか。 rubyのバージョンによってアルゴリズムが変わったら、シリアライズは困るとか。まあ、やってやれないことはないだろうけど。
- Rubyで楽しむBDD,ZDD / 倉井 龍太郎
- BDD(Binary Decision Diagram)とZDD(Zero-Suppressed BDD)のライブラリの話。BDDといえば Binary Decision Diagram しか知らなかったけど、同じ略語の Behaivior なんとかというのもあるらしい。ZDDは知らなかったけど、Cuddパッケージにもちゃんとあった……
- 静的型付けを持ったRubyっぽい言語の設計と実装 / 橋本和典
- 静的型付けを持つRubyっぽい言語TRuby。パーサはほとんどMRIのparse.yを再利用。コア言語tiby(ちびー)へ変換してコンパイル。関連研究に Diamondback Ruby (DRuby) と truby。 多相レコードのようなものは導入しなくていいの? というのと、多相レコードのような振る舞いベースの型と、最適化に使えるようなオブジェクトの構造に基づいた型とをどうやって橋渡しするのか、みたいなことを質問してみた。空気読んでない質問だったかも。他の人のコメントとしては、型よりも特殊化とかの方が良さそうではという話が。
- Ruby VMの高速化の展望 / 笹田 耕一
- 色々情報をとれるように。たとえばTDATAにメモリサイズを返す関数を登録可能に。あと、参照しているオブジェクトの一覧を返す関数とかも考えているとか。 インスタンス変数アクセスの高速化のために、インラインキャッシュで、クラスとインデックスの組をキャッシュ。 NODEを非GC対象化。 論文を書こうとすると新しいことをやらないと、というジレンマ。 「Ricsin: Ruby にCを埋め込むシステム」面白そう。 組み込みRubyは怖すぎる。 TDATAにメモリサイズ取得用関数が登録できるようになったとかで、実際のメモリ使用量を踏まえたGCをするような構想はあるのか、と質問してみた。
λ. “Equality and hashing for (almost) free: Generating implementations from abstraction functions” by Derek Rayside, Zev Benjamin, Rishabh Singh, Joseph P. Near, Aleksandar Milicevic, Daniel Jackson
akrさん(2009-07-18, 2009-07-19)とku-ma-meさんが、巡回構造のhashメソッドの実装法で盛り上がっていたので、そういえばこの論文でも巡回についても取り上げてたなと思って紹介してみた。 が、読んでみたら、equalityは今のRubyと同じような方法で、hashについては巡回がある場合には単純に定数を返しているというオチだった。 しょぼーん。
まあ、それはともかく、この論文は「equalityやhashの実装には落とし穴が色々あるので、手で実装する代わりにクラスに付与したアノテーションから自動生成しよう」という話。 使われているアノテーションは以下の通りで、abstraction function がイテレータを返すメソッドになっているのが、シンプルで面白かった。
Annotation + Description | Example(s) |
@EqualityTypeDefn Declares that this Java type represents an equality type and indicates whether or not its objects' parts are ordered. | @EqualityTypeDefn(Ordering.Total) interface List {...} @EqualityTypeDefn(Ordering.None) interface Set {...} |
@AbstractionFunction Names the method that provides an iterator over the parts of this object. | @AbstractionFunction("iterator") interface Collection {...} |
@ConcreteEquality Indicates that the abstract parts of object x are the objects its fields refer to. | @ConcreteEquality class Point { int x, y; } |
@NotKey Used with @ConcreteEquality to exclude fields from A(x). | @ConcreteEquality class BankAccount { final int id; @NotKey double currentBalance; ... } |
@ReferenceEquality Indicates that the unique identifier for this object should be used for equality, and so no other object can be equal to this one. | @ReferenceEquality interface Iterator {...} |