Ruby Parser開発日誌 (9) - RubyKaigi 2023で発表してきた ~ 世はまさに”大パーサー時代” ~

5/10から5/14の5日間、RubyKaigi 2023に参加するために松本市に行ってきました。前回参加したのがRubyKaigi 2019の福岡のときなので、じつに4年ぶりの参加でした。 今回はコミッター/登壇者/LTスピーカーとしての参加になりました。その結果、0日目のDevMeeting含めて3種類のスライドをつくり、3日目の"Ruby Committers and The World"含めて3回登壇するというイベント盛りだくさんなKaigiでした。

いやー、自分のRubyKaigi史上、最高のRubyKaigiでしたね。まさにParserKaigiだったのではないでしょうか。

いろいろ書きたいことはありますが、まずは時系列で振り返っていきましょう。

Day 0 (5/10) - DevMeeting

DevMeetingに参加するためDay 0から松本へ向かいました。新宿から特急に乗り込んだ時点で、登壇資料が90%くらい、LTが85%くらい、Day 0の資料が0%の仕上がりでした。車内で仕上げるぞ!と思っていたのですが、想像以上に列車が揺れて東京を抜けるころにはちょっとグロッキーになってしまったので後半はぼーっとしていました(一敗)。

松本についてまずやるべきことはスライドの見出しに使う写真の撮影。ということで松本城へいったり、松本市美術館へいったり、街の中をふらふらしたりして写真をとっていました。最初にいった松本城でいきなり野生のRubyistに遭遇し、"そうそうこれこれ、こういう遭遇イベントをやりたかったんだよ!!!"と無駄にテンションが高くなってしまいました。DevMeetingは登壇資料をコンパクトにまとめたものを作って現状の進捗と方針を共有して無事終了、と思いきやBisonからLramaに置き換える話でGoサインが出て、結果このあと僕は2日目まで資料作りとPR作成に追われるのでした(この時点ではまだ1日目の発表で頭がいっぱいでした)。

RubyVM::AbstractSyntaxTreeのときも仙台のRubyKaigiの1日目の会議でいれることがきまったので、RubyKaigiにいくと進捗がでて良いですね1

DevMeetingのあとは少人数でご飯を食べに行ったりしました2。 ホテルに戻ってからスライドを整理し、何回かリハーサルをして最終的に28分くらいに収まることを確認して就寝。

Day 1 (5/11) - 登壇 & LT

朝食を食べに珈琲美学アベにいったところ当然Rubyistに遭遇し、"そうそうこれこれ"(略。

Matzのキーノートを聞いて、お昼を食べていよいよ登壇。

speakerdeck.com

togetter.com

途中何回か観客席を見回す機会があって、そのときみんなの熱気を感じました。会場との一体感というやつですね。とはいえ登壇している本人としては、夢中でしゃべっていて気がついたら発表が終わっていたというのが正直なところです。

登壇後はスポンサーブースや4階のHack Spaceをふらふらしたり、いくつかセッションを聞いたりして一度クールダウンをしていました。気持ちが落ちついてきたのでHack Spaceに移動してLTのリハーサルをしたものの、普通にやると半分いかないくらいのところで5分を超えてしまうんですよね(知っていた)。しばらく考えたところで、Advanced CourseのあとにあったExtra Courseをまるっと落として今の構成にすることを思いつき、無事LTの枠に収まるようになったのでした3

LT発表者はLTの時間中舞台の袖に順番通りに並んでスタンバイしているので、袖から他の人の発表を聞くという面白い体験ができます。通常の登壇と違って徐々に自分の番が迫ってくる感じがあって順番待ちが楽しいんですよね。僕は後半のほうだったんですが、みんなそれぞれのLTをやっていて、ここ数年できなかったLTの熱量を一箇所にまとめた感があって聞いていて楽しかったです。僕の直前の Adding custom rule for Rubocop in the 2 month of employment - Speaker Deckがすごくいい話で、会場が感動に包まれてしんみりとしたところであのLTを引っさげて登場。ギャップもふくめていい演出ができたかなとおもいます。

世はまさに”大パーサー時代”。一度は言ってみたかったセリフをあのホール、あの人数の前で言えたのは最高でしたね。

speakerdeck.com

togetter.com

この写真の組み合わせとても気に入っています。

セッションのときとLTのときで喋り方や雰囲気が全然違っていて、スイッチが入っていたというコメントをいただきました(自覚がなかった)。

その後は流れるようにOfficial Partyに参加。久しぶりに会う人も、オフラインで初めて会う人も、全くの初めての人も、いろいろな人とお話しできて気がついたらOfficial Party終わっていましたね...

Day 2 (5/12) - Lramaのmerge

この日も朝食を食べに珈琲美学アベにいったところ当然Rubyistに(略。この日は@hasumikinさんと会えたので朝食から会場につくまでずっと(PicoRubyの)parserの話をしていました。これまでhasumikinさんとじっくりparserの話をしたことがなかったんですが、それぞれ違うparserの開発者なのに、会話がこんなハイペースで進むんだ!!と感動しましたね。僕にとってRubyKaigi 2023の何気ないけど幸せに満ちた時間になりました。

前半はセッションを見つPRの準備をしていましたが、CIがなかなか全部通らない。あまりにもbuild周りの知見がなさすぎたので後半はHack Spaceでnobuの隣に陣取って、いろいろ教えてもらったり調査をしてもらったりして、なんとかLramaをrubyにmergeしました。

github.com

その後Leaner Drinkupでpreview1がリリースされたので、いまのpreview最新版はLramaの生成したparse.cをもとに動いています。

という流れがRubyKaigi 2023 参加報告とちょっとエモい話 - joker1007’s diaryの"エモい話"に繋がっています。

Lrama mergeにあたりいろいろな人に助けていただきました。 特にnobuさんにはbuild周りを助けていただきました。hsbtさんにはCIやBASERUBY周りを見ていただき、僕がPRにcommitをpushするたびにこけているCIのタスクを見ていただきました。成瀬さんにはリリースのタイミングを調整していただきました。ありがとうございました。

Day 3 (5/13) - The bison slayer

Day 4 (5/14) - RubyKaigiが終わらない

今年のRubyKaigiが自分の中であまりにも大きかったのでしょう。4日目になっても帰る気持ちになれなかったのです。美術館にいっても、気になっていた洋食屋さんにいっても、喫茶店にいっても、お土産を買っても、とにかく自分のなかでRubyKaigiが終わらない... RubyKaigiには7回目の参加ですがこんな気持ちになったのは初めてで、正直戸惑いました。お勧めされた浅間温泉にいって温泉に入ることで最終的には気持ちが落ち着いて、帰る気持ちになりましたが。

松本駅で会ったRubyistとも別れてこれでRubyKaigiも終わったなと思っていたのですが、なんと新宿駅で特急を降りたあとにばったりRubyistにあったので僕のRubyKaigiは新宿まで続いていたのでした。

RubyKaigi翌週 - 非連続な日常

RubyKaigiから帰ってきて少しずつ感覚も日常に戻り始めた矢先、RubyKaigiに行く前はまったく想像していなかったことが立て続けに起きたのでした。 実はLR parser, parser generator, parse.yをいじってみたい人は結構いて、いままでちょうど良いとっかかりがなかっただけなのではないかと思うようになりつつあります。

1. LramaにPRがくる

いろいろな人がLramaを触ったり読み始め、それぞれ興味がある部分にPRが送られてくるようになりました。

github.com

2. LramaへのPRが初めてのOSSへのPRという人が現れる

手を動かして振り返る RubyKaigi 2023 - connpass のLTでも発表があったのですが、初めてのOSSへのPRです!という人もいて、このプロジェクトやっていて本当によかったなと思いました。僕もOSSがあったから今こうしているので、その入り口になるのであればこんなに嬉しいことはないですね4

speakerdeck.com

3. LTでLramaの話がでてくる

同じく"手を動かして振り返る RubyKaigi 2023"でのLTで、ima1zumiさんもLramaのお話をしていました。

scrapbox.io

4. Lramaで自作言語のパーサーを書く人が現れる

自作言語などのパーサーの生成に使えるのはそうなんですが、こんなに早く使ってみたがでてくると思わなくてびっくりしました。

qiita.com

セッションについて

特に印象にのこったセッションを。

Implementing "++" operator, stepping into parse.y

speakerdeck.com

一見++を実装する"だけ"の平和な話になるはずが、rubyの処理系の上へ下へとparser以外の部分も含めていろいろなところを旅する話になっています。処理系をhackするというのはこういうことだという声が聞こえてくるような発表で、とても楽しかったです。

試している方法も様々で、生成するtokenを変えればいいというアイデアは僕からはでないですね... 物語の中盤でMatzのチケットへのコメントを引用して、つまりこういうことなんですよ。と説明していたのがシーンが印象的でした。僕がDay 1で宣言した”大パーサー時代”というものをまさしく体現した発表だったと思います。

このセッションはいくつもの解釈の仕方があるようで、聞いていた人によっておもしろかったポイントが違うという点もいいですね。

UTF-8 is coming to mruby/c

UTF-8の実装が存在しない世界の話から始まったのが印象的でした。この手の"XXがない世界の話"が個人的に大好きなんです。2023年に一からUTF-8周りの実装をできる機会が目の前にあるんですよ、というような趣旨のことを言っていて、その気持ちすごくよくわかると思ったのでした。僕もparser周りでEncodingについて考えないといけないので頑張ります5

speakerdeck.com

その他

通常のセッションとLTをやってみた感想

2つともやってよかったです、というのが素直な感想です。どちらもparserの話をしているのですが発表の核が結構違っていて、通常のセッションは未来の話がメインなのでいまのparse.yの魅力を伝える時間はないし、それを入れるとメッセージがぶれてしまいます。それを補完する関係にあるのが今回のLTで、LTは完全に今のparse.yの話に振り切ることができました。2回登壇機会があったので、通常のセッションでつかったドラゴンブックネタをLTでちょっとひねって使うといった遊びもできました。

自分が実装したメソッドがかるたに収録されるという実績を解除した

RubyVM::AbstractSyntaxTreeからparseメソッドが収録されました。かるたをきっかけにASTやparserに興味をもつ人が増えるといいなと思います。RubyVM::AbstractSyntaxTree.ofというさらに便利な玄人向けメソッドもあるので興味をもった人は試してみてください。

Rubyメソッドかるた裏話 - ESM アジャイル事業部 開発者ブログ

RubyKaigi 2024に向けて

来年に向けた話を最後にすこし。

今回Bisonというボスを倒すことに成功したわけですが、これは物語の最初に出てくる仲間がいない状態で戦う最初のボスなんですよね。

  • AST nodeの整理をする
  • LramaのRBS対応
  • universal parserを作り上げる
  • Named References/Typed Midrule ActionsといったBisonにある機能をLramaに移植する
  • User defined stackというアイデアで、Ripperのメンテナンスコストを下げられないか試す

などなどC/Ruby、パーサー/パーサージェネレーター問わずやるべきことがたくさんあります。とても一人でできることではないので、一緒に冒険してくれる仲間を募集中です。"去年は一人でBisonを倒しました、今年はこれだけの仲間と一緒にこのボスを倒してきました"という話ができるといいな。

ruby-jp slackに#lr-parserを作ったので、ご興味のある方ぜひぜひお越しください。

ruby-jp.github.io

RubyKaigi 2023 お疲れ様でした、ありがとうございました!


  1. Ruby Committers vs the World - RubyKaigi 2018 4:00ぐらいから
  2. 実際は翌日の発表の緊張でブルーな感じになっており、食事に行ったさいにはみなさんに励ましてもらっていました。その節はありがとうございました。
  3. 実際に収まっていたかどうかは自分の目で確かめてみよう!
  4. そういえば自分がOSSに関わり始めたのが2013年なので、10年後にこうなるとはなぁ
  5. むしろいままで考えずにこれたのが不思議