Slide 1

Slide 1 text

Rubyとその他言語の型比較 スー

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

Rubyの最近の型システム Ruby3. 0からはRBSを利用した RBS Steep 型を明示的に記述できるようになった。 これにより、 Nomi nal Type Systemの要素が強化 1 . 型安全性が向上 2 . Steepなどのツールを使用することで、RBSで定義された 型に基づいて静的な型検査が可能 3 .

Slide 25

Slide 25 text

RBSとSteepの使い分け RBS 型情報を記述する Steep その型情報を基に型チェックを行うツール

Slide 26

Slide 26 text

02 他の言語が採用している 型システムと比べる

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Python

Slide 29

Slide 29 text

Ruby

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Rust

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

TypeScri pt

Slide 34

Slide 34 text

04 まとめ

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Rubyの型システムのつよみ 強い型付け 1 . 型が完全に外出しされており、言語系に直接影響を与えてい ないこと 2 . それぞれ型検査・型推論・型記述のデファクトスタンダード であるツールが定まりつつあること 3 .

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

07 余談