以下の内容はhttps://yui-knk.hatenablog.com/entry/2025/04/29/115141より取得しました。


Ruby Parser開発日誌 (21) - RubyKaigi 2025で発表してきた ~ 四国漫遊記 ~

4/16から4/18の3日間にわたって開催されたRubyKaigi 2025に参加するために愛媛県松山市へ行ってきました。 今回はコミッター/登壇者として参加しました。そのため初日の自分の発表と、3日目の"Ruby Committers and the World"の計2回登壇することになりました。

Ruby's Line Breaks

speakerdeck.com

まずは自分のセッションの振り返りから。

今回は"Ruby's Line Breaks"というタイトルでお話をしてきました。 ここ2年くらいparserに関するトピックの全体をカバーした話をすることが多く、比較的抽象度が高い話をすることが多かったです。 たまにはすごく具体的な話をしたいなと思い、今回はテーマをRubyの文法における改行にしてみました。 改行に意味のあるコードとそうでないコードを切り口にオートマトンやparserやlex stateについて話をし、最終的にlex stateとparserを統合して1つのオートマトンにすることで現在のRubyにおけるlex stateの振る舞いや改行に関する原理原則を理解するという話に仕上がりました。 実は抽象度がそれなりに高い話だったと思うのですが、例が良かったのか、はたまたここ数年の僕の発表を聞いてみなさんの理解度が高くなっているのか、"例年に比べてよくわかりました"という感想をもらうことが多かったです。 これなら来年はもう少し難しくしても大丈夫かな。

RubyKaigiに登壇するにあたって実装だけでなく発表の内容や構成についてもいろいろと考えながら準備をしています。 この部分はこういう人に刺さるといいなとか、聞いた人はだいたいこういった感想をもつかな、といったことをあれこれ想像しながら登壇準備をしています。 "Parser界の黎明卿"がアビスの話をするというネタはちゃんと伝わる人がいるか自信がなかったのですが、特定の友人にとても刺さっていたようで満足しています1。 一方で自分が発表に臨むにあたって想定していなかった感想をもらうこともあり、今回でいうと"発表全体を通じて仮説検証のプロセスが鮮やかだった"という感想を複数の人からいただきました。 これは自分では自覚していなかったので新鮮な感想でした(が、言われれば確かにそうだなと思っています)2

というわけで質問だけでなく、わかった/わからなかった/ここまでは理解できたなどなど、みなさんが感じたことを教えていただけると発表者としてはとても喜びます。

セッションについて

自分の登壇があったりするので3日間がっつりとセッションをみることはできなかったのですが、自分がみたセッションからいくつか感想を書いておこうと思います。 会期中に直接お会いする機会があった登壇者にはその時点で感想を伝えているので、時間がたったいまどのように感じているかという点を含んでいます。

Ruby Taught Me About Encoding Under the Hood

speakerdeck.com

とてもよいオープニングキーノートでした。単にキーノートではなく、オープニングキーノートとして非常によかった。 発表に関することでいえば、全体の構成の仕方とか情報の濃淡が自分好みでした。 ブログを書くにあたってスライドをざっと読み返してみましたが、

といった点にも触れていて、Unicodeを中心に据えつつも他の文字コード文字コードそのもの、または文字というものについても含んだ発表になっていて、ima1zumiさんの興味の範囲がわかる内容でした。

CRubyという観点で言えばUnicodeData.txtなど自分が全く知らないファイルがいくつか出てきて、まだまだ自分の知らないCRubyの世界があるのだなとあらためて思いました。 と、ここまで書いていてそもそもUnicodeData.txtってどこにあるのかと思って調べてみたら、common.mkのコメントアウトされているALWAYS_UPDATE_UNICODE = yesを有効にしないといけないので、それは見たことないはずだと納得した次第です。

Make Parsers Compatible Using Automata Learning

speakerdeck.com

オートマトン学習の話は昨年のRubyKaigi 2024 follow upで聞いていたので、その復習としてふむふむと聞いていました。 自分の発表でもオートマトンの基本的な部分について簡単に触れる予定だったので、Fujinamiさんの発表がオートマトンに関する丁寧な導入になるなと思いながら聞いていました。

潮目が変わったのが中盤31枚目のスライドで、"Rubyの文法についてはkanekoさんの発表で"と突然言われて、予定外の言及に"え?え?"となっていました。

チョムスキーと自分のアイコンが同じスライドに収まっている図は何度見ても面白いです。 普通そうはならんやろ。

会期後にVisibly Pushdown Automataをあらためて調べ始めたのですが、特定のトークンでのみ常にスタックの操作が行われるという前提をいれるだけでPDAがだいぶ取り扱いやすくなるのは驚きますね。 論文としては https://madhu.cs.illinois.edu/stoc04.pdf あたりを読んでみるといいのでしょうか。

Dissecting and Reconstructing Ruby Syntactic Structures

speakerdeck.com

Rubyの文法の特徴を明らかにしたいという話と、parse.yの文法定義をリファクタリングしたいという話の2つの軸があるセッションだったと理解しました。 終端記号および非終端記号の数や、ある階層における生成規則の数といった観点からPerlPHPRubyの文法を比較するというアプローチは考えたことがなかったので、面白い着眼点だと思いました。

ydahさんの発表にもあったようにRubyの文法はstmt (statementの略), expr (expression), arg (argument), primaryという4つの生成規則が中心にいます。 自分はまだそれぞれの生成規則を真に理解しているわけではないので、それぞれを説明するための仮説を日々考えている段階なのですが、argを中心に考えるのがよいのではないかと最近は思っています。

argというのはargumentのことで、これは引数として書くことのできるものです。 そして生成規則をみるとわかる通り、全ての二項演算子argに含まれます。 つまりRubyは特定の二項演算子を特別扱いしていないと言えます。 このことは2つの制約を生み出していると思っていて、1つは二項演算子primaryにすることができないということです。 これは|a | bのように二項演算子として使われる一方で、m do |i|; endとブロック引数を囲むときの記号として使われているためです。 具体的にはm do |i = primary|; endと書いた時にprimarya | bを書くことを許すと、|がブロック引数を囲むための記号か二項演算子かわからなくなります。 もう1つは,を含む生成規則をargに入れることができないという制約です。 例えばパターンマッチをargに入れようとするとm([1, 2, 3] in a, b, c)と書いたときにa, b, cのどこまでがパターンマッチかわからなくなってしまいます。

引数に書くことができるものを中心にRubyの文法を眺めてみてはどうだろうかというアイデアが出てくるいい発表でした。

The Implementations of Advanced LR Parser Algorithm

speakerdeck.com

オートマトンとしてのLR parserについて現時点で知られていることを30分で全部紹介した発表だったと思います。 LR parserにはいくつか種類がありますが、それらはLookahead setをどのように構成するかが異なります。 Lookahead setを理解することはLR parserを理解するうえでの1つの大きな壁といえるでしょう。 この発表ではさまざまな文法の例を紹介しながらLookahead setに対する直感的で必要十分な説明を行い、IELRの説明へと進んでいきます。 今後LALRやIELRについて聞かれることがあったら"とりあえずこの発表を見てください"と紹介できる完成度の高い発表だったと思います。

Ruby Committers and the World

改行に対する警告をどうやって出すかという話になったときに、今まさに新しいlex stateが生えそうになる瞬間というのをみなさんにお届けできたので満足です。

お世話になった・印象に残ったスポンサーや本屋さんなど

Day 1とDay 3は登壇があり、Day 2はほぼ全ての時間にわたってセッションを見ていたため、今年は会場のブースをまわる時間がほとんどとれませんでした。 なかでもお世話になったり、印象に残ったスポンサーを書いておきます。

codeTakt Inc. さん

Day 2のDrinkupとDay 4のDrinkupにお邪魔しました。 Day 2のDrinkupでは鯛の塩釜焼きが印象的でした。ごちそうさまです。 Day 4のDrinkupは夕方17:30から始まって21:00までゆっくりとした時間をすごすことができて、非常に満足度の高いDrinkupでした。 会期中の熱気あるDrinkupもよいですが、終わってしまったRubyKaigi 2025をみんなでゆっくりと振り返るDrinkupもまたよいですね。 3月くらいに募集開始を知ったときは、Day 4にDrinkupをするとは随分チャレンジングだとおもったのですが、よくよく考えれば土曜の晩はまだ結構な数のRubyistが現地にいるんでしたね。

ANDPAD Inc. さん

会場で一番立ち寄ったブースです。 疲れてくると甘いものが欲しくなるので、みかんジュースをもらいに何度かお邪魔しました。 また今年はコーヒーを会場で入手するのが難しかったので、その点も大変お世話になりました。 とくにDay 1の登壇前に気合を入れるためにコーヒーを探していたときに助かりました。

SmartBank, Inc. さん

登壇前の作業のときや、ほかの登壇者と議論するときなど、今年もHack Spaceに何度かお邪魔しました。 靴を脱いで座ってなにかできるスペースがあるといろいろ捗るので毎年助かっております。 事前イベントの"プロポーザルの余白を読み解くRubyKaigi 2025"も楽しかったです。

SmartHR, Inc. さん

昨年に続き今年も"RubyKaigi 2025事前勉強会"にお邪魔させていただきました。 RubyKaigi直前は自分の気持ちを高めるためにもRubyKaigiに参加する人に会いたくなるので事前勉強会の存在はありがたいです。 5/16の"RubyKaigi 2025事後勉強会"にも参加する予定なのでよろしくお願いします。

Day 1は自分の登壇に集中していたのでDay 2にアクリルキーホルダーを集めるべく何人かにお声がけしたのですが、その時点でほぼほぼアクキーが完売していたと聞いてその人気に驚きました。

pixiv Inc. さん

今年もRubyMusicMixinをありがとうございました。 smooooch・∀・2014 が聞けて僕は満足です。

@.bookstore (本屋さん)

たぶんスポンサーではないと思いますが。 本屋さんに並べたい本はありますか?と事前に聞かれていたので1と2の書籍を入れてもらいました。 またすでに3の書籍があがっていたので、"これは良い本です"と推薦した記憶があります。 今年のRubyKaigiではオートマトンに触れているセッションが複数あったためか、順調に売れたようで良かったです。

  1. 計算理論の基礎 [原著第3版] 1.オートマトンと言語
  2. 白と黒のとびら: オートマトン形式言語をめぐる冒険
  3. 正規表現技術入門――最新エンジン実装と理論的背景

RubyKaigiよもやま話

最初に参加したRubyKaigiが2014年の船堀で、そこから10年以上が経ちました。 途中からはコミッターや登壇者として参加するようになり、特に2023年の松本からは登壇者として参加しているという感覚がおそらく自分のなかでは一番強い感覚になっていると思います3

RubyKaigiというお祭りはみんながそれぞれ一番楽しめる形で参加するのがよくて、そこにテンプレート的なお作法はないとおもっていますので、ここに書く内容はあくまで自分がどのようにRubyKaigiを捉えているかというお話です。

RubyKaigiで登壇すること

人それぞれ登壇理由があると思います。 登壇者になって初めて見える景色というものもあります。 RubyKaigiが近づくにつれて、どうしてこんな大変なことを... と思うのは登壇者ならではの楽しみでしょう。 日々考えたり調査していることに実装をくっつけてひとつのお話として整理するための機会というのが今の自分にとって一番近い感覚かもしれません。

整理した話である以上、発表には含まれないネタというのは無数にあります。 登壇後に廊下4で話をしていると、"発表では尺の都合でカットしたけど"とか"実は先々の展開としてこういうことを考えていて"といった話題がよくでてきます。 またいろいろな人からRubyKaigiで感想や質問をもらうことで、自分の中でそれまでうまく表現できていなかった要素が突然言語化できることもありますし、また新しい疑問が浮かぶこともあります。

RubyKaigiの発表というのは現地での議論を通じてRubyの開発を前進させるための導入なのかもしれません。

そういえばふと思ったんですけど、よく記号が少ないと言われますがこれってよくよく考えると単項(前置)演算子と二項(中置)演算子は多くの場合で衝突しないので、とくに単項演算子に関しては思ったより余裕があるような気がしますね5

RubyKaigiで進む開発

Day 2の懇親会でAkrさんと話をしてlex stateを本格的に消すためのもう一つの大きなピースの話になったので簡単にまとめておきましょう。

lex stateはlexerが次のトークンを決める際に参照されます。このlex stateを消すためにはparserからlexerへ次に来ることができるトークンの一覧を渡せばよいということになります。 ところでjunk0612さんの発表にもあったようにLALR parserはある基準(専門用語でいうとカーネル項集合が等しい場合)に基づいて状態をmergeします。 状態をmergeするということは、Lookahead setに含まれるトークンもmergeされます。 その結果、parserからlexerへ渡される"次に来ることができるトークンの一覧"の中に実はそのトークンをlexerが返してもエラーになるというトークンが含まれる可能性が出てきます6

この問題を対処するためにBisonの場合はLAC(Lookahead Correction)という仕組みを用意しています。これはsemantic actionを実行せずにparserの処理をすすめることでerrorを検知するという動的なアプローチです。

自分の理解ではこの問題は静的解析可能な問題のはずです。 parserのある状態を考えたときに、状態を分割することであるトークンがLookahead setに含まれなくなるかどうかはparserを生成する段階で判別できます。 IELRにおけるannotationの対象とcompatibilityをチェックする際のロジックを拡張すれば7、指定したトークンについてerrorを起こす状態とそうでない状態に分割することはできるはずです。 その結果状態数があまりに増えてしまって実用上問題がおきるという可能性はもちろんありますが、一度静的解析のアプローチを試してみたいと思っています。

1年がもたらす変化

昨年もしくは一昨年にRubyKaigiで話をした人がその後LR parserに関する理解を深めている姿を何度か目撃する機会がありました。 LR parser好きを自称する人間としては、これほど嬉しいこともないですね。 過去のRubyKaigiが今年のRubyKaigiにつながっているという発見も1つの楽しみでしょう。

発表について

今年の発表はいろいろできたことがあり自分としても達成感を感じていますが、それはそれ、これはこれ。 今回の内容はlex stateというRubyの中でも非常に複雑な機構のなかにようやく飛び込んでいくことができるようになったというお話でもありました。 その際にどうしてlex stateがこんなにも恐れられるのかをもう少し時間をかけて共有しても良かったのかなと思います。 断崖絶壁を軽々と登るにしても、そこが前人未到の断崖絶壁で非常に危険な場所だというのは丁寧に説明したうえで、軽々と飛び越えていきたい。

RubyKaigi 道中記

4/16から4/18の3日間にわたって開催されたRubyKaigi 2025に参加するために、4/10から4/20まで四国へ行ってきました。 ブログを書くにあたって再度確認したのですが10泊11日ですね(うち1泊は車中泊@サンライズ瀬戸)。

Day -5 (4/10) サンライズ瀬戸で高松へ

サンライズ出雲は何度か乗ったことがあったのですが、これまでサンライズ瀬戸に乗る機会はありませんでした。 せっかく松山に行くのであればこの機会に乗っておこうと思い、なんとか座席を確保してサンライズ瀬戸に乗車しました。 サンライズに乗車できるタイミングを優先したので、かなり早いタイミングで四国へ向けて移動を開始した人になっていたかもしれません。

Day -4 (4/11) こんぴらさん

せっかく香川に来たし琴電に乗るついでにこんぴらさんに行ってみるかと思い、琴電琴平へ移動しました。 こんぴらさんは各種神社以外にも高橋由一館・宝物館・表書院など見るところも多く楽しかったです。 階段や坂が多いので体力的も最初に行って正解でした。

Day -3 (4/12) ヤドンを探して西へ東へ

うどん県PR団ということでよくよく見てみると香川のあちこちにヤドンがいます。 ということでヤドンの列車に乗ってみたり、ヤドンのマンホールを探したりと高松市内をうろうろしていました。

Day -2 (4/13) 強風の直島

せっかくだし日帰りで離島に行くかと思い立ち直島へ行ってました。 直島では電動自転車を借りて移動することにして、ベネッセハウス ミュージアムやI♥湯など島内を一巡りしました。 午前中はとにかく強風で南瓜が波にあおられていました。過去には台風で破損しているんですね。

Day -1 (4/14) 発表準備

昼間はスライドの整理などをしながら過ごし、特急うずしおで夜に徳島へ移動しました。

Day 0 (4/15) いざ松山へ

友人に車を出してもらって大塚国際美術館へ。 10数年ぶり2回目の訪問でしたが、見るものが多くてとても満足です。

そのあとは高松駅まで送ってもらい、特急いしづちで松山へ。

高松から特急で移動するRubyistもそうはいないでしょうと思っていたところ、すぐ後ろの座席にRubyistが座っており挨拶をするなどしていました。 発表のリハーサルを何度かしつつ資料を微調整しました。 海際を走るので要所要所で造船所をみることができて良かったです。

松山到着後はキスケでotoge.rbの活動に参加して、その後はsylph01さん主催の飲み会へ参加。 最後はThe Tapへ行って翌日の登壇に向けて気合をいれるなどしました。 The Tapではnobuがいたので、lex stateってどうなんですかねというインタビューをしました。 この内容はちゃんと登壇資料にいかされています8

Day 1 (4/16) 登壇

登壇資料に埋め込む写真をとりに一旦道後温泉へ行くなどしてから会場へ入りました。 今年のRubyKaigiの特徴として3日とも朝一は緞帳がおりた状態ではじまるという演出がありました。 2025年の会場が発表されたときに愛媛県県民文化会館のホームページをみていて東山魁夷の緞帳があることを知って、"え、これ、みたいんだけど"と叫んだ記憶があります。 3日間で3枚の異なる緞帳が見れたのがよかったですね。

自分の発表もあるのでImaizumiさんとFujinamiさんの発表までみました。 そのあとは昼食を食べたり、最後の通し練習をしたり、通訳さんとの打ち合わせをしたりしていました。

登壇をするとOrganizersやHelpers以外にも、通訳の方や控え室まで案内してくださるスタッフの方、舞台の袖で登壇の進行をしているスタッフの方などとも関わります。 いつも登壇直前でテンパっているにも関わらず、スタッフの方は落ち着いた様子で接してくださり非常に助かっています(ということを思い出せるくらいには今年は落ち着いていた、はず)。

登壇後はいつもの通りグッタリしていたので、ホールで休んだりおやつを食べたりして過ごしていました。

その後はOfficial Partyに参加していました。 ご飯もビールもよかったですが特にライトアップされた松山城がよかった。

Day 2 (4/17) セッションを聞いたり鯛の塩釜焼きを眺めたり

7/8の枠でセッションを聞いていた一日でした。 夜はcodeTaktさんのDrinkupに参加して、そのあとは寄り道せずにホテルにもどって就寝しました。 この辺でちゃんと休んでおかないと後半戦がもたないと判断したためで、この判断は正しかったと思います。 RubyKaigiは長期戦なので。

それにしてもRubyKaigiが始まるとセッションを聞いているか誰かと話をしているかになるので、自分の場合はツイート数が急に減りますね。

Day 3 (4/18) 最終日

ここまで道後温泉に入る時間が取れていなかったので朝の時間を利用して温泉に行ってきました。 去年のRubyKaigi Day3に集合時間を直前まで勘違いしていたという実績があるので、今回はちゃんと時間を確認してからいきました9

Ruby Committers and the Worldでは壇上でlex stateの増加に待ったをかけるという重要な仕事をしました。 この辺うまいこと文法ファイルに記述できるようにしたいところです。

お昼はフルーツパーラーみしまでパフェを食べてました10

夜は自社のDrinkupに参加してからRubyMusicMixinそしてThe Tapと、流れるように移動してました。 この日が一番遅くまで起きていたように思います。

Day 4 (4/19) 松山観光

夕方のDrinkupまで時間があったので松山をぶらりと観光していました。 夕方からはcodeTaktさんのDay 4 Drinkupに参加しました。 時間の流れがゆったりしていて心地よかった。

そのあとは数人で道後温泉で結構遅くまで話をしていました。 RubyKaigiについて話をする機会はRubyKaigiのときくらいしかないので、一度話始めるとなかなか終わらないんですよね... 11

Day 5 (4/20) シーパセオ

帰りは松山観光港から広島港へフェリーで移動し、そこから新幹線で帰りました。 シーパセオというフェリーに前から乗りたいと思っていたのと、呉を海側から見てみたいというのがあったので、その両方を満たせるルートを選びました。

ということで長きにわたったRubyKaigi 2025もこれでおしまいです。 お疲れ様でした!


  1. 元ネタは RubyKaigi 2024が終わったのでまずはクソデカ感情の処理をさせてください - そんなことはさておいて
  2. こういう自分が無自覚に行なっていることに言及されるのも登壇の醍醐味だと思っています。
  3. なので登壇直前に"あー。ごめんなさい。いま余裕がないので、登壇後にお願いします!"ということがあります。
  4. 発表中のホール以外の場所を指す言葉。発表後の舞台下、文字通り廊下、ハックスペース、懇親会会場、懇親会へ向かう道中などRubyistが議論をしている場所が廊下です。今年はRubyMusicMixinの会場も廊下になっていたのでRubyKaigi中あらゆる場所が廊下であることがわかります。
  5. といったように突然アイデアが思いついたりします。
  6. このようなトークンがlexerから返ってきた場合、parserは複数回のReduceとGotoを繰り返し最終的にそのトークンをShiftできないという形でSyntax Errorが発生します。
  7. IELRとはこちらがうまく指示すればいい感じに状態を分割してくれる機構くらいの抽象度で捉えるとアイデアがわくかもしれません。
  8. このように発表資料は登壇直前まで変わる可能性があります。今年の場合はさらにDay 1のFujinamiさんの内容をうけてスライドを1枚追加しています。
  9. 去年は優雅に朝ごはんを食べていたところ、偶然お店に入ってきたhasumikinさんに"え、時間は!?"と言われて気がついたのでした。その節はありがとうございました。
  10. 正確にはお昼は会場のキッチンカーのご飯を食べたのでパフェはおやつ。会期中は常に空腹モードなので...
  11. https://x.com/hasumikin/status/1913629574442959234をみると午前 1:23などと書いてあったりする。なぜ...



以上の内容はhttps://yui-knk.hatenablog.com/entry/2025/04/29/115141より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14