Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kai
February 03, 2026
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Kai
February 03, 2026
More Decks by Kai
See All by Kai
CloudTrail 見ろ、ドキュメントちゃんと読め
aki_pin0
0
54
AmazonConnectを コンタクトセンターと 呼んでいた頃
aki_pin0
0
38
Rubyが好きな話
aki_pin0
0
37
Other Decks in Programming
See All in Programming
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
160
JIS keyboard support in Omarchy
lef237
0
120
Performance Optimization With LLMs
xleitix
0
110
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
320
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Event is what happens
moro
2
850
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
Railsバージョンを4倍にした話
optim
0
440
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.2k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Odyssey Design
rkendrick25
PRO
2
870
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
New Earth Scene 8
popppiees
4
2.7k
It's Worth the Effort
3n
188
29k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Visualization
eitanlees
153
17k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
570
KATA
mclloyd
PRO
35
16k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
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という異なるアプローチ まとめ