Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reish is an Unix shell for Rubyist

Reish is an Unix shell for Rubyist

Reish is an unix shell for rubyist.

Keiju Ishitsuka

September 22, 2017
Tweet

More Decks by Keiju Ishitsuka

Other Decks in Technology

Transcript

  1. 石塚 圭樹 [email protected] Keiju Ishitsuka ペンタアドバンストラボラトリーズ 研 究所長 Penta Advanced

    Laboratories, Inc. Reish - An Unix Shell for Rubyist RubyistのためのUnix Shell
  2. Reish, an unix shell for rubyist # #2 2 RubyKaigi2014

    自己紹介 • 石塚圭樹 Keiju Ishitsuka – MLでは、けいじゅ@いしつか ででています • Rubyの名付け親 Ruby's godfather – というか、Ruby開発のきっかけを作った人 • Irbの作者 Irb's author • オブジェクト指向関係の著作がいくつかある。 – shell.rb
  3. Reish, an unix shell for rubyist # #3 3 RubyKaigi2014

    自己紹介 - 現在 • ペンタ アドバンスト ラボラトリーズ において – OO系システムの研究開発 – OO関連技術の導入コンサルティング – などなどと、相変わらずのことをしていま す。
  4. Reish, an unix shell for rubyist # #4 4 RubyKaigi2014

    はじめに Introduction • Reishを開発することになったきっかけ – RubyKaigi2013で発表したRubyArchaeology(Ruby考古学)において • Rubyの開発当初はShellぽい文法を想定していた – その時に、ちょっとこんな物できましたと発表したくなり、開発 をはじめたがほとんど進まずじまい – RubyKaigi2013での松本さんの発表で、ちょっとモチベーション が上がり、再度開発をはじめたが、あまり進まず – RubyKaigi2014の話になって、やる気が出てきて、頑張っている ところ
  5. Reish, an unix shell for rubyist # #5 5 RubyKaigi2014

    なぜ、Reishか? • RubyとかIrb使えばいいんじゃないの? – コマンド引数が面倒 • shell.rbがあるんだけど? – Ruby上でShellの機能を実現したもの – バッチ的に使うことを想定している – が、Irbでも利用可能
  6. Reish, an unix shell for rubyist # #6 6 RubyKaigi2014

    shell.rb って? • sh.cat("/etc/printcap") | sh.tee("tee1") > "tee2“ (sh.cat < "/etc/printcap") | sh.tee("tee11") > "tee12" sh.cat("/etc/printcap") | sh.tee("tee1") >> "tee2“ (sh.cat < "/etc/printcap") | sh.tee("tee11") >> "tee12" • sh.transact do cat("/etc/printcap") | tee("tee1") > "tee2“ (cat < "/etc/printcap") | tee("tee11") > "tee12" cat("/etc/printcap") | tee("tee1") >> "tee2“ (cat < "/etc/printcap") | tee("tee11") >> "tee12" end • print sh.cat("/etc/passwd").head.collect{|l| l =~ /keiju/}
  7. Reish, an unix shell for rubyist # #7 7 RubyKaigi2014

    shell.rb - 限界 • shell.rbの限界 – やっぱ、ダブルクォートが面倒 • 書いていると、指が痛くなる • 演算子の優先順位の壁 – 実装上の問題 • コマンド列の終端がわからない
  8. Reish, an unix shell for rubyist # #8 8 RubyKaigi2014

    なぜ、RubyistのためのShellか? • bashとかいろいろなshellがあるじゃん? • Rubyistは当然shellでも、 – Enumerable系メソッドが使いたい – イテレータを使いたい – やっぱ、オブジェクト指向じゃなくちゃ • いろいろなクラスの利用 – そもそも、Rubyの機能が使えると便利
  9. Reish, an unix shell for rubyist # #9 9 RubyKaigi2014

    名前の由来 Origin of name • やはり一文字目は'R'にしたいのが人情 – 一番最初に思いつく rsh は当然NG • そこで、次に考えられるのが: – rbsh, rash, rush, rish... – でも、全部先に取られていた... • ruby x shell で rxsh にいったん決まったが... 発音が? • shell系言語では人の名前が入っていることが多いの で – Reish となった。
  10. Reish, an unix shell for rubyist # #10 10 RubyKaigi2014

    Reishの方向づけ Inception of Reish • 親言語はRuby • Shellとしてのfeatureをもつ • 両者の融合
  11. Reish, an unix shell for rubyist # #11 11 RubyKaigi2014

    Reishのfeature Feature of Reish • Ruby開発当初のものが参考になるかも RubyArchaeology # #10 10 RubyKaigi2013 B R 2日: 言語の特徴 B R 2day: Feature of a language • オブジェ ク ト 指向言語である/obj ect ori ented l ang. • インタ ープリ タ /i nterpri ter • 手軽に使える言語/conveni ence l ang. • オペレーティ ングシステムに密着し た言語 l anguage to handl e O perati ong System • 雰囲気と し てはperl のオブジェ ク ト 指向言語版 • (shel l 風の)簡単な構文(yacc 使わない?) (shel l -l i ke) sym pl e syntax. (no use yacc?) • 単純継承/si ngl e i nheri tance • ガーベジコ レク ショ ン/garbage col l ecti on • 拡張性(Cライブラリ と 動的リ ンク か静的リ ンク できる) • U N IX, PC 双方で動作する(PC では機能制限あり ?)
  12. Reish, an unix shell for rubyist # #12 12 RubyKaigi2014

    Reishのfeature Feature of Reish • 親言語はRuby – 当然、オブジェクト指向になっていないと – ReishからRubyへのセマンティクスマッピングが可 能 – Rubyのメソッドが実行可能 – イテレータも使えるようにしたい • Shellとしてのfeature – Shell風の文法 – Job制御 – ワイルドカード • Shellとの違い – マクロはない – 少々の制約はかまわないことに
  13. Reish, an unix shell for rubyist # #13 13 RubyKaigi2014

    Reishの文法 Syntax of Reish • Simple Command – command_header arg1 arg2 ... • パイプライン式(pipeline expression) – command1 | command2 ... • 論理式(logical expression) – pipeline OP pipeline2 ... – OP: &&, || • command sequence – logical_exp1 [;&\n] logical_exp2 ... [;&\n]
  14. Reish, an unix shell for rubyist # #14 14 RubyKaigi2014

    Reishの文法 Syntax of Reish • command headerになれるもの – 英数字か'/'が含まれる文字列 • Commandの引数(command argument)になれるもの – 文字列、ワイルドカード • UnquotedString: ダブルクォート等でくくられていない文字列 も文字列になる – 変数参照 – リテラル – グループ • SimpleCommandはイテレータにできる – cat /etc/passwd do |e| puts e end – ls{|e| puts e}
  15. Reish, an unix shell for rubyist # #15 15 RubyKaigi2014

    Reishの文法 Syntax of Reish • 変数参照 – $local_var – $$gloval_var – $@inst_var • リテラル – 文字列、数値(Number, Integer, FID) – array : $[e1 e2 ...] – hash: ${k1 => v1 k2 => v2...} – 正規表現(regular exp): $/.../ – RubyExp: $(ruby文) • グループ – (command1[;\n] command2; ...) • ただし、これらはマクロではありません
  16. Reish, an unix shell for rubyist # #16 16 RubyKaigi2014

    Reishの文法 Syntax of Reish • コマンド – 前述のsimple command以外に – assgin command • var = command_element • var[idx] = command_element – if command • if logical_exp [then;\n] sequence else sequence end – while command • while logical_exp [do;\n] sequence end – その他、制御構文は順次用意する予定
  17. Reish, an unix shell for rubyist # #17 17 RubyKaigi2014

    Reishの文法 Syntax of Reish • コマンド続き – グループコマンド(group Command) • グループと同じ表現、こちらはあくまでもコマンド • (command1; command2 ...) • リテラルコマンド(literal command) – 文字列、数値 – 配列 • $[e1 e2 ...]、 [e1 e2 ...] – ハッシュ • ${k1 => v1 k2 => v2...}、 {k1 => v1 k2 => v2...} – 正規表現 • $/.../ – RubyExp • $(ruby文) • $begin ... end
  18. Reish, an unix shell for rubyist # #18 18 RubyKaigi2014

    Reishセマンティクス - Symple Command Semantics of Reish • simple commandの実行 – まず、Ruby形式に変換しmethodとして評価(eval) • うれしい副作用として、コマンド名が変数だと変数参照に なる(^^;; – 引数も、評価される。 • ほとんどがリテラルなのでそのまま • 注意: UnquotedString – メソッドが存在しないとき、PATHをたどってunix commandを検索、存在するときには、それに対応する SystemCommandオブジェクト(Enumerable)を返す – 引数について • ruby methodの場合は、そのままオブジェクトとして渡す • unix commandの場合は、適当に文字列に変換して渡す
  19. Reish, an unix shell for rubyist # #19 19 RubyKaigi2014

    Reishセマンティクス - Pipeline Command Semantics of Reish • パイプライン(|)はメッセージセンド – command1 | command2 – Ruby: command1.command2 – ただし、SystemCommandの場合、UNIXコマンドの 標準出力(stdout)の一行一行を要素として返す Enumerableになる。 • パイプライン結合無しのSimpleCommand,及び パイプラインの終端は実行結果(プロセスの 終了コード)が返る • '|'の代りに'::'や'.'も使える – '.'は利用制限あり
  20. Reish, an unix shell for rubyist # #20 20 RubyKaigi2014

    Reishセマンティクス - Group Command Semantics of Reish • Group – (sequence) – 内部のコマンドを実行し、seaquenceの最 後の式の結果を返す – コマンド引数におくことができる – これを用いて変数参照も行える • (local_var) • RubyExp – rubyの式をそのまま展開する
  21. Reish, an unix shell for rubyist # #21 21 RubyKaigi2014

    ここまで作ってみた感じ • 今が一番楽しいときかも(^^; • 結構うまく行っている気がしている – パイプライン – Group – RubyExp • アーキテクチャルな問題はだいぶ解消 出来た気がしている
  22. Reish, an unix shell for rubyist # #22 22 RubyKaigi2014

    考えなくちゃいけないこと • 制御構造 – Rubyにあるのを全部実装したいけど、難しいかも… • 実行制御 – ^C, ^Z – プロセス制御というよりもスレッドの制御がしたい • ユーザビリティに関するもの – Rubyで記述するので、いろいろできるかも • エラー処理 – 面倒だけど… • というか、まだまだ、全然出来ていません。
  23. Reish, an unix shell for rubyist # #23 23 RubyKaigi2014

    お礼 • Raccはすばらしい!! • Rubyのparser.yもありがとう!! • irb/ruby-lex.rb結構頑張っているじゃ ん
  24. Reish, an unix shell for rubyist # #24 24 RubyKaigi2014

    今後の予定 • 完成版の紹介はRubyKaigi2015で!!