$30 off During Our Annual Pro Sale. View Details »

Reirb: reborn Irb.

Reirb: reborn Irb.

Reirb is a reborn irb, which interactive ruby language.
It is a high-functional shell language with ruby's syntax.
Its feature are job control, multiline-editor, smart-completion, language-navigation functionalities, etc.
Everyone will be able to live more enjoyable Ruby-life by using Reirb.

Keiju Ishitsuka

June 08, 2018
Tweet

More Decks by Keiju Ishitsuka

Other Decks in Technology

Transcript

  1. 石塚 圭樹 keiju@ishitsuka.com Keiju Ishitsuka ペンタアドバンストラボラトリーズ 研究所長 Penta Advanced Laboratories,

    Inc. Reirb: reborn Irb.
  2. Reirb - Reborn irb # #2 2 RubyKaigi2018 • 石塚圭樹

    Keiju Ishitsuka • Rubyの名付け親 Ruby's godfather • Irbの作者 Irb's author 自己紹介 Self-introduction
  3. Reirb - Reborn irb # #3 3 RubyKaigi2018 自己紹介 -

    現在 Self-introduction - current situation • ペンタ アドバンスト ラボラトリーズ において Work at Penta Advanced Lab. – OO系システムの研究開発(Rubyを含む) – OO関連技術の導入コンサルティング – などなど Research, Development and Consultant about Obj ect-Oriented system...etc
  4. Reirb - Reborn irb # #4 4 RubyKaigi2018 はじめに Introduction

    • 去年、 おかげさまで、Irb が誕生して20年 を向かえました Last year marks the 20th anniversary of Irb, thank you. • RubyKaigi2017でIrb2=Reirbの構想のお話しを しました I talked about the vision of Irb2 = Reirb at RubyKaigi 2017. • 今回は、Reirbの話をします。 This time I will talk about Reirb.
  5. Reirb - Reborn irb # #5 5 RubyKaigi2018 最近のIrb周辺の状況 Recent

    situation around Irb • Irbの開発は長いこと停止していた Development of Irb has been stalled for long • 知らぬまに似たアプリケーションが出てきて Similar applications have emerged – Pry, ... • Reishの開発の進行/Progress of Reish – いろいろ見えてきた Some directions became evident • ということで、Irbに再挑戦しているところ As such, I started to developping Irb, again.
  6. Reirb - Reborn irb # #6 6 RubyKaigi2018 なぜ、Irbをつくり直すのか? Why

    remake Irb? • Reishを開発していて、Reishを再利用すれ ば、REPL(Irb)を作れると思いついたから I thought that I could make Reirb using Reish, when developing Reish.
  7. Reirb - Reborn irb # #7 7 RubyKaigi2018 復習 -

    Reish Review - Reish • Reish - Rubyist のための UNIX shell Reish - UNIX shell for Rubyists • 現在開発中 Currently under developments • Reishの目的/Purpose of Reish – Shellの上でもRuby的な生活を満喫するため To enjoy a Ruby-ish life on a shell • Enumerable • Iterator • Object-Oriented • Other Ruby's feature
  8. Reirb - Reborn irb # #8 8 RubyKaigi2018 ReishのFeature Feature

    of Reish • Reishのコードは, Rubyに変換されて実行 Reish code is converted into Ruby, and is then execu ted – commandは実際にはメソッドとしてあつかわれる handle a command as actually a method – パイプラインは(.)に変換される Pipeline is converted into (.) • 気分的には、Shellの文法を持ったinteractiveなR ubyで外部コマンドも実行できるもの Reish is an interactive Ruby as Shell syntax and can execute external command.
  9. Reirb - Reborn irb # #9 9 RubyKaigi2018 ReishのFeature(続) Feature

    of Reish(cont.) • Job Control • Reidline - multiline editable input metho d • Smart completion
  10. Reirb - Reborn irb # #10 10 RubyKaigi2018 Reirbで再利用可能なもの Reusable

    things for reirb • Architecture • Job-Control • Reidline • Completion mechanizm
  11. Reirb - Reborn irb # #11 11 RubyKaigi2018 Architecture for

    reirb • Reishのarchitectureをベースにしている – based on Reish architecture. • 字句解析等にRipperを利用している – using Ripper for lexical analysing etc.
  12. Reirb - Reborn irb # #12 12 RubyKaigi2018 字句解析 Lexical

    analyze • Top-level-statement – (Re)irbではトップレベルの式を認識する必要 がある (Re)irb needs to identify top-level-statement. • Irbでは、独自に実装した字句解析器のみ で、トップレベルの式を識別している In Irb, top-level-statement are identified only by an original lexical analyzer.
  13. Reirb - Reborn irb # #13 13 RubyKaigi2018 字句解析(続) Lexical

    analyze(cont.) • 課題/problem – 字句解析が不完全なためRubyの構文に追い つけてなかった • Irb can't completely catch up with Ruby's syntax due to i ncomplete lexical analysis. – 本来パーザの仕事なのでしょうがない。 a work of Parser, primarily.
  14. Reirb - Reborn irb # #14 14 RubyKaigi2018 なぜIrbではRipperを使ってなかったのか? Why

    did not I use Ripper in Irb? • Irbを作ったときにRipperは存在しなかった Ripper did not exist when Irb was made. • 勉強不足/Lack of study – RipperではIrbが必要とする機能を十分に持っ ていないと思っていた In Ripper I thought that the functions required by Irb were insufficient.
  15. Reirb - Reborn irb # #15 15 RubyKaigi2018 Reirbでどうするか? What

    to do with Reirb? • Irbのまま/Take the implementation of Irb. – Top-level-statementの識別が不完全になる。 Identification of Top-level-statement is incomplete. – Reishで実現できた機能が実現できない。 Feature realized by Reish can not be realized. • オリジナルでパーザを実装/Implement an original parser. – Reishと同様。Reishのパーザを記述できたので、全く不可能とい うわけでもない。 Same as Reish. It was not impossible at all because I could descri be Reish's parser. • Ripperを利用する/Using Ripper – 機能が十分か調べる必要がある。 It is necessary to check whether the function is sufficient.
  16. Reirb - Reborn irb # #16 16 RubyKaigi2018 Ripper •

    Rubyのパーザ/Parser of Ruby • イベントドリブンベースで構文要素に対応 するメソッドを呼び出す(ParserEvent) Call a method of syntax emements on event- driven – ex) on_if, on_while, ... • 字句要素もイベントとして呼び出す(Scanne rEvent) Call an even for lexical elements – ex) on_lparen, on_kw, on_ident, ...
  17. Reirb - Reborn irb # #17 17 RubyKaigi2018 Ripperをどのように利用しているか? How

    does Reirb use Ripper? • トップレベルの式の識別 Identify top-level-statements. • 主に、ScannerEventを利用 Using ScannerEvent, mainly – ネストのカウントに利用/count nesting • class, if, while,... - on_kw • (, [, {,... - on_lparen, ... • ", ', %記法,... - on_tstring_beg • #{ - on_emvexpr_beg – 継続行の識別/identify continuous line. • on_ignore_nl
  18. Reirb - Reborn irb # #18 18 RubyKaigi2018 Ripperをどのように利用しているか? (続)

    How does Reirb use Ripper?(cont.) • ParserEventもちょこっと利用 Using ParserEvent, a little. – on_while, on_until, on_for • while-do問題/while-do problem – while ... do ... end – while-doとblock-doの区別がつかない。 – Rubyでも、かなり複雑な処理を行っている • 上記イベントをendがわりに利用 Use the above event as "end".
  19. Reirb - Reborn irb # #19 19 RubyKaigi2018 ちなみに、Ripperでは in

    Ripper • do – Ripperではわざわざ識別したwhile-do, block- doを同じイベントで返している – Ripperに区別するモードとかがあっても良いの では?
  20. Reirb - Reborn irb # #20 20 RubyKaigi2018 Job-Control •

    ^Z • fg, bg, jobs
  21. Reirb - Reborn irb # #21 21 RubyKaigi2018 Job-Control実装 Implementation

    of Job-Control • Job – top-level-statementがjobになる Job is top-level-statement – Irbと異なり、top-level-statemtnt毎にスレッドを起動 starts thread for each top-level-statement, unlike irb • ^Z – Rubyは外部からスレッドを停止する手段はない。 Ruby has no way to suspend a thread from its outside. • Thread#set_trace_func を利用 Using Thread#set_trace_func
  22. Reirb - Reborn irb # #22 22 RubyKaigi2018 Reidline -

    multiline editable input method • Readlineの複数行編集可能版 multi-line editable Readline • histroy • message
  23. Reirb - Reborn irb # #23 23 RubyKaigi2018 Reidlineの実装 Implementation

    of Reidline • terminfoライブラリを利用し端末を制御 Control terminal using terminfo-lib. • Readline/zshと同様カーソルの位置情報を利用 していない Not use the position information of the cursor, like th e Readline.
  24. Reirb - Reborn irb # #24 24 RubyKaigi2018 Reidlineの実装(続) Implementation

    of Reidline(cont.) • 式を識別する必要がある necessary to identify the expression. • インデントの処理 processing of indent. • シンタックスエラー時の処理 handle syntax error – 入力中にチェックする必要がある need to check it while inputing. – 終了すれば良いというものでもない does not mean that it should be done.
  25. Reirb - Reborn irb # #25 25 RubyKaigi2018 Completion •

    現在実装中 under developments.
  26. Reirb - Reborn irb # #26 26 RubyKaigi2018 Review -

    Reish Completion • bash/zsh風のcompletion機能を実現 bash/zsh-like complementation • command/method名補完 Command/method name completion • さらに、command-spec/method-specを定 義することにより、引数(オプション)の補完 も可能 Can also complement optional arguments by configuring command-spec/method-spec
  27. Reirb - Reborn irb # #27 27 RubyKaigi2018 Review -

    Reish Smart Completion • Reishはパーザを持っている Reish has a parser – メソッドチェーンを識別できる Can recognize method chains • MethodSpec – 所属、戻値、引数のクラスを指定できる Can configure the class of the owner, return value, and arg uments – メソッドチェーンのメソッドの所属を識別し補完の絞り 込みが可能 Can narrow down the complementation by recognizing the owner of a method within a chain
  28. Reirb - Reborn irb # #28 28 RubyKaigi2018 Reirb completionで行いたいこと

    What I would like to do at Reirb's completion • Reishなみのcompletion機能 Completion function equivalent to Reish – MethodSpec – 式をパーズして正確にcompletionしたい I want to parse the expression and complete it exactly. – help function
  29. Reirb - Reborn irb # #29 29 RubyKaigi2018 Reirb completionで行いたいこと(続)

    What I would like to do at Reirb's completion(cont.) • 途中式のパーズ Parse of incomplete expression. – completionでは式は完成していないことが多 い an expression is not completed in completion in most case s. – Reishでは、Raccの内部状態を解析して必要 な情報を抽出いる。 Reish analyzes the internal information of Racc and extract s necessary information.
  30. Reirb - Reborn irb # #30 30 RubyKaigi2018 Reirbではどう実現する? How

    does Reirb implements it? • Reish同様にRaccでパーザを実 Implement the parser with Racc as well as Reis h. • Ripperのみでできるか? realizable it only with ripper? • Ripperでパーズ経過をエミュレーションす ればよいか? emulate parsing process with ripper? – shift – reduce
  31. Reirb - Reborn irb # #31 31 RubyKaigi2018 その他、行いたいこと Other,

    what you want to do. • Completionの完成 Complete completion • コードの整理 arrange code – Reishベースのコード source code is Reish-base. – 共通部分とそれぞれ独自の部分に分けた split to common parts and their own parts. – Reidlineの独立化 libralization of Reidline.
  32. Reirb - Reborn irb # #32 32 RubyKaigi2018 その他、行いたいこと(続) Other,

    what you want to do.(cont.) • m17n – Rubyとして方針を示して欲しいなぁ Please indicate the policy as Ruby. • Irbの置き換え replacement of Irb. – 自分一人ではきめられない – 置き換えるにしてもクリアすべきことがありそう