新居の掃除、および諸事の片付け。ガスの点検、ウッドカーペットの搬入、BSアンテナの取りつけなど。 午前中いっぱいかかってしまった。しかし、それだけで疲れ切ってしまったぞ。
夜には契約関係の処理もすませる。いよいよ引っ越しの準備が整ってきた。
yaccの宣言的な文法は条件が書けない。 「この条件のときはこのルールを適用しない」というような文法はありえない。
まあ、LALR(1)の性質を考えればある意味当然なので、これを弱点というのは適切ではない。 より正確には「弱点」ではなくて、せいぜい「要望」とか「欲求」とかだな。
とはいえ、 Rubyの文法には「ifなどの条件式には任意の式が書けるけどdoが来てはいけない」とか、 「メソッド引数には任意の式が書けるけどコンマを含んではいけない」のようなルールが存在する。 これに対応するためには、
前者はルールの数が増える(単純計算で4倍)ので、メンテナンスの手間がかかる。 一つのルールを修正するために、 常に4箇所(あるいはそれ以上)を更新する必要がある。あんまりだ。
現在のRubyの実装は後者を使っているのだが、 これもlexerとparserが無闇に強結合するため、メンテナンス性に問題がある。 また、yaccルールだけで文法が理解しにくいのも欠点だ。
私の知る限りでこんな無茶な要求に対応しているcompiler compilerは存在しない。
再帰下降の手書きparserなら、こんな挙動も簡単に実現できる。 「条件式フラグ」や「メソッド引数フラグ」を再帰関数の引き数のひとつに渡せば良い。 しかし、再帰下降parserもメンテしにくいことで知られているんだよなあ。
結局どれでもメンテしにくいんだったら、どれを選んでも同じってことかなあ。
Ploneを使ったこぎれいなページができている。大したものだ。
しかし、ゆうべ突然メールがきて、8月27日、28日に別の用事が入ってしまった。 こんな急な日程変更があるとは。 LLDN、昼の部だけなら出れると思ってたのになあ。
外出する用事なのでSkypeも使えそうにない。弱ったなあ。
私にとってどっちも大事だしなあ。
マークに用いるカラーをローテートすることで、 マークフェーズとスイープフェーズを並行に行うことができるので、 これで効率化だ、と思ったのだが、 考えてみれば、カラーを変えようがなにしようが、 これではマークフェーズとミューテーターが同時に動けない。 やはりライトバリアは必要なのであった。
スイープが並行にできるのは嬉しいことも多いだろうけどね。
自分の間抜けさ加減が悔しいので(だから研究者にはなれないんだ)、 もうちょっと考察してみることにする。
あるプロセスで割り当てられるオブジェクト数をn、 参照されなくなるオブジェクト数をmとする時(だから当然n>m)、
となる。実際問題としてRubyが救済しなければならないケースはどれなのだろう。
スイープのインクリメンタル化は簡単な割に効果がありそう。 コストもあまりかからないしね。
マークのインクリメンタル化にしても、 世代別GCにしても、いずれもライトバリアが必要なので、 実行効率に影響を与える可能性がある。
インクリメンタルGCのアルゴリズムの紹介。 ちゃんとスレッドを意識している。
4月のブログコンテストのエントリを勝手に批評するシリーズ(その2)
このエントリで提案するのは、オプショナルスタティックタイピング。
def my_method(Integer param) puts "Well, hello!" end
で、
def my_method(param) do_something if param.is_a?(String) end
の代わりをするというもの。 自分でも似たようなアイディアについて発言したことがあるので、 気持ちはわかるが、不採用。
まず、元々のis_a?を使ったスタイルそのものがDuckTyping的見地から とても悪いスタイルである「is_a関係でのチェック」になっており、 それを推奨する言語機能を追加することはありえない。 DuckTypingを捨てたらRubyの良い点(悪い点でもあるが)を捨てることになり、 言語の性質を変えてしまう。
なんらかのタイプチェックを追加するならば、 メソッドの保有関係によって行うべきだが、 method_missingを使っているものは単純なrespond_to?を使えないことなども考えると、 これも一筋縄では行きそうにもない。
結局、「Rubyのまま」という制約の下では、 なにもチェックを行わない単純なDuckTypingが最適という結論になりそうだ。
では、Rubyではないまったく新しい(動的型)言語で オプショナルな型チェックを追加するとしたらどのようにするべきか考えてみよう。
「Elvisは生きていた」ならぬ「arcは生きていた」。
アメリカではElvis Presleyが死んだことを認めず、 「いや、実は死んでない」とか、「実は宇宙に帰ったのだ」とか、 「ロッキー山中で目撃した」とか、よくわからない噂が流れることがあるのだそうだ。
本当か。
で、Elvisとは関係なく、 あんまり実物が出てこないものだから、きっと死んだものだと思われていた Paul Grahamのarcだが、どうやら生きていて、Y Combinator内部では実際に使われている らしい。しかも、「cons量を削減して2,3倍の高速化を実現」だそうだ。
「consを減らしたくらいで」と思わないでもないが、arcはそれ自身がCommonLispで書かれているそうなので、コンパイラとランタイム合わせたcons量は馬鹿にならないのかもしれない。
_whyによるRuby(とプログラミング?)の入門ツール。
Windows版しかないのでないので、試せなかった。 Webを見る限り、それなりに評判は良いみたい。
誰か試してみない?
評価記事も出ている。