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
typoなんかねぇよ
Search
らすぴー
August 22, 2026
Programming
100
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
690
高校のChromebookでも自由なネット環境を!
raspython3
0
210
限界環境CPython rev. seccamp2025
raspython3
0
65
kernel-vm-ittekita-yuukousai
raspython3
0
120
kernelvm-brain-net
raspython3
0
1.2k
pyconjp2024-wince
raspython3
0
70
seccamp2024-edictionary-python-TLS
raspython3
0
57
Other Decks in Programming
See All in Programming
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
160
Android CLI
fornewid
0
230
FastAPI の並行処理モデルを完全に理解する
hoto17296
3
1.2k
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1.1k
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.9k
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
180
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
160
Featured
See All Featured
Fireside Chat
paigeccino
42
4k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Skip the Path - Find Your Career Trail
mkilby
1
190
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
A better future with KSS
kneath
240
18k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.4k
How to make the Groovebox
asonas
2
2.3k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
260
Test your architecture with Archunit
thirion
2
2.4k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
220
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
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をいちいち直すほうが楽な気がする • もし自作コンパイラに積んだりする人がいれば遊ぶので教えて