Movatterモバイル変換


[0]ホーム

URL:


15,507 views

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜

PFIセミナー 2016/04/28

Embed presentation

Downloaded 49 times
Pythonの理理解を試みる〜~バイトコードインタプリタを作成する〜~柏原秀蔵Preferred  Networks,  Inc.2016/04/28
⾃自⼰己紹介l  柏原秀蔵 (@suma90h) (Preferred Networks)l  最近:Dockerfileは友達l  最近の活動–  お菓⼦子作り(前回の発表と同じ写真ですが、たまに焼いてます)–  年年1回くらいバイクでツーリング&キャンプに⾏行行ってます2
去年年は佐渡島へ  キャンプしたり3
去年年は佐渡島へ  登⼭山したり4
Pythonについて、実世界で役に⽴立立ちづらい話をしますl  今⽇日のネタはPython–  Python⾖豆知識識–  CPythonを理理解するためにバイトコードインタプリタを作る話(本題)l  ここ最近の私のセミナー発表は何かの紹介が多かった–  2015/07/09  先取り  Go  1.5–  2014/12/18  systemdを始めよう5
なぜPython?l  10年年以上使われている(メンテされ続けている)プログラミング⾔言語l  個⼈人的に注⽬目したいソフトウェアがPythonを利利⽤用している–  Chainer  (PFI/PFNによる開発)–  Ansible  (最近2.0出ました)u  マシンの構成管理理ツールl  息が⻑⾧長い話し–  Python  3が出ていても、いまだにPython  2.7も台頭している–  Ubuntu  16.04ではPython  3標準であるとか6
Pythonの⾖豆知識識:クイズl  以前、⼈人前で話したことがあるので知っている⼈人も多いかもしれませんl  Q:Pythonは何の⽬目的で作られたでしょう?l  解答候補–  A:テキスト処理理の⽬目的で作られた–  B:分散OSのプラットフォームで使う⽬目的で作られた–  C:業務時間にほかにやることがないから作られた7
Pythonの起源クイズ:  クイズの答えl  正解はB:分散OSのプラットフォームで使う⽬目的で作られたl  Amoebaプロジェクト(分散OS:アンドリュー・タネンバウム先⽣生)のプラットフォーム向けに作られた–  WikipediaやPython公式FAQにも載ってますl  ちなみに他の解答の⾔言語は?–  A:テキスト処理理の⽬目的で作られた–  Perl。awkだと⼒力力不不⾜足だったらしい–  C:業務時間にほかにやることがないから作られた–  Ruby。割と有名な話し8
CPythonを理理解するためにバイトコードインタプリタを作成する9
モチベーションl  プログラミング⾔言語の、コンパイラかインタプリタを作りたかった–  ⾞車車輪輪の再発明でも構わない。⾃自分の学習のためl  ⾔言語⾃自作は考えない。⽂文法(Syntax)考えるのが⼤大変なためl  ⾔言語VM(Virtual  Machine)を作って⾒見見たい気持ちもあった–  コンパイラの書籍では中々解説されない部分で、知らないことが多い–  Java  VMやCLR(.NET  Framework)  →  タスクとして重たすぎる–  JavaScript  も上と同様、また⾼高速化⾯面で重たそうな印象–  Ruby  →  内部実装よく知らない、中間コードのファイル⽣生成しない–  Python  →  バイトコード(中間コード)⽣生成するため、丁度度良良いかもしれない!u  参考にできるプログラムを発⾒見見できた(GoやPython製のインタプリタ)10
注意l  CPythonの理理解を試みた–  のですが、バイトコードインタプリタの理理解が深まるばかりで、Pythonインタプリタ(全体)の理理解については浅い気がします11
Pythonバイトコードインタプリタを作る!l  バイトコードとは–  実⾏行行可能なプログラムバイナリ–  狭義にはJavaのように1バイト(8ビット)単位が命令令コード(Operation  Code)だったためバイトコードと呼ばれる–  Pythonの中間コードも1バイト単位–  1バイト  →  256通りまでの命令令を表現できるl  コードリーディング–  Python-‐‑‒2.7.10/Include/opcode.h  では147までを定義–  Python-‐‑‒3.5.1/Include/opcode.h  では154までを定義12
Pythonのフロー(いわゆるインタプリタ処理理系のフロー)l  通常は字句句解析などが必要l  フロントエンドの処理理(字句句・構⽂文解析)からバイトコード⽣生成まではCPythonに任せる作戦–  バイトコードインタプリタ開発の場合–  バイトコードのファイル読み込み  →  実⾏行行  となる13source(test.py)lexical analyzer字句句解析parser構⽂文解析etc executePythonや一般的な処理系のフローresult
バイトコードインタプリタ作成の流流れl  公式情報から作る場合、CPython本家を調査する努⼒力力が必要–  CPythonのCソースコードを読み、バイトコードインタプリタを解読する–  公式ドキュメントを読み、バイトコードの意味を把握するu  http://docs.python.jp/2.7/library/dis.htmll  今回はGo製のインタプリタGoPyをD⾔言語で再実装(移植)することにした–  ⼀一部の命令令が実装されているl  GoPyの⾏行行数–  wc  -‐‑‒l  *.go  →  1643  ⾏行行–  短い?  1000⾏行行くらいなら、気合いで1週間程度度で動くものが作れると判断14
なぜD⾔言語か?l  バイナリファイルの扱いや、ビット演算などが簡単に書けると思ったl  better  C++として、C++よりも簡単にVMの実装を書けると期待したl  D⾔言語初⼼心者なので、D⾔言語で1000⾏行行程度度書いてみたかった–  (感想)Goと⽐比較しても、⾔言語⾃自体は書きやすく悪くない感じ–  Goから移ると、公式の標準ライブラリや周辺ツールの少なさが⽬目⽴立立つl  書籍「The  D  Programming  Language」はわかりやすい–  ただし2010年年の本なので、古い箇所がある–  ライブラリ名など、修正が必要なサンプルコードもある15
Pythonバイトコード.pyc概要l  .pyc  がバイトコード(中間コード)の拡張⼦子。Pythonによって⽣生成されるl  file.pyとfile.pycがあったとき、file.pyc  を優先して実⾏行行する–  pycはタイムスタンプを持っており、.pyと⽐比較して新しい⽅方を読み込む–  参考:  python  -‐‑‒  When  are  .pyc  files  refreshed?  -‐‑‒  Stack  Overflowu  http://stackoverflow.com/questions/15839555/when-‐‑‒are-‐‑‒pyc-‐‑‒files-‐‑‒refreshedl  pycはいつ⽣生成されるのか–  importで他のファイルの.pyを読み込んだとき–  pythonで  –m  compileall  もしくは  –m  py_̲compile  オプションで実⾏行行されたときl  pycの効果–  ファイル読み込みのキャッシュの効果–  プログラム実⾏行行が⾼高速になるわけではない!16
Pythonバイトコード.pyc内容l  ローカル変数の数、スタックのサイズ、フラグ、命令令コード…などl  Python-‐‑‒2.7.10/Include/code.h  の  PyCodeObject構造体が実体–  https://hg.python.org/cpython/file/2.7/Include/code.h#l10l  pycファイルのバイナリ読み込みにあたって–  数値はリトルエンディアンで格納されている–  16/32ビット数値、⽂文字列列(もしくはバイナリ)–  ※  バイナリのパースについては複雑なので⾶飛ばしますl  このデータをもとにVM(バイトコードインタプリタ)が⾛走ることになる–  Pythonのバイトコードインタプリタはスタックマシン型–  Opode:  https://hg.python.org/cpython/file/2.7/Include/opcode.h17
スタックマシン型のVM、Pythonのインタプリタとは?l  ⼀一般的なスタックマシンの解説(省省略略します)–  https://ja.wikipedia.org/wiki/スタックマシン–  https://en.wikipedia.org/wiki/Stack_̲machine–  例例:  Java  VMやCLR(.NET  Framework)のVMでもスタックマシンが採⽤用l  Pythonでは(例例)–  BINARY_̲ADD:  スタック上のトップ2つの値をPopして加算し、スタックにPushする–  LOAD_̲NAME:    指定された名前の変数の値をスタックにPushする–  STORE_̲NAME:  スタック上のトップ1つの値をPopし、指定した名前の変数へ格納する–  http://docs.python.jp/2.7/library/dis.html18
バイトコードインタプリタ開発の記録l  ⽇日記と⾏行行数の記録を書いていた–  ⽇日記はそのままコピペしますl  数⾏行行のコメントと、twitterで⾏行行数(進捗)をつぶやく19
バイトコードインタプリタ開発の記録l  2016/04/20  –  D⾔言語まともに書き始めた  20
バイトコードインタプリタ開発の記録l  2016/04/21–  pycのパーサ書いた、途中で4バイト読み込みするのが抜けたバグではまった。  –  printfデバッグして⽐比較最中、⾜足りない箇所が発覚して無事解決。  –  PyTupleとか基本データ型を実装。attributeとかは⾶飛ばした。後で実装する。  –  Bytecodeのopcodeのswitchを書くところまで進んだ。  21
バイトコードインタプリタ開発の記録l  2016/04/21  アクシデントも–  D⾔言語の標準ライブラリにStackがない!–  →  kinabaさんのウェブサイトにあったコードを借りてしのいだ22
バイトコードインタプリタ開発の記録l  2016/04/22–  Opcodeのインタプリタを作成中  –  加減乗算あたりの基礎を実装  23
バイトコードインタプリタ開発の記録l  2016/04/24–  STORE_̲NAMEの名前取得がバグってた24
バイトコードインタプリタ開発の記録l  2016/04/25–  関数定義と関数呼び出し(引数有り・無し)ができるようになった25
デモl  GoPy付属のテスト⽤用スクリプト–  組み込みモジュールtimeのtime.time()から、Unix  timeを取得する–  同⼀一ファイル内の関数を呼び出すl  今回作成したテスト⽤用のスクリプト–  数値の演算(加減算)をして、printする26
Pythonを理理解できたであろうか?l  Pythonの理理解は深まったのか?  という問い–  ⼀一部機能などに関して個⼈人的に深まったと⾔言える。しかし、広く伝えるのは難しい–  pycの16進数/ASCIIダンプやopcodeを⾒見見て⼀一部の命令令が解読できるようになったl  バイトコードインタプリタ作成を通じて得られたもの–  Pythonのような⾔言語のバイトコードインタプリタの実装⽅方法の知⾒見見–  D⾔言語でのちょっとしたスタックマシン型VMの開発経験(D⾔言語良良かった)–  Pythonのfunctionなどがどんな実体で管理理されてるか知る機会となった–  Pythonで  `̀type(funcname)`̀  とすると関数はオブジェクトだとわかるl  注意:  インタプリタが作れるからといって、Python⾔言語そのものに詳しくなれるとは限らない!27
よりPythonを知るには(実装という意味で)l  CPythonをはじめとし、⾔言語の実装の各⽅方⾯面からアプローチすると良良さそう–  ⾔言語の⽂文法を知る・使い⽅方を知る–  組み込みの標準機能(標準のデータ型)や構⽂文(ifやforなど)の実装を知る–  標準のランタイムライブラリを知る–  処理理系(CPythonならバイトコードインタプリタ)にあわせた実⾏行行⽅方法を知るl  よりディープな所に触れる–  マルチスレッドの実装–  GIL(Global  Interpreter  Lock)–  GC(Garbage  Collection)–  CPythonのC拡張28
参考l  https://github.com/flosch/GoPyl  https://github.com/nedbat/byterunl  http://akaptur.com/blog/2013/11/15/introduction-‐‑‒to-‐‑‒the-‐‑‒python-‐‑‒interpreter/29
Copyright  ©  2016Preferred  Networks  All  Right  Reserved.

Recommended

PDF
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
PDF
Pythonによる黒魔術入門
PDF
暗号技術の実装と数学
PPTX
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
PDF
画像認識の初歩、SIFT,SURF特徴量
PDF
ウェーブレット木の世界
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PPTX
充足可能性問題のいろいろ
PPTX
本当は恐ろしい分散システムの話
PDF
WebSocket / WebRTCの技術紹介
PDF
プログラミングコンテストでの動的計画法
PDF
ゼロから始める転移学習
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
PDF
プログラムを高速化する話
PDF
強化学習その3
 
PDF
マルチコアを用いた画像処理
PPTX
強化学習アルゴリズムPPOの解説と実験
PPTX
差分プライバシーとは何か? (定義 & 解釈編)
PPTX
DockerコンテナでGitを使う
PDF
最適化超入門
PDF
PyData.Tokyo Meetup #21 講演資料「Optuna ハイパーパラメータ最適化フレームワーク」太田 健
PDF
SAT/SMTソルバの仕組み
PDF
初心者向けCTFのWeb分野の強化法
PPTX
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PDF
cvpaper.challenge 研究効率化 Tips
PDF
平面グラフと交通ネットワークのアルゴリズム
PDF
深層強化学習でマルチエージェント学習(前篇)
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
次世代言語 Python による PyPy を使った次世代の処理系開発
PDF
PyPy 紹介

More Related Content

PDF
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
PDF
Pythonによる黒魔術入門
PDF
暗号技術の実装と数学
PPTX
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
PDF
画像認識の初歩、SIFT,SURF特徴量
PDF
ウェーブレット木の世界
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PPTX
充足可能性問題のいろいろ
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
Pythonによる黒魔術入門
暗号技術の実装と数学
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
画像認識の初歩、SIFT,SURF特徴量
ウェーブレット木の世界
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
充足可能性問題のいろいろ

What's hot

PPTX
本当は恐ろしい分散システムの話
PDF
WebSocket / WebRTCの技術紹介
PDF
プログラミングコンテストでの動的計画法
PDF
ゼロから始める転移学習
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
PDF
プログラムを高速化する話
PDF
強化学習その3
 
PDF
マルチコアを用いた画像処理
PPTX
強化学習アルゴリズムPPOの解説と実験
PPTX
差分プライバシーとは何か? (定義 & 解釈編)
PPTX
DockerコンテナでGitを使う
PDF
最適化超入門
PDF
PyData.Tokyo Meetup #21 講演資料「Optuna ハイパーパラメータ最適化フレームワーク」太田 健
PDF
SAT/SMTソルバの仕組み
PDF
初心者向けCTFのWeb分野の強化法
PPTX
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PDF
cvpaper.challenge 研究効率化 Tips
PDF
平面グラフと交通ネットワークのアルゴリズム
PDF
深層強化学習でマルチエージェント学習(前篇)
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
本当は恐ろしい分散システムの話
WebSocket / WebRTCの技術紹介
プログラミングコンテストでの動的計画法
ゼロから始める転移学習
分散学習のあれこれ~データパラレルからモデルパラレルまで~
プログラムを高速化する話
強化学習その3
 
マルチコアを用いた画像処理
強化学習アルゴリズムPPOの解説と実験
差分プライバシーとは何か? (定義 & 解釈編)
DockerコンテナでGitを使う
最適化超入門
PyData.Tokyo Meetup #21 講演資料「Optuna ハイパーパラメータ最適化フレームワーク」太田 健
SAT/SMTソルバの仕組み
初心者向けCTFのWeb分野の強化法
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
cvpaper.challenge 研究効率化 Tips
平面グラフと交通ネットワークのアルゴリズム
深層強化学習でマルチエージェント学習(前篇)
ARM CPUにおけるSIMDを用いた高速計算入門

Similar to Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜

PDF
次世代言語 Python による PyPy を使った次世代の処理系開発
PDF
PyPy 紹介
PPTX
Wacode5thでのpython講義資料
PDF
DATUM STUDIO PyCon2016 Turorial
PPT
Python languageupdate (2004)
PDF
Wrapping a C++ library with Cython
PDF
Python Kyoto study
PDF
LLdeade Python Language Update
PDF
Pynq祭り資料
PPTX
Django_Fukuoka
PPTX
数値計算のための Python + FPGA
 
PDF
Django_fukuoka
PPTX
天気予報ガジェットを作りな がら、Pythonを勉強しよう
PPTX
Polyphony の行く末(2018/3/3)
 
PDF
Pyconjp2014_implementations
PDF
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
PDF
Python physicalcomputing
ODP
Introduction of Python
PDF
Pythonによる機械学習の最前線
PDF
「Python言語」はじめの一歩 / First step of Python
次世代言語 Python による PyPy を使った次世代の処理系開発
PyPy 紹介
Wacode5thでのpython講義資料
DATUM STUDIO PyCon2016 Turorial
Python languageupdate (2004)
Wrapping a C++ library with Cython
Python Kyoto study
LLdeade Python Language Update
Pynq祭り資料
Django_Fukuoka
数値計算のための Python + FPGA
 
Django_fukuoka
天気予報ガジェットを作りな がら、Pythonを勉強しよう
Polyphony の行く末(2018/3/3)
 
Pyconjp2014_implementations
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
Python physicalcomputing
Introduction of Python
Pythonによる機械学習の最前線
「Python言語」はじめの一歩 / First step of Python

More from Preferred Networks

PDF
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PDF
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
PDF
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
PDF
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PDF
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
PDF
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
PDF
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PPTX
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PDF
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
PDF
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
PDF
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PDF
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
PDF
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜


[8]ページ先頭

©2009-2025 Movatter.jp