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
typoなんかねぇよ
Search
らすぴー
August 22, 2026
Programming
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
typoなんかねぇよ
別題: typoなんかねぇよをCPythonでやろうと思ったら深淵に飲まれ溺れ死んだのでみなさんも道連れにしたい
らすぴー
August 22, 2026
More Decks by らすぴー
See All by らすぴー
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
730
高校のChromebookでも自由なネット環境を!
raspython3
0
230
限界環境CPython rev. seccamp2025
raspython3
0
76
kernel-vm-ittekita-yuukousai
raspython3
0
130
kernelvm-brain-net
raspython3
0
1.2k
pyconjp2024-wince
raspython3
0
79
seccamp2024-edictionary-python-TLS
raspython3
0
64
Other Decks in Programming
See All in Programming
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
180
信頼性の目標を誰も求めてない
shubox
0
500
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
430
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
140
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
460
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
460
新卒PdEのリアル
ryu1013
1
470
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
110
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
150
AIの中の人になってみる
htkym
0
170
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.9k
The Language of Interfaces
destraynor
162
27k
Claude Code のすすめ
schroneko
67
230k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Building Applications with DynamoDB
mza
96
7.2k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
240
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Technical Leadership for Architectural Decision Making
baasie
3
560
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Transcript
typo らすぴー / RasPython3 (𝕏:@RasPython3) 2026-08-22 Kernel/VM探検隊@東京 No19 1
2 活動名 RasPython3 / らすぴー X: @raspython3 seccamp’24 全国 seccamp’25
& ‘26 チューター 普段やってること 各種ウェブツールづくり 電子辞書いじり ゲーム内コーディング ネットワーク関連 etc.
3 ?
4 実装の流れって、おおまかに描くと... 実装 設計・計画 PDCAサイクル 運用・公開など デバッグ
5 それぞれの中身は場合によってさまざまだが... 実装 設計・計画 デバッグ 運用・公開など
6 Q. 必ずここでやることってありませんか...? 実装 設計・計画 デバッグ 運用・公開など
7 A. 「typo」などの修正 実装 文法ミス・誤字修正 コンパイラやリンカのエラーの解消 設計・計画 デバッグ 運用・公開など
typo typo(タイポ)とは? タイポとは、印刷物の誤字や脱 字を意味する俗語。転じて、 キーボードのタイプミスなどで 生じた英単語の綴り間違いや誤 入力、誤記、日本語の誤変換な どを指す。 (e-wordsより) 8
例えば... • 英単語のつづりの勘違い • recommend→recommand • master→mastar など • 似た単語と勘違い • extend→expand • exception→error など • キーボードの打ち間違い • python→pyhton • ls→sl など
typo 9 typoの修正方法 typoの種類 修正方法 英単語のつづりの勘違い 検索&置換で一括修正 英単語を覚える 似た単語と勘違い 混在していなければ
検索&置き換えで一括修正 キーボードの打ち間違い 実行してエラーになった場所を ひとつづつ修正
typo 10 typoの修正方法 typoの種類 修正方法 英単語のつづりの勘違い 検索&置換で一括修正 英単語を覚える 似た単語と勘違い 混在していなければ
検索&置き換えで一括修正 キーボードの打ち間違い 実行してエラーになった場所を ひとつづつ修正
typo 11 その1: エディタに教えてもらう 最近のコードエディタにはハイライト機能がついているものも多い 便利な時代になったもんじゃのう...(謎視点)
typo 12 その2: 静的型チェックや文法チェックを導入する その1の方法はこれをプラグインなんかで簡単に実現してくれている ...のだと思う ただ書き切ってからチェックするので防ぐというよりは見つける方法かも 便利な時代に(以下略
typo • その3: AIに丸投げする AIはキーボードなどというミスしやすい物理入力装置を使わないので、 打ち間違いの概念自体をなくせる 13
typo • その4: typoした宇宙を破壊してTypoしなかったことにする 量子ボゴソートみたいに、typoがあるかチェックして、真ならその宇宙を破壊す ることで、typoしなかった世界線のみが残る その世界ではtypoを観測していない = typoを防げている(?) でも今の世界線ではtypoは頻繁に観測されているのでダメそう
14
15 前述の有効な方法(その3,4を除く)は、結局 「typoしてもすぐに気づいて修正しやすくする」 というもの →根本的にtypoを防げているわけではない
typo 16 一番無くしたいのは、キーボードの打ち間違いによるtypo その中で体感的に多いのは、「キーを押す順番のずれ」 これをどうにかしたい
17 「アナグラム」...ってご存じですか?
18 ある文字列の文字の並びを入れ替えて得られる文字列 tokyo brain kyoto biran
─── アナグラムなら許容するようにすれば 文字が入れ替わってもエラーを回避できるのでは? 19
20 例えば... example = “This is example.” print(examlpe) 本来ならNameErrorになるが、exampleとexamlpeはアナグラムなので 「This
is example.」が出力される
21 しかし問題点も... Web APIには、base64をデコードする「atob」とエンコードする 「btoa」が存在する →しかしatobとbtoaはアナグラムなのでどちらかが使えなくなる →じゃあダメじゃん →(´・ω・`)
22 「タイポグリセミア」...ってご存じですか?
23 単語の最初と最後の文字が正けしれば、 中間の文字の順序が入れ替っわいてても気付かず読てめしまう現象 単語の最初と最後の文字が正しければ、 中間の文字の順序が入れ替わっていても気付かず読めてしまう現象
─── アナグラムでタイポグラセミアなものを許容するようにすれば 文字が入れ替わってもエラーを回避できるのでは? 24
25 予約語(キーワードなど)や型名、クラス名、変数名などについて、 アナグラムかつタイポグラセミア(長いので以降「雑グラム」)なものま で容認するように、言語の文法自体を改変 →そもそもtypoがtypoでなくなる(タイトル回収) 文字列やヘッダー名、 モジュール名などは除外 例えばPythonなら→ これが動く(キモチワルイネ)
26 利点 • typoを気にせずに済む = non-stressなコーディングを実現 欠点 • 普通に既存コードの動作が破壊されかねない •
いちいち雑グラムになってないか考えることになって面倒 • そんなにtypoが嫌いか? • 自分含め実用したいと思う人いないだろ • そもそもtypoする人間が悪い すべて無視できるものとする
27 Q. 普通にバッドというかゴミカスプラクティスでは? A. 私もそう思います。でもんなことは知らねぇ Q. まともな使い道あるんか? A. 実装直後の初回実行にはいいんじゃないかな...? 雑グラムの判定はstrcmp/strncmpを置き換える形になるので、
完全一致でない場合に警告を出しておけばtypoだった箇所も把握 できる 要は動作のバグ確認とtypo確認をまとめてやりたいという動機
28 • じゃあ実際に既存言語でやってみよっか • この手法自体はコンパイル言語でもインタプリタ言語でも使えると思う が... • コンパイラはまともにいじったことも自作したこともない • そういえばCPythonは電子辞書に移植する過程でパーサと実行処理以外
そこそこ読んだことある • じゃあCPythonを改造してCPyhtonにするか
29 CPythonの現在の安定バージョンは3.14.x なので3.14ブランチをgit clone • iOSとかのサポートが入ったりしてかなり ディレクトリが増えたなぁ... • 今回興味があるのは「Parser」のみ
30 • Parser/ には、Pythonプログラムを構文解析して構文木(AST)にす るためのあれやこれやが入っている • とりあえずここに雑グラムチェックの check_anagram関数の実装を追加 • まあここまでは序の口だよね
31 どうせ一致判定なんてstrcmpかstrncmpでやってるから検索をかける (↑死亡フラグなので覚えておいてね!) Parser/pegen.cの • _get_keyword_or_name_type • _PyPegen_expect_soft_keyword • _PyPegen_soft_keyword_token
という「ぽい」感じの関数がヒット しかもpegen.cでほかにヒットした箇所はない
32 • じゃあpegen.cの先頭に #define strcmp(a,b) (...) #define strncmp(a,b,n) (...) という感じのstrcmp系ハイジャックマクロを設置してやろう
• そしてビルド
33 試しに... improt this →動いた~~~!
34 じゃあ import time して tmie が使えるか? →ン...?
35 通常Pythonでちょっと検証をば
36 • SyntaxError • NameError ... 文法的な誤りがあったときのエラー ... 変数などの名前解決ができないときのエラー よく考えたら変数の名前解決って文法解析でやることではないな
特にPythonは • x = 2 • exec(“x = 2”) • globals()[“x”] = 2 みたいに数多の方法で変数などの代入ができるからどう考えてもパーサの仕事 じゃない じゃあ、どこで...?
~ 37 これもしかして... 実行処理まで潜らなきゃいけない...?
38 ここでタイトル変更のお知らせです
typo CPython らすぴー / RasPython3 (𝕏:@RasPython3) 2026-08-22 Kernel/VM探検隊@東京 No19 39
3 40 この時点で昼前の〇ークリッドさんが出てくる発表が行われている 時間がない!時間がない!時間がない! 急がないと単独死!
CPython • といっても数年前(3.10時代)に ある程度把握しているのでそんなに 苦じゃない(はず) あとさすがに関数単位でお出しすると 時間が足りないので... おおまかにはこんな感じ 一番下が今回の主題 41
Preinitialize (cmdline引数の処理など) Python/preconfig.c など Core Initialize (import処理や乱数器の初期化・インタプリ タの作成) Python/pylifecycle.c など Initialize (コアモジュールのimport・ストリームの初 期化など) Python/pylifecycle.c など Run (インタプリタによるプログラムの構文解析 および実行) Python/pythonrun.c など
CPython 42 対話モードだったりファイルからの実行だったりで途中分岐するが、 さすがに名前解決の実装は共通(じゃなきゃ詰む) →特定の条件下での流れを追いかけよう 条件といっても簡単で、ここでは 「Pyファイルをコマンドライン引数で与えて実行する」 とする
CPython 43 関数単位では出さないといったな、あれは嘘だ (細かい解説をするのが大変なので関数名で検索かけて追いかけてみ てね) _PyRun_AnyFile→_PyRun_SimpleFile→_PyRun_File →_PyParser_ASTFromFile ここでParser/以下にジャンプして構文解析
CPython • _PyParser_ASTFromFileの結果(mod_ty型,多分構文木かな?)を run_modに渡す run_mod→_PyAST_Compile + run_eval_code_obj • _PyAST_Compileが返すのはPyCodeObject*型(おそらくバイトコー ドに近いもの)
• それをrun_eval_code_objに投げる • 名前的にいかにも実行していてめちゃくちゃ怪しい 44
CPython run_eval_code_obj→PyEval_EvalCode • ここで Python/pythonrun.c から Python/ceval.c にジャンプ • そろそろ深部に近づいてきたかな...?
• しかもこのceval.c、3730行ある → 怪しい:eyes: 45
CPython • 見たところ、PyEval_EvalCode はglobalsとかいろいろ持ってる • PyFrameConstructorなるものの初期化をしている • (裏取りをしていないが)Pythonでエラー出た時に見るトレース バックのアレに関係していそう 46
CPython 47 • 寄り道しそうになったが先を急ごう(マジで) PyEval_EvalCode→_PyFunction_FromConstructor + _PyEval_Vector • ここで Objects/funcobject.cにある
_PyFunction_FromConstructor の実装をチラリ • ...ん?
48 • なんか変だぞ??? • constrは前述の PyFrameConstructorのポインタ • それに今から呼び出す関数の名前が引っ付いている...? • もしかしてもう名前解決終わった後じゃね?
49 • もしそうだとしたら、たぶん解説すっ飛ばしたどこかのタイミン グでやってたんだろうけど • でもどこで...? • というわけでスライドを少し戻ってみましょう
50 > _PyAST_Compileが返すのはPyCodeObject*型(おそらくバイト コードに近いもの) ↑怪し~~~~~~~~
51 • 一応「構文木をマジで変換しただけで一見変に見えるけどまだ名 前解決走ってない」という線があることに寝不足の頭で気が付く • どっちだこれ... • 両方調べてたら時間足りない • そんな時は!
52 + fprintf(stderr, ...); ×2
53 見にくいけど、NameErrorは_PyAST_Compileより後に発生している →じゃあ最初のルートで合ってたんじゃねぇか
CPython 54 • なお今HDMIキャプチャLinuxの発表が終わったところ(14:07) • 時間がない PyEval_EvalCode→_PyFunction_FromConstructor + _PyEval_Vector →_PyEvalFramePushAndInit
+ _PyEval_EvalFrame ...あれ? _PyEval_EvalFrameの実装どこだ?
CPython • 迷子センターagに問い合わせたらヘッダーファイルにinline記述 • なにやら条件分岐があるな • え~調べるのめんどくせぇ... • どうせカスタム 用途だろうから
~Defaultで 突っ込む 55
CPython • この辺から何が何だか分からなくなってくる • 再帰とかいろいろごちゃごちゃしていて読みづらい • これを読み解くには睡眠時間という名のMPが不足している • (´・ω・`) 56
57 • でもまあ大体どの辺が怪しいかは分かった • ここまでは時系列に対して順方向に追いかけてきた • 逆にNameErrorが出る場所を探って時間を逆行すればいいのでは?
58 • Pythonのドキュメントへ... • C APIのドキュメントに例外クラスの一覧がある(助かる) https://docs.python.org/ja/3.14/c-api/exceptions.html#c.PyExc_NameError
59 • PyExc_NameErrorを指名手配 •お • でも例外を設定するPyErr_SetStringとかPyErr_SetObjectがない • たぶんまた別のところで設定されてるな? • 引っ掛かった行を探る
60 • なんか NAME_ERROR_MSG というマクロが出てくるな? • いつも出てくるメッセージの正体はお前だったのか • じゃあこの辺で確定っぽい •
でもSetMessageしているのは誰...?
61 • じゃあ今度は NAME_ERROR_MSG を指名手配じゃ • 画像小っちゃくてごめんね • ceval.c以外にもいくつか あるな
62 bytecodes.c • 見たところ、辞書からキーを削除したりloadしたり • オイなんかglobalsいじってるんだけど • お前か? ceval.c •
こいつもglobalsからloadしたりしてるっぽい • あとなんか _PyEval_LoadName ってヤツがいるぞ • お前らもしかしてグルか??
63 • どれが正解かわかんねぇ • 今15時ちょうどで某電子辞書系登壇者の2人目がデモをしてる • 時間無ぇ • そんなときは! •
fprintf(stderr, ...)を乱発
64 • 2か • _PyEval_LoadNameに仕込んだヤツか • でも果たしてこれだけだろうか • クラスのattrだとどうなる? •
モジュール関数は?
... 65 • なんかdelのほうは引っ掛から ないな... • なんならクラスのattrとか module関数は別のエラーじゃな いか...
66 • いやまあやるしかないからやるけど • AttributeErrorは指名手配によりceval.cが発しているっぽいこと が分かるのでfprintf追加 • delのNameErrorはどこ...? • と思ったら普通にexecutor_cases.c.hにそれっぽいのがいる
• と思ったけどfprintfが呼ばれないのでここじゃねぇ • generated_cases.c.hのほうだった模様
rrrrr... • でもまだAttributeErrorがヒットしない • お前どこだよ... • 逆にAttributeErrorのメッセージ「~ has no attribute
~」を 指名手配 • なんかたくさんヒットするんだけど... • moduleobject.cとかいろんなところに散らばっている...? • そろそろ疲れた(15:32) 67
( ・ω・`) • 全部やるには時間が足りない • とりあえず途中で出したキモチワルイプログラムだけでも動かし たい • 見ている感じ、PyDict_GetItemRefとか PyMapping_GetOptionalItemが検索に使われている様子
• こいつに手を加えちゃえ 68
PyDict_GetItemRef • 辞書型に格納された要素の参照をgetするヤツ(多分) • ちなみに辞書型ってまずキーのハッシュを使ってうまいこと偏りをいい 感じにしてくれるんですよ(雑) • strcmpやstrncmpじゃないからサクッとはできない • だからハッシュの計算関数にも手を入れなくちゃいけない
• ちょっと奥地過ぎませんか?? • いやまあやりますけど... • さすがに余裕がないので解説は割愛しようかな 69
70 • ここまでたどり着いたけど • ここには普通にバイナリっぽいものも流れてくるようで... • 15:55 • これは無理だ...
71 • Typoをtypoじゃ無くそうとしたらPythonの底の底まで探検する 羽目に(Kernel/VM探検隊の探検隊の部分) • もはやtypoをいちいち直すほうが楽な気がする • もし自作コンパイラに積んだりする人がいれば遊ぶので教えて