Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kai
February 03, 2026
Programming
0
110
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Kai
February 03, 2026
Tweet
Share
More Decks by Kai
See All by Kai
AmazonConnectを コンタクトセンターと 呼んでいた頃
aki_pin0
0
13
Rubyが好きな話
aki_pin0
0
22
Other Decks in Programming
See All in Programming
個人開発は儲からない - それでも開発開始1ヶ月で300万円売り上げた方法
taishiyade
0
110
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
440
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
2k
株式会社 Sun terras カンパニーデック
sunterras
0
1.9k
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
1
190
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
430
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
300
今から始めるClaude Code超入門
448jp
8
9.5k
CSC307 Lecture 09
javiergs
PRO
1
850
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
140
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
170
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
300
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
820
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
190
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
170
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
63
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
130
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
130
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
130
Practical Orchestrator
shlominoach
191
11k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Utilizing Notion as your number one productivity tool
mfonobong
3
230
Transcript
Kai ふん…おもしれぇ Parser。 RubyKaigi 行ってやるぜ
None
楽しみですね!
いろんなトピックのセッションがある and more…
中でも…
Parserのセッションが多い!
他言語のカンファレンスと比較 カンファレンス 総セッション数 Parser 関連 割合 RubyKaigi 2025 57件 4件
7.01% PyCon US 2025 75件 1件 1.30% GopherCon UK 2025 22件 0件 0% RustConf 2025 23件 0件 0% ※ Claude調べ 間違ってたらごめんなさい
こんな画像も落ちてた
一方で
よくわからない …
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題
利用者間 ⇔ 言語開発者でギャップがあるかも? Parser 言語開発者 利用者
利用者間 ⇔ 言語開発者でギャップがあるかも? Parser 言語開発者 利用者 もったいない!
とはいえ、難しいものは難しい
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない それはそう
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない それはそう
見えてほしい!
• 私:私の考える Ruby Parser おもしろポイントを喋る • 皆さん:Parser 関係のセッションに興味が湧く • 技術的な話はほぼしません!
• 厳密に正しくない説明もします! 目的:
おもしろポイント
おもしろポイント 言語の思想に基づく 内部実装の複雑性の解消
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
他言語との比較:実装 → 完成まで 簡単: 複雑: 他言語: SyntaxError RuntimeError RuntimeError SyntaxError
SyntaxError
他言語との比較:実装 → 完成まで 簡単: 複雑: SyntaxError RuntimeError RuntimeError 簡単: 複雑:
他言語: SyntaxError RuntimeError RuntimeError SyntaxError SyntaxError ※ この辺はトレードオフなので、他言語を貶める意図はありません
• 動的な型付け • 自然言語に近い書きやすい文法 • エラーよりも実行可能側に倒す ◦ 許容される文法が多く、SyntaxErrorを起こしづらい ◦ 実行時もエラーを値で返すものが多い
文法における Ruby の思想
自然言語に近く人間に優しい wakate.rb は楽しいイ ベントでした ◎ イベント楽しい wakate.rb サイコー wakate.rb で
したイベントは ◯ ?
自然言語に近く人間に優しい wakate.rb は楽しいイ ベントでした ◎ イベント楽しい wakate.rb サイコー wakate.rb で
したイベントは ◯ ? つまり錬金術の基本は等価交換 !! 何かを得ようとするなら それと同等の対価が必要って事だ — 鋼の錬金術師 エドワード・エルリック
自然な文法の対価 Parser 内部実装の複雑性
その前に:① lexer と parser lexer parser スクリプト トークン列 構文チェック •
lexer:構文チェックの前処理としてスクリプトをトークン列に変換 • parser:トークン列を読んで構文を確認 ◦ OK:以降の処理に移る ◦ NG:SyntaxError ◦ ※ 本当はASTの構築をしていますが今回は省略
その前に:① lexer と parser wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞
名詞 助動詞 句点 楽しいはイベントです wakate.rb。 形容詞 接続詞 名詞 助動詞 名詞 句点 lexer parser スクリプト トークン列 構文チェック
その前に:① lexer と parser 1 + 2 * 3 NUMBER
OPERATOR NUMBER OPERATOR NUMBER 1 +* 2 3 NUMBER OPERATOR OPERATOR NUMBER NUMBER lexer parser スクリプト トークン列 構文チェック
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 tokenize
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 tokenize 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 tokenize 還元 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 tokenize 還元 還元 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 [主題句 述語句] 句点 [文] 句点 tokenize 還元 還元 還元 還元
その前に:② parser の構文チェック方法 1 + 2 * 3 NUMBER OPERATOR
NUMBER OPERATOR NUMBER NUMBER OPERATOR [EXPRESSION] [EXPRESSION] NUMBER OPERATOR [NUMBER OPERATOR NUMBER] [NUMBER OPERATOR EXPRESSION] PROGRAM EXPRESSION tokenize 還元 還元 還元
ruby の複雑性 同じ文字列でも tokenize の結果が異なる場合がある
同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞
名詞 I book it. 名詞 動詞 名詞 前の品詞や周囲の文字列によって次の tokenize の結果が異なる
同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞
名詞 I book it. 名詞 動詞 名詞 手前の単語を先に 還元しておかないと、次の単語の品詞を決定できない ➢ lexer の処理 (tokenize) に parser の処理結果が必要になる The people to run book it. [名詞句] 動詞 名詞
同じ文字列でも tokenize の結果が異なる例 前のトークンや周囲の文字列によって次の tokenize の結果が異なる ➢ 前のトークンが確定するのは …? ➢
parser による還元が終わった後 tOR として tokenize それぞれ tokenize
lexer と parser の密結合 他言語: lexer parser スクリプト lexer parser
スクリプト トークン列 構文チェック
• 他にも様々な要素によって tokenize の結果が変わる • Ruby ではそれを 状態 として構造化 lexer
と parser の密結合 lexer parser tokenize 状態の更新 還元 状態の更新 スクリプト
魔境爆誕
• メンテナビリティ • エラー許容性 • 移植性 • パフォーマンス 他にも様々な課題 https://techracho.bpsinc.jp/hachi8833/2023_07_10/131808
➢ これらの課題に立ち向かうため、 2つの Parser() が誕生!
• 手書きの再帰下降 parser • 現在のデフォルト • 高いエラー許容性 • ASTへの豊富なAPIの提供 •
高い移植性 • parser プログラムを生成する ruby ライブラリ (parser ではない) • 保守性を大きく改善 • これまでと異なるアルゴリズムの採用 2つのParser の誕生 Prism Lrama
• 魔境と呼ばれた parse.y に2つの全く異なるアプローチでアタック ◦ 手書きの再帰下降 parser ◦ parser generator
• Prism:過去と全く異なるモダナイゼーション • Lrama:革新的な parser アルゴリズムの実証 魔境の開拓 ➢ CS/構文解析の歴史においても鮮烈な状況がたのしい!
興味出た?まずは過去セッションをチェック! Prism Lrama https://youtu.be/3vzpv9GZdLo?si=_jWMZBGsDNAUYhnP https://youtu.be/CjYLcnlXO2Y?si=TgrMXn-OuFDJ8_qI
他にもチェックチェック • https://yui-knk.hatenablog.com/entry/2023/11/01/082815 • https://yui-knk.hatenablog.com/entry/2023/12/06/082203 • https://gihyo.jp/article/2024/01/ruby3.3-lrama • https://gihyo.jp/article/2024/01/ruby3.3-prism •
https://techracho.bpsinc.jp/hachi8833/2023_07_10/131808
• Ruby は自然言語的に書ける楽しい言語 • 文法を実現するために、Parserの内部実装は複雑化 • 保守性以外にも様々な課題 • それに立ち向かうため、PrismとLramaという異なるアプローチ まとめ