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だから仕方ないかなあ。