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

俺たちのPHPの型システムはすごいぞっ!

 俺たちのPHPの型システムはすごいぞっ!

PHPカンファレンス福岡2024での発表内容です!

過去のPHP(特に5系まで)では、型システムが未熟であり、型の変換や関数の引数や返り値の型が厳密に管理されなかったため、関数を利用する際に適切な型の値を渡すことが難しかったり、返り値の型を信頼できない場合がありました。現在名前ベースで一致を調べる型システム(nominal type system) を採用していますが、他の言語と比べて、どうなのかを次の観点をベースにお伝えします。

採用している型システムの考え方のメリットデメリット(nominal type systemなど)
型コンパイルのタイミングが異なることによる影響
1,2では難しいポイントを各言語ではどう問題解決しているのか?
型システムの違いが及ぼす業務コードを書くことへの影響

Avatar for Suguru Ohki

Suguru Ohki

June 22, 2024
Tweet

More Decks by Suguru Ohki

Other Decks in Programming

Transcript

  1. プログラム内の データ 式 に 型 ( デ ー タ の

    種 類 や 性 質 ) を 割 り あ て そ れ ら の 使 用 を 規 定 す る ル ー ル の集合 型システムの定義とは?
  2. エラーの早期発見 d e c l a r e ( s

    t r i c t _ t y p e s = 1 ) ; じ ゃ な い 時 は ど う す る の か っ て ? 知 ら ん 知 ら ん
  3. コードの自己文書化 a r r a y の 中 身 に

    つ い て は 不 問 と し ま す ! ( 震 え 声 )
  4. API の設計とサポート a r r a y の 中 身

    に つ い て は 不 問 と し ま す ! ( 震 え 声 )
  5. そのほか リ フ ァ ク タ リ ン グ の

    支 援 型 情 報 を 利 用 し て 、 安 全 に コ ー ド を 変 更 で き ま す 。 I D E や ツ ー ル が 型 情 報 を 使 用 し て 、 関 連 す る 部 分 の 自 動 更 新 を 提 案 可 能 パ フ ォ ー マ ン ス の 最 適 化 コ ン パ イ ラ ー が 型 情 報 を 使 用 し て 、 最 適 化 さ れ た 機 械 語 コ ー ド を 生 成 P H P の 場 合 、 J I T コ ン パ イ ラ が よ り 効 率 的 な コ ー ド を 生 成 で き る 可 能 性 あ り
  6. 型宣言って何? PHPの型宣言の場合、ちょっとした注意もあって。 スカラー型( bool , i nt , fl oat

    , stri ng ) のエイリアスは サポートされていません 例として bool -> bool ean を取り扱います。
  7. behavi ral subtypi ng Dog, Cat, Bird クラスはすべて Animal インターフェース

    を実装しているため、Animal 型を期待する場所で使用でき ます。 1 . すべてのサブクラスが makeSound と move メソッドを実 装しており、Animal インターフェースの契約を守っていま す。 2 .
  8. behavi ral subtypi ng 3. 事前条件と事後条件: makeSound メソッドは、すべてのサブクラスで同じ事前条 件(引数なし)と事後条件(文字列を返す)を持っていま す。

    move メソッドも、すべてのサブクラスで同じ事前条件(整 数の距離)を持っています。ただし、Bird クラスでは移動距 離が2倍になっていますが、これは事後条件を強化している ため、Behavioral subtypingの原則に違反していません。
  9. behavi ral subtypi ng 4. 型の一貫性: クライアントコード(makeAnimalSound と moveAnimal 関数)は、具体的な動物の種類を知る必要が

    なく、Animal インターフェースに依存しています。これに より、新しい動物のクラスを追加しても、既存のコードを変 更する必要がありません。
  10. Ruby DuckTypingを利用。型の解析は、完全に外部へ出している 1 . Sorbetは、制約解決アルゴリズムを使用して型推論を行う 2 . 型の関係を制約として表現し、制約を満たす型の割り当て を見つけるアプローチをとっている a.

    Ruby3.0からは公式がサポートする型の定義が利用できる RBSが導入されている 3 . 作者のMatzさんは型宣言やTypeHintを入れる想定がな く、型推論が充実すれば必要なくなることを想定している 4 . 実際のコードに対して型情報を付加しても本番コードを変更 する必要がない 5 .
  11. Rust 型システム: Hindly-Milner型推論?をベースとしたアルゴ リズムが利用 1 . 所有権とライフタイムの概念をアルゴリズムに対して拡張し て実装されている 2 .

    借用チェッカー: 参照の有効性をコンパイル時にチェック 3 . トレイトベースのジェネリクス: インターフェースとジェネ リクスを組み合わせた柔軟な抽象化が可能 4 . 代数的データ型: エニュームを使用して複雑なデータ構造を 表現できる 5 .
  12. TypeScri pt 型システム: Structural Subtyping 1 . 型推論システム: Hindly-Milner型推論?をベースとしたア ルゴリズムが利用

    2 . 型推論:多くの場合、明示的な型注釈がなくても型を推論 3 . ジェネリクス: 型パラメータを使用して、再利用可能な型定 義を作成できる 4 . 型ガード: 5 . 実行時の型チェックと静的型システムを連携させることがで きます。 6 .
  13. まとめ PHPはだんだんと硬い言語になりつつある 1 . strict_typesがもっと便利になる可能性あり?declineされ ちゃったけど。 2 . 今年日本にも来られたGinaさんをはじめとしたCommiterの 方々の偉業により、型安全性を高める動きが進んでいくは

    ず!(色々コミュニティとして貢献していきたいところ) 3 . 強い型付けと弱い型付けどちらもあるのはやっぱすごい。 4 . 内部の命名からも今後はもっと硬くしていくつもりっぽい 5 .
  14. 余談1: Gener i cs Generics 1 . 言語に取り入れるRFCが実はあるが、動いてない a. https://wiki.php.net/rfc/generics

    (Draft) i . https://github.com/PHPGenerics/php- generics-rfc/issues/45 ii . https://github.com/nikic/php-src/pull/3 iii . phpstanやmrsuh/php-genericsといったライブラリで 現在は取り入れられていることが多いですよね! b. 2 .
  15. 余談2: まだまだPHPの型の怪しいところ 型の相互変換(TypeJuggling) 型の機能自体が 値の型そのものを見ているわけではなく、 値の内容が目的の型に変換できるかどうかでみている a. 受け入れられると型変換されると言った性質を持つ部分が あるため、このようなことが結構おきる b.

    日本に来てGina Peter Banyard(Girgias)さんがLTをし てくださった際にもTypeJugglingには言及されていて、 安全に型が使えるようにRFCを出してくださることが多い c . swisskyrepo/PayloadsAllTheThings にも例がある d.