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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kai
February 03, 2026
Programming
0
120
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Kai
February 03, 2026
Tweet
Share
More Decks by Kai
See All by Kai
CloudTrail 見ろ、ドキュメントちゃんと読め
aki_pin0
0
20
AmazonConnectを コンタクトセンターと 呼んでいた頃
aki_pin0
0
17
Rubyが好きな話
aki_pin0
0
27
Other Decks in Programming
See All in Programming
「抽象に依存せよ」が分からなかった新卒1年目の私が Goのインターフェースと和解するまで
kurogenki
0
120
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
950
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.2k
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.8k
Fundamentals of Software Engineering In the Age of AI
therealdanvega
1
250
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
180
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.3k
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
510
How to stabilize UI tests using XCTest
akkeylab
0
130
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
290
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
540
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
420
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
76
Git: the NoSQL Database
bkeepers
PRO
432
66k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
100
Unsuck your backbone
ammeep
672
58k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
470
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
85
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Mind Mapping
helmedeiros
PRO
1
120
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
71
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という異なるアプローチ まとめ