More Related Content
Similar to Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜 (20)
More from Preferred Networks (20)
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
- 2. ⾃自⼰己紹介
l 柏原秀蔵 (@suma90h) (Preferred Networks)
l 最近:Dockerfileは友達
l 最近の活動
– お菓⼦子作り(前回の発表と同じ写真ですが、たまに焼いてます)
– 年年1回くらいバイクでツーリング&キャンプに⾏行行ってます
2
- 10. モチベーション
l プログラミング⾔言語の、コンパイラかインタプリタを作りたかった
– ⾞車車輪輪の再発明でも構わない。⾃自分の学習のため
l ⾔言語⾃自作は考えない。⽂文法(Syntax)考えるのが⼤大変なため
l ⾔言語VM(Virtual Machine)を作って⾒見見たい気持ちもあった
– コンパイラの書籍では中々解説されない部分で、知らないことが多い
– Java VMやCLR(.NET Framework) → タスクとして重たすぎる
– JavaScript も上と同様、また⾼高速化⾯面で重たそうな印象
– Ruby → 内部実装よく知らない、中間コードのファイル⽣生成しない
– Python → バイトコード(中間コード)⽣生成するため、丁度度良良いかもしれない!
u 参考にできるプログラムを発⾒見見できた(GoやPython製のインタプリタ)
10
- 12. 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
- 15. なぜD⾔言語か?
l バイナリファイルの扱いや、ビット演算などが簡単に書けると思った
l better C++として、C++よりも簡単にVMの実装を書けると期待した
l D⾔言語初⼼心者なので、D⾔言語で1000⾏行行程度度書いてみたかった
– (感想)Goと⽐比較しても、⾔言語⾃自体は書きやすく悪くない感じ
– Goから移ると、公式の標準ライブラリや周辺ツールの少なさが⽬目⽴立立つ
l 書籍「The D Programming Language」はわかりやすい
– ただし2010年年の本なので、古い箇所がある
– ライブラリ名など、修正が必要なサンプルコードもある
15
- 16. Pythonバイトコード.pyc概要
l .pyc がバイトコード(中間コード)の拡張⼦子。Pythonによって⽣生成される
l file.pyとfile.pycがあったとき、file.pyc を優先して実⾏行行する
– pycはタイムスタンプを持っており、.pyと⽐比較して新しい⽅方を読み込む
– 参考: python -‐‑‒ When are .pyc files refreshed? -‐‑‒ Stack Overflow
u http://stackoverflow.com/questions/15839555/when-‐‑‒are-‐‑‒pyc-‐‑‒files-‐‑‒
refreshed
l pycはいつ⽣生成されるのか
– importで他のファイルの.pyを読み込んだとき
– pythonで –m compileall もしくは –m py_̲compile オプションで実⾏行行されたとき
l pycの効果
– ファイル読み込みのキャッシュの効果
– プログラム実⾏行行が⾼高速になるわけではない!
16