Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 テックリード / Suguru Ohki スー TechTrainのエンジニア1人目。 技術を反復横跳びしていますが、前より抑えられています・・・! 趣味: サウナ、お酒

Slide 3

Slide 3 text

Agenda そもそも型システムって何? 型の周辺知識 PHPが採用している型システム PHPの型の歴史 PHPの型システムのココがすごいぞっ! まとめ 他の言語が採用している型システム

Slide 4

Slide 4 text

00 そもそも型システムって?

Slide 5

Slide 5 text

プログラム内の データ 式 に 型 ( デ ー タ の 種 類 や 性 質 ) を 割 り あ て そ れ ら の 使 用 を 規 定 す る ル ー ル の集合 型システムの定義とは?

Slide 6

Slide 6 text

型システムで何ができるか?

Slide 7

Slide 7 text

型システムで何ができるか? エラーの早期発見 コードの自己文書化 APIの設計と使用のサポート そのほか

Slide 8

Slide 8 text

エラーの早期発見

Slide 9

Slide 9 text

エラーの早期発見 d e c l a r e ( s t r i c t _ t y p e s = 1 ) ; じ ゃ な い 時 は ど う す る の か っ て ? 知 ら ん 知 ら ん

Slide 10

Slide 10 text

コードの自己文書化

Slide 11

Slide 11 text

コードの自己文書化 a r r a y の 中 身 に つ い て は 不 問 と し ま す ! ( 震 え 声 )

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

そのほか リ フ ァ ク タ リ ン グ の 支 援 型 情 報 を 利 用 し て 、 安 全 に コ ー ド を 変 更 で き ま す 。 I D E や ツ ー ル が 型 情 報 を 使 用 し て 、 関 連 す る 部 分 の 自 動 更 新 を 提 案 可 能 パ フ ォ ー マ ン ス の 最 適 化 コ ン パ イ ラ ー が 型 情 報 を 使 用 し て 、 最 適 化 さ れ た 機 械 語 コ ー ド を 生 成 P H P の 場 合 、 J I T コ ン パ イ ラ が よ り 効 率 的 な コ ー ド を 生 成 で き る 可 能 性 あ り

Slide 14

Slide 14 text

01 型の周辺知識 型推論・型付け・型宣言・型推論

Slide 15

Slide 15 text

名前的 or 構造的 Nomi nal type system(公称型) 1 . Structural Typi ng(構造型) 2 .

Slide 16

Slide 16 text

名前的 or 構造的 1.Nominal type system FooとBarの名前が異なる →エラーとなる

Slide 17

Slide 17 text

名前的 or 構造的 2. Structural Typing FooとBarの構造が同じ →エラーとならない

Slide 18

Slide 18 text

強い型付け・弱い型付けって何?

Slide 19

Slide 19 text

強い型付け・弱い型付けって何?

Slide 20

Slide 20 text

強い型付け・弱い型付けって何? 1.強い型付け 型が異なるときエラー

Slide 21

Slide 21 text

強い型付け・弱い型付けって何? 2.弱い型付け 型が異なるとき * 暗黙的変換 * Warningを出す 言語によって対応が異なる

Slide 22

Slide 22 text

強い or 弱い / 動的 or 静的

Slide 23

Slide 23 text

型宣言って何? 計算で扱う数値、計算結果の表示の型or形式を決めること

Slide 24

Slide 24 text

PHPにおける型宣言って何? 関数のパラメータ 戻り値 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言

Slide 25

Slide 25 text

型宣言って何?

Slide 26

Slide 26 text

型宣言って何? PHPの型宣言の場合、ちょっとした注意もあって。 スカラー型( bool , i nt , fl oat , stri ng ) のエイリアスは サポートされていません 例として bool -> bool ean を取り扱います。

Slide 27

Slide 27 text

型宣言って何?

Slide 28

Slide 28 text

型宣言って何?

Slide 29

Slide 29 text

型宣言って何? 実は書いてある・・・!

Slide 30

Slide 30 text

型推論って何? 変数や関数シグネチャの型を明示的に宣言しない場合周辺 情報および文脈などから自動的に(暗黙的に)各々の型を 決定する機構 変数宣言における初期化のための初期値 関数呼び出しにおける実引数 etc. . .

Slide 31

Slide 31 text

型推論って何? 変数や関数シグネチャの型を明示的に宣言しない場合周辺 情報および文脈などから自動的に(暗黙的に)各々の型を 決定する機構 変数宣言における初期化のための初期値 関数呼び出しにおける実引数 etc. . .

Slide 32

Slide 32 text

型推論って何?

Slide 33

Slide 33 text

型推論って何?

Slide 34

Slide 34 text

型推論って何?

Slide 35

Slide 35 text

型推論って何?

Slide 36

Slide 36 text

型推論って何?

Slide 37

Slide 37 text

02 PHPが採用している 型システム

Slide 38

Slide 38 text

採用アルゴリズム

Slide 39

Slide 39 text

採用アルゴリズム 部分型の関係を満たしつつ (behavi ral subtypi ng) 名前ベースで一致を調べる型システム (nomi nal type system)

Slide 40

Slide 40 text

採用アルゴリズム 部分型の関係を満たしつつ (behavi ral subtypi ng) 名前ベースで一致を調べる型システム (nomi nal type system) わ か ら ん

Slide 41

Slide 41 text

behavi ral subtypi ng サブタイプ(派生クラス)は、そのスーパータイプ(基底ク ラス)の代わりに使用できるべきである。 1 . サブタイプは、スーパータイプの振る舞い(メソッドの契約) を維持しなければならない。 2 . サブタイプは、スーパータイプの事前条件を強化してはなら ず、事後条件を弱めてはならない。 3 .

Slide 42

Slide 42 text

behavi ral subtypi ng Dog,Catクラスは、Animalの代わりに使用できるべき 1 . Dog,Cat は、Animalの振る舞い(メソッドの契約)を維持 しなければならない。 2 . Dog,Cat は、Animalの事前条件を強化してはならず、事後 条件を弱めてはならない。 3 .

Slide 43

Slide 43 text

behavi ral subtypi ng

Slide 44

Slide 44 text

behavi ral subtypi ng

Slide 45

Slide 45 text

behavi ral subtypi ng

Slide 46

Slide 46 text

behavi ral subtypi ng

Slide 47

Slide 47 text

behavi ral subtypi ng

Slide 48

Slide 48 text

behavi ral subtypi ng

Slide 49

Slide 49 text

behavi ral subtypi ng Dog, Cat, Bird クラスはすべて Animal インターフェース を実装しているため、Animal 型を期待する場所で使用でき ます。 1 . すべてのサブクラスが makeSound と move メソッドを実 装しており、Animal インターフェースの契約を守っていま す。 2 .

Slide 50

Slide 50 text

behavi ral subtypi ng 3. 事前条件と事後条件: makeSound メソッドは、すべてのサブクラスで同じ事前条 件(引数なし)と事後条件(文字列を返す)を持っていま す。 move メソッドも、すべてのサブクラスで同じ事前条件(整 数の距離)を持っています。ただし、Bird クラスでは移動距 離が2倍になっていますが、これは事後条件を強化している ため、Behavioral subtypingの原則に違反していません。

Slide 51

Slide 51 text

behavi ral subtypi ng 4. 型の一貫性: クライアントコード(makeAnimalSound と moveAnimal 関数)は、具体的な動物の種類を知る必要が なく、Animal インターフェースに依存しています。これに より、新しい動物のクラスを追加しても、既存のコードを変 更する必要がありません。

Slide 52

Slide 52 text

採用アルゴリズム 部分型の関係を満たしつつ (behavi ral subtypi ng) 名前ベースで一致を調べる型システム (nomi nal type system)

Slide 53

Slide 53 text

繰り返しになりますが、 名前ベースのアルゴリズ ムです

Slide 54

Slide 54 text

名前的 or 構造的 1.Nominal type system FooとBarの名前が異なる →エラーとなる

Slide 55

Slide 55 text

03 他の言語が採用している 型システム

Slide 56

Slide 56 text

Python 型ヒントシステムPEP484にて定義されている 1 . 型推論制約ベースの推論アルゴリズムが使用されており、 Hindley-Milner型推論の変化型?っぽいかもしれません 2 . 型チェック自体は、言語内に取り込まれている 3 . 静的型チェックのライブラリ: mypy 4 . 抽象構文木(AST)を走査して型の整合製をチェック a.

Slide 57

Slide 57 text

Python

Slide 58

Slide 58 text

Ruby DuckTypingを利用。型の解析は、完全に外部へ出している 1 . Sorbetは、制約解決アルゴリズムを使用して型推論を行う 2 . 型の関係を制約として表現し、制約を満たす型の割り当て を見つけるアプローチをとっている a. Ruby3.0からは公式がサポートする型の定義が利用できる RBSが導入されている 3 . 作者のMatzさんは型宣言やTypeHintを入れる想定がな く、型推論が充実すれば必要なくなることを想定している 4 . 実際のコードに対して型情報を付加しても本番コードを変更 する必要がない 5 .

Slide 59

Slide 59 text

Ruby

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

Rust

Slide 62

Slide 62 text

TypeScri pt 型システム: Structural Subtyping 1 . 型推論システム: Hindly-Milner型推論?をベースとしたア ルゴリズムが利用 2 . 型推論:多くの場合、明示的な型注釈がなくても型を推論 3 . ジェネリクス: 型パラメータを使用して、再利用可能な型定 義を作成できる 4 . 型ガード: 5 . 実行時の型チェックと静的型システムを連携させることがで きます。 6 .

Slide 63

Slide 63 text

TypeScri pt

Slide 64

Slide 64 text

04 PHPの型の歴史 追加されてきた機能を紹介

Slide 65

Slide 65 text

PHP4系

Slide 66

Slide 66 text

PHP5系: クラスとインターフェースの型ヒント

Slide 67

Slide 67 text

PHP7系: スカラー型のヒント

Slide 68

Slide 68 text

PHP7系: nul l 許容型

Slide 69

Slide 69 text

PHP7系: voi d戻り値型

Slide 70

Slide 70 text

PHP7系: stri ct mode

Slide 71

Slide 71 text

PHP8系: Uni on型

Slide 72

Slide 72 text

PHP8系: Uni on型

Slide 73

Slide 73 text

PHP8系: Mi xed型

Slide 74

Slide 74 text

PHP8系: stati c型

Slide 75

Slide 75 text

PHP8系: インターセクション型( 交差型)

Slide 76

Slide 76 text

PHP8系: 読み取り専用のプロパティ

Slide 77

Slide 77 text

PHP8系: Enum型

Slide 78

Slide 78 text

PHPの型でまだサポートが弱い箇所 array 1 . 型の相互変換 2 .

Slide 79

Slide 79 text

05 PHPの型システムの ココがすごいぞっ!

Slide 80

Slide 80 text

強い型付けと弱い型付けのどちらも可能 強い型付けと弱い型付けはどちらかのみサポートされている ケースが多い 1 . 弱い型付け時代に利用されていた外部ツール(Phpstanなど) の静的解析のサポートなどが強い 2 . これらの型推論を助けたりするツールについては、Ruby も強い。連携性についてはむしろRubyの方が良いと言っ ても良い。公式で出しているし・・・w a.

Slide 81

Slide 81 text

言語に対するTypeHi ntなどの取り入れ方 型システムの強化という意味で、型の定義自体を言語に取り 入れているところは少ない 1 . 最近の特に今まで型のサポートが弱かった言語や動的言語の トレンドは外部に用意した型定義を読み込んで推論によって 開発体験を向上させるといったアプローチが多い 2 . Ruby: Sorbet, RBS(言語外) a. JavaScript: TypeScript b. Python: typing module(言語内) c . 今後も硬くかけるようになっていくっぽい 3 . →ここに実際のソースコードの処理部分を入れることにする 4 .

Slide 82

Slide 82 text

型システムの強化という意味で、型の定義自体を言語に取り 入れているところは少ない 1 . 最近の特に今まで型のサポートが弱かった言語や動的言語の トレンドは外部に用意した型定義を読み込んで推論によって 開発体験を向上させるといったアプローチが多い 2 . Ruby: Sorbet, RBS(言語外) a. JavaScript: TypeScript b. Python: typing module(言語内) c . 今後も硬くかけるようになっていくっぽい 3 . 言語に対するTypeHi ntなどの取り入れ方

Slide 83

Slide 83 text

06 まとめ

Slide 84

Slide 84 text

まとめ PHPはだんだんと硬い言語になりつつある 1 . strict_typesがもっと便利になる可能性あり?declineされ ちゃったけど。 2 . 今年日本にも来られたGinaさんをはじめとしたCommiterの 方々の偉業により、型安全性を高める動きが進んでいくは ず!(色々コミュニティとして貢献していきたいところ) 3 . 強い型付けと弱い型付けどちらもあるのはやっぱすごい。 4 . 内部の命名からも今後はもっと硬くしていくつもりっぽい 5 .

Slide 85

Slide 85 text

ご清聴ありがとう ございました! 時間があれば、余談に続く

Slide 86

Slide 86 text

07 余談

Slide 87

Slide 87 text

余談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 .

Slide 88

Slide 88 text

余談2: まだまだPHPの型の怪しいところ 型の相互変換(TypeJuggling) 型の機能自体が 値の型そのものを見ているわけではなく、 値の内容が目的の型に変換できるかどうかでみている a. 受け入れられると型変換されると言った性質を持つ部分が あるため、このようなことが結構おきる b. 日本に来てGina Peter Banyard(Girgias)さんがLTをし てくださった際にもTypeJugglingには言及されていて、 安全に型が使えるようにRFCを出してくださることが多い c . swisskyrepo/PayloadsAllTheThings にも例がある d.

Slide 89

Slide 89 text

余談3: 実はt ypeに優先順位がある え?typeに優先順位なんてあんの?と思いましたw

Slide 90

Slide 90 text

余談4: 型システムを調査で便利だったもの 調査の時に全くわからない分野だったので、色々使ったりしたの ですが、本日リリースされたClaudeが一番わかりやすく、詳細 な調査結果を的確に出力していました。 ChatGPTよりも体験と精度はこの分野においては良かったの で、試してみると良いかなと思いました!