ぶていのログでぶログ

思い出したが吉日

reddish-shell v0.11.0? 開発進捗 | Rustで再実装

久しぶりにreddish-shellのアップデート(?)なのだけど、Rustで再実装している。 なんでまた…っと思われるかもしれないが、意図が明確にあってそれは高速化である。 前にブログに書いたかもしれない*1けど、今のreddishは果てしなく遅い。 原因はいくつかあるけど、一番大きい理由はmruby VMの初期化が遅いことである。 reddishはコンセプトととして「実装はなるべくRubyで行いC言語での実装を最小限にする」を掲げていてmruby/Rubyでほとんどの処理を実装しているのだけど、それが理由でmruby VMの初期化が遅くなっている。 mruby_initを並列化したりしたら高速化できるかもしれないけど、今の私の技術力ではどうにもできない…。 また、仮にそれができたとして高速化したとして今後mrubyで実装していったら違う部分で同様の問題が起きるかもしれない…と考えたからだ。

解決策として、mruby/Rubyでの実装を少なくしてC言語に処理を委譲することなのだけど、私はあまりC言語を書きたくないと考えているのでだったら!ということでRustで再実装しようということになった。 ちなみに、Golangを選ばなかったのは勉強がてらRustを使ってみようと考えたからである*2

Rustで再実装しはじめて早速パーサーを書いている。 「Rust パーサー」で検索してヒットしたnomを使って実装した。

github.com

のだけど、これはやめようと思う。 というのもシェルに渡されるコマンド行は曖昧さがあり、「cmd 2>&1」は「2>&1 cmd」とかけたりするためnomでパースするのがかなりめんどくさい。 ちょうどこないだ読んだ自転車本にもパーサーの実装についての章があるので参考にしつつ独自実装指定校と思う。

こんな感じなので、v0.10.0相当の機能ができるまでまだ時間がかかりそうではあるが少しずつ作っていこう。

*1:書いてないかもしれない

*2:FFI周りがRustのほうが楽そう?なのと、システムプログラミングがGoだと大変そうなイメージがあったという理由もあるがちゃんと調べてないので雰囲気で書いている