トップ «前の日記(2013-03-14 (Thu)) 最新 次の日記(2013-05-31 (Fri))» 編集   RSS 1.0 FEED  

Journal InTime


2013-05-30 (Thu) [長年日記]

_ RubyKaigi2013(1日目)

RubyKaigi2013に参加して発表した。 とりあえず資料を↓に置いておきます。

発表では喋らなかったけど、どっちかというとpackrat parserの実装の方が大変だった。

しかも、遅いし入力が大きいと落ちる。理由は、

  • 末尾呼出しの最適化がデフォルトでオフになっている。
  • 末尾呼出しの最適化を有効化しても、Procの呼出しの場合は効果がない(多分Proc#callでCの関数をまたぐため最適化が効かない)。
  • Immutable::Promiseを使うと、内部的にトランポリンを使っているので、末尾呼出しの最適化ができるけど、Parser#bindなどの実装ではそもそも末尾再帰の形になっていない。しかもPromise使うと余計遅くなる。
  • 加えて、Rubyだともともと関数型言語に比べて再帰呼出し回数の上限が低い。 (Ruby 2.0では環境変数RUBY_THREAD_VM_STACK_SIZEで調整できる。)

といった感じかなあ。

Rubyだと提供するインタフェイスは関数型っぽくする場合でも、内部的な実装は命令型にしないと実用的でない気がする。 Scalaも割とそんな感じだし、もともとOOPLだから仕方ないかなあ。

Tags: Ruby