Upgrade to Pro — share decks privately, control downloads, hide ads and more …

型とは何か

cocoatomo
February 15, 2018

 型とは何か

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

cocoatomo

February 15, 2018
Tweet

More Decks by cocoatomo

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 「型とは値の集合である」
    • Types and Programming Languages
    • ↑型についての入門書
    • 「名古屋入国のためのパスポート」
    • 安全性 = 推進性 + 保全性

    View full-size slide

  7. 何の役に立つの?
    • 推進性 ⇒ 式の評価 (=計算) が値にな
    るまで実行できることが分かる
    • 保全性 ⇒ 式の評価によって型が変わら
    ない
    • ⇒ 「ある程度」ちゃんと動くことが保証さ
    れ, 結果の予想できるプログラムが書ける

    View full-size slide

  8. 理論は分かった
    では実際の実装は?
    • CPythonを見てみよう

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. 混ぜるな危険
    • 「型付けルールがある」=型付き言語
    • 「値の型」と「変数の型」
    • ⇒ Python に無いのは変数の型
    • 「型チェックが『実行する』前に or 後で行
    われる」=(いわゆる) 静的とか動的とか
    • [余談] ところで「実行」の定義, 考えた
    ことありますか? (読者の宿題)

    View full-size slide

  12. Pythonとは
    • クラスベースオブジェクト指向プログラミング
    言語 (全てのものはobject)
    • 実行時の型チェック
    • 参照カウントGC
    • 思想: Zen of Python
    • Explicit is better than implicit.
    etc…

    View full-size slide

  13. CPythonとは
    • C で実装された Python
    • ⇒ C とは異なる型システムをどう実装し
    ているのか?

    View full-size slide

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

    View full-size slide

  15. PyObject
    • Pythonの型階層の基底クラス object の
    C 実装
    • 「全てのものはPyObject!」
    • Include/object.h で宣言されている型
    • ⇒ 実装を見てみよう

    View full-size slide

  16. PyObjectの実装
    • 実体はCの「構造体」

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  20. PyTypeObject
    最後に PyTypeObject に typedef

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. C では?
    • 「int.__add__」の実装は
    • Object/abstract.c
    • にある
    • PyNumber_Add 関数

    View full-size slide

  25. CPython の読み方
    • CPython の命名規則ではメソッドの実
    装は
    • Object/object.c
    • にある
    • Py_
    • という名前の関数となっている

    View full-size slide

  26. Number 型って?
    • int, float, bool, complex の上位の
    抽象型
    • Python の protocol と呼ばれるもの

    View full-size slide

  27. protocol
    • Java の interface のようなもの
    • 実装すべきメソッドの集合を定めてある
    • Long は Number protocol を提供して
    いる
    • もちろんコンパイラのチェックは無い
    • ↑そもそも Python にコンパイラが無い

    View full-size slide

  28. 結局, 呼び出されるのは
    • PyNumber_Add から,
    • PyLong_Type->tp_as_number

    ->nb_add
    • と型構造体のメンバを辿って
    • Object/longobject.c
    • にある long_add 関数が呼ばれる

    View full-size slide

  29. long_add 関数
    ⇒ CHECK_BINOP に注目!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    • よく見ると, せっかくの C の型情報がキャ
    ストで消えてる (引数も返り値も
    PyObject)
    • ⇒ これが「動的」と言われる所以

    View full-size slide

  35. Python/C API
    • ここらへんの内容は, Python 公式ドキュ
    メントの C API の項に載ってる
    • http://docs.python.jp/3.3/c-api/
    index.html

    View full-size slide

  36. 公式ドキュメント
    • 言語仕様, チュートリアル, 標準ライブラリ
    の解説……が載っている文書
    • 日本語訳もあるよ
    • 私を含めチームで3.3を翻訳中
    • ⇒ I needs you
    • https://code.google.com/p/python-
    doc-ja/

    View full-size slide

  37. まとめ
    • CPython の型オブジェクトは構造体
    • CPython の実行時の型チェックは、型オ
    ブジェクトを毎回調べる
    • Python 3.3 ドキュメント翻訳中!

    View full-size slide