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

20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説LeapMind Inc
 
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送Google Cloud Platform - Japan
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法MITSUNARI Shigeo
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
Rescale で Singularity を使ってみよう!
Rescale で Singularity を使ってみよう!Rescale で Singularity を使ってみよう!
Rescale で Singularity を使ってみよう!Shinnosuke Furuya
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선NAVER D2
 
実装ディープラーニング
実装ディープラーニング実装ディープラーニング
実装ディープラーニングYurie Oka
 
20160724_cv_sfm_revisited
20160724_cv_sfm_revisited20160724_cv_sfm_revisited
20160724_cv_sfm_revisitedKyohei Unno
 
Ruby で書く! Quine aa
Ruby で書く! Quine aaRuby で書く! Quine aa
Ruby で書く! Quine aa誠 小林
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video UnderstandingToru Tamaki
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
ゆるふわ強化学習入門
ゆるふわ強化学習入門ゆるふわ強化学習入門
ゆるふわ強化学習入門Ryo Iwaki
 
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion ModelsDeep Learning JP
 
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...Deep Learning JP
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料一路 川染
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 
Graph Attention Network
Graph Attention NetworkGraph Attention Network
Graph Attention NetworkTakahiro Kubo
 

What's hot (20)

20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
 
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
ZynqMP勉強会
ZynqMP勉強会ZynqMP勉強会
ZynqMP勉強会
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
Rescale で Singularity を使ってみよう!
Rescale で Singularity を使ってみよう!Rescale で Singularity を使ってみよう!
Rescale で Singularity を使ってみよう!
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
 
実装ディープラーニング
実装ディープラーニング実装ディープラーニング
実装ディープラーニング
 
20160724_cv_sfm_revisited
20160724_cv_sfm_revisited20160724_cv_sfm_revisited
20160724_cv_sfm_revisited
 
Ruby で書く! Quine aa
Ruby で書く! Quine aaRuby で書く! Quine aa
Ruby で書く! Quine aa
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
ゆるふわ強化学習入門
ゆるふわ強化学習入門ゆるふわ強化学習入門
ゆるふわ強化学習入門
 
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
 
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...
[DL Hacks 実装]MIDINET: A Convolutional Generative Adversarial Network For Symb...
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 
Graph Attention Network
Graph Attention NetworkGraph Attention Network
Graph Attention Network
 

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を読もう