SlideShare a Scribd company logo
1 of 36
Download to read offline
CPythonを読もう
Akira Nonaka


2022/1/22


PyCon九州
自己紹介
1. 株式会社XOXZOのPythonプログラマ


2. スクラム(Agileでないやつ)を組みます


3. たまに空も飛びます
XOXZOについて
•SMSと音声電話のAPIビジネス,EZSMSというGUIサービ
スを運営しています


•開発は100%PythonとDjango


•設立時(2007)から完全リモートワーク


•2021/9 株式会社アクリート(マザーズ)の子会社
なぜCPythonを読むのか?
1. もう少し後になってから話します!
道具は?
1. CLion
ソースコード取ってくる
1. https://github.com/python/cpython
ビルド
1. ./con
fi
gure


2. make (M1 Macbook airで2分くらい)


3. ./python.exe
ソースコードのディレクトリ
•Grammar/


•Python syntax de
fi
nition in PEG


•PEP 617 -- New PEG parser for CPython


•Parser/


•Language parser (generated from PEG grammar)


•Tools/


•Supporting tools to build python including peg_generator
ディレクトリ
•Python/


•Python interpreter code


•Objects/


•Built in objects


•Modules/


•Standard libraries, built in modules


•Programs/


• Main entry point.
処理の流れ
構文解析


コンパイル


実行


字句解析
字句解析
• ソースコードのテキストファイルを読み込み、意味のあ
るトークン(プログラムの最小構成単位)に分割する。


• トークンの例


• 予約語 : def, class, import


• 定数: 100, “Hello”


• 変数名:x, y, foo
字句解析
y = x + 5
構文解析器(パーサー)
字句解析器からトークン列をうけとり、抽象構文木を作る


構文が正しいかチェックする
構文解析
y = x + 5
=
+
y
5
x
コンパイル
• 抽象構文木からバイトコード(.pyc)を生成する
実行
• 仮想マシンがバイトコードを実行する
CPythonのメインループ
•PyRun_InteractiveOneObjectEx() in pythonrun.c


• _PyParser_ASTFromFile()


• トーカナイザを呼び出し、トークン列をAST変換する


•https://github.com/python/cpython/blob/
5d569ef9dd57cf03473ef0c04f0e58b6c5cb5d04/
Python/pythonrun.c#L195
run_mod(mod,
fi
lename, d, d,
fl
ags,
arena);
•PyCodeObject *co = _PyAST_Compile(mod,
fi
lename,
fl
ags, -1, arena);


• ASTをバイトコードにコンパイル


•PyObject *v = run_eval_code_obj(tstate, co, globals,
locals);


•バイトコードを実行する


•Using thread state, globals and locals
構文解析について少々
CPython の構文解析器
1. Parser/parser.c


2. 読み解こうとしない方が賢明です


3. $ wc -l parser.c


32831 parser.c


4. 人が書いたプログラムではありません


5. $ head -1 parser.c


// @generated by pegen from ./Grammar/python.gram
Parser Generator
•Input: Grammar/python.gram


•Output: Parser/Parser/parser.c


•Parser Generator


• Tools/peg_generator/pegen/


• This is python module.


• So, in order to build python, python is required.


• PEP 617 -- New PEG parser for CPython


• https://www.python.org/dev/peps/pep-0617/
PEG パーサー
•3.9で導入されました


•3.9 では新旧パーサーが混在していて、ソースコードの
パーサー部分は、とても読み辛いです


•3.10で、旧パーサーのコードが取り除かれ、すっきりと
読みやすくなりました
Demo: パーサーで遊ぶ
1. vi Grammar/python.gram


2. make regen-pegen


3. make


4. ./python.exe
構文解析の !
Python のコードブロック
1. 言語処理のスタンダードでは、構文解析器が字句解析
器を呼び出しながら処理を進めていく。字句解析器と
構文解析器のインターフェースはトークン


2. 伝統的なプログラム言語(C,Java,…)では、コードのブ
ロックを明示するトークン “{, }, end, …” が存在する
C のコードブロック
if (式) {
ステートメント1
ステートメントn...
} else {
ステートメント1
ステートメントn...
}
なぜCPythonのソースコードを読むのか?
1. Pythonのコードブロックはインデントで始まり、アン
インデントで終わる。つまりトークンが存在しない!


2. Pythonの字句解析と構文解析はいったいどうなってい
るのか? その を解明するため!
答え:


字句解析器がんばる!
字句解析器
•tok_get() in tokenizer.c


•入力からテキストを読み込みトークンを返す


•トークン (終端記号) の例


•Keywords


•Variable names


•Numbers


•Etc.
字句解析器
•行指向、状態を持つ


•struct tok_state (tokenizer.h) 


•indent-stack に全てのインデントのカラム位置を保存している


•インデントが深くなると、そのカラム位置を indent-stack に push し、仮想的トー
クン INDENT を返す


•インデントが浅くなると、indent-stackからデータpopして、仮想的トークン
DEDENTを返す


•https://github.com/python/cpython/blob/
28be3191a9db2769ed05e55c6bcbccdd029656dd/Parser/tokenizer.c#L1205
struct tok_state
•Holds the state of the tokenizer


•Line buffer


•Indent stack


•etc.


•https://github.com/python/cpython/blob/
28be3191a9db2769ed05e55c6bcbccdd029656dd/
Parser/tokenizer.h#L31
Block de
fi
nition in PEG
block[asdl_stmt_seq*] (memo):
| NEWLINE INDENT a=statements DEDENT { a }
| simple_stmts
結論
•インデント処理は、字句解析器が頑張っている
•構文解析器の立場からみると、Pythonのコードブロック
は、伝統的言語のそれとなんら変わらなく見える
•従来の構文解析の理論、テクニック、ツールなどが、そのま
ま適用できる
•これは非常にエレガントな実装であると感動!
副産物として得られた、あまり役に
立たない知識
•インデントスタックは、インデントのカラム位置を覚えてい
る
•スタックの上限は100
おまけ
•CPythonにpull requestを出した話
•https://devguide.python.org/pullrequest/#licensing
•Issueを作る
•https://bugs.python.org/issue44345
•CLAへの同意
•PRを2回間違えた
•git logに名前が出てくるのは悪い気分ではない
•comitterはみんな優しかった

More Related Content

What's hot

中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)NTT DATA Technology & Innovation
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!masakazu matsubara
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私Atsushi Odagiri
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないCarnot Inc.
 

What's hot (20)

中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
PyCUDAの紹介
PyCUDAの紹介PyCUDAの紹介
PyCUDAの紹介
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
 

Similar to CPythonを読もう

Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Reportgree_tech
 
ゼロから学ぶPython勉強会
ゼロから学ぶPython勉強会ゼロから学ぶPython勉強会
ゼロから学ぶPython勉強会sekikazu
 
Pyconjp2016 pyftplib
Pyconjp2016 pyftplibPyconjp2016 pyftplib
Pyconjp2016 pyftplibShinya Okano
 
MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるKenta IDA
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
OSSはどこまで産業用機器に使えるか_20230520.pdf
OSSはどこまで産業用機器に使えるか_20230520.pdfOSSはどこまで産業用機器に使えるか_20230520.pdf
OSSはどこまで産業用機器に使えるか_20230520.pdfKioto Hirahara
 
蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)Shintarou Okada
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Yoshiki Shibukawa
 
211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解するTakuya Nishimoto
 
S16 t1 python学習奮闘記#6
S16 t1 python学習奮闘記#6S16 t1 python学習奮闘記#6
S16 t1 python学習奮闘記#6Takeshi Akutsu
 
Introduction of kabepy
Introduction of kabepyIntroduction of kabepy
Introduction of kabepyKenjiro Kosaka
 
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93Takayuki Shimizukawa
 
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでSphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでStudy Group by SciencePark Corp.
 
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programingKei IWASAKI
 

Similar to CPythonを読もう (20)

Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Report
 
ゼロから学ぶPython勉強会
ゼロから学ぶPython勉強会ゼロから学ぶPython勉強会
ゼロから学ぶPython勉強会
 
Pykonjp2014
Pykonjp2014Pykonjp2014
Pykonjp2014
 
Pyconjp2016 pyftplib
Pyconjp2016 pyftplibPyconjp2016 pyftplib
Pyconjp2016 pyftplib
 
MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみる
 
210728 mpy
210728 mpy210728 mpy
210728 mpy
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
OSSはどこまで産業用機器に使えるか_20230520.pdf
OSSはどこまで産業用機器に使えるか_20230520.pdfOSSはどこまで産業用機器に使えるか_20230520.pdf
OSSはどこまで産業用機器に使えるか_20230520.pdf
 
蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する211120 他人の書いたPythonスクリプトをステップ実行で理解する
211120 他人の書いたPythonスクリプトをステップ実行で理解する
 
S16 t1 python学習奮闘記#6
S16 t1 python学習奮闘記#6S16 t1 python学習奮闘記#6
S16 t1 python学習奮闘記#6
 
Introduction of kabepy
Introduction of kabepyIntroduction of kabepy
Introduction of kabepy
 
Softlayer勉強会#2
Softlayer勉強会#2Softlayer勉強会#2
Softlayer勉強会#2
 
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
 
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでSphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
 
Why python
Why pythonWhy python
Why python
 
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing
入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜 / next-step-python-programing
 
Introduction Pycon2010
Introduction Pycon2010Introduction Pycon2010
Introduction Pycon2010
 

CPythonを読もう