Save 37% off PRO during our Black Friday Sale! »

型とは何か

85401912c23c7d5e656c08e7a751e95c?s=47 cocoatomo
February 15, 2018

 型とは何か

CPython を実例に取り, 型がどのようなもので, どう機能するのかについて解説

85401912c23c7d5e656c08e7a751e95c?s=128

cocoatomo

February 15, 2018
Tweet

Transcript

  1. 型とは何か? CPython の実装 by @cocoatomo, written in HuiFontP

  2. ご結婚 おめでとうございます!! • 型い愛で結ばれたお二人に • CPython の型のお話をプレゼント

  3. そもそも型とは? • 例を出すと

  4. 例えば血液型 • A型 • B型 • AB型 • O型

  5. 例えば軍艦 • 金剛型 • 陽炎型 • 天城型 • 利根型 •

    etc…
  6. 「型とは値の集合である」 • Types and Programming Languages • ↑型についての入門書 • 「名古屋入国のためのパスポート」

    • 安全性 = 推進性 + 保全性
  7. 何の役に立つの? • 推進性 ⇒ 式の評価 (=計算) が値にな るまで実行できることが分かる • 保全性

    ⇒ 式の評価によって型が変わら ない • ⇒ 「ある程度」ちゃんと動くことが保証さ れ, 結果の予想できるプログラムが書ける
  8. 理論は分かった では実際の実装は? • CPythonを見てみよう

  9. え? Python に型あるの?? • 「動的言語だから型は弱いんじゃないの?」 • → その発言は危険が危ない!

  10. Pythonにだって型はある ! ! ! • TypeError: 型のエラー

  11. 混ぜるな危険 • 「型付けルールがある」=型付き言語 • 「値の型」と「変数の型」 • ⇒ Python に無いのは変数の型 •

    「型チェックが『実行する』前に or 後で行 われる」=(いわゆる) 静的とか動的とか • [余談] ところで「実行」の定義, 考えた ことありますか? (読者の宿題)
  12. Pythonとは • クラスベースオブジェクト指向プログラミング 言語 (全てのものはobject) • 実行時の型チェック • 参照カウントGC •

    思想: Zen of Python • Explicit is better than implicit. etc…
  13. CPythonとは • C で実装された Python • ⇒ C とは異なる型システムをどう実装し ているのか?

  14. ソースコード • https://www.python.org/ftp/python/ 3.4.0/Python-3.4.0.tar.xz にソースコー ドがある. • ↑のリンクがあるページは https:// www.python.org/downloads/release/

    python-340/
  15. PyObject • Pythonの型階層の基底クラス object の C 実装 • 「全てのものはPyObject!」 •

    Include/object.h で宣言されている型 • ⇒ 実装を見てみよう
  16. PyObjectの実装 • 実体はCの「構造体」

  17. PyObject の型は? ⇒ ob_type が PyObject の型

  18. struct _typeobject とは? ⇒ CPythonの型は「構造体」で表現!

  19. その中身は? ずらっと関数ポインタが並ぶ

  20. PyTypeObject 最後に PyTypeObject に typedef

  21. CPythonの型 • 結局, CPythonにとっての型は関数の集ま り (構造体) • (→他の言語での型の表現方法について は詳しい人教えて)

  22. 型の判定 • メソッドの引数チェックとかどうしてるの? • → さっきの「3 +’a’」の C での動きを見 てみよう

  23. メソッド呼び出しとは? • Python では以下の3つは同じ意味 • 「3 + ’a’」 • =「3.__add__(‘a’)」

    • =「int.__add__(3, ‘a’)」
  24. C では? • 「int.__add__」の実装は • Object/abstract.c • にある • PyNumber_Add

    関数
  25. CPython の読み方 • CPython の命名規則ではメソッドの実 装は • Object/<type name>object.c •

    にある • Py<type name>_<method name> • という名前の関数となっている
  26. Number 型って? • int, float, bool, complex の上位の 抽象型 •

    Python の protocol と呼ばれるもの
  27. protocol • Java の interface のようなもの • 実装すべきメソッドの集合を定めてある • Long

    は Number protocol を提供して いる • もちろんコンパイラのチェックは無い • ↑そもそも Python にコンパイラが無い
  28. 結局, 呼び出されるのは • PyNumber_Add から, • PyLong_Type->tp_as_number
 ->nb_add • と型構造体のメンバを辿って

    • Object/longobject.c • にある long_add 関数が呼ばれる
  29. long_add 関数 ⇒ CHECK_BINOP に注目!

  30. CHECK_BINOP macro ⇒ ここで引数チェックをしていた!

  31. なんで型チェックするの? • long_add の引数は PyLongObject なの に、なんで CHECK_BINOP で型チェックす るの!?

  32. long_add の型への登録 • PyLong_Type->tp_as_number のメンバ nb_add に long_add が代入される箇所 を見ると……

  33. キャストされとる! (※この long_as_number が PyLong_Type->tp_as_number に代入される)

  34. PyObject だらけ • 実行時に PyObject から PyTypeObject (=関数の集まり) を取得し, 最初に型チェッ

    ク • よく見ると, せっかくの C の型情報がキャ ストで消えてる (引数も返り値も PyObject) • ⇒ これが「動的」と言われる所以
  35. Python/C API • ここらへんの内容は, Python 公式ドキュ メントの C API の項に載ってる

    • http://docs.python.jp/3.3/c-api/ index.html
  36. 公式ドキュメント • 言語仕様, チュートリアル, 標準ライブラリ の解説……が載っている文書 • 日本語訳もあるよ • 私を含めチームで3.3を翻訳中

    • ⇒ I needs you • https://code.google.com/p/python- doc-ja/
  37. まとめ • CPython の型オブジェクトは構造体 • CPython の実行時の型チェックは、型オ ブジェクトを毎回調べる • Python

    3.3 ドキュメント翻訳中!