480 Views
June 06, 25
スライド概要
「比較は物事の本質を知る手段の1つである」、これは私が大学時代に英語学を専攻して学んだ大切な金科玉条である。
この手段は自然言語だけではなく、プログラミング言語にも応用出来る。
今回は Ruby と TypeScript 間の静的型付けの歴史・エコシステム・哲学の差分を比較する。
「外国語を1つも知らない者は、自らの母語について何も知らないに等しい」
某教育系サービスの内製開発にソフトウェアエンジニアとして携わっています。 使用技術スタックは、サーバーサイドは Ruby on Rails、フロントエンドは React.js + TypeScript です。 プライベートでは Python も少し書きます。 学部生時代は英語学を専攻していたので、言語に強い興味を持っています。 LT 会のプレゼンテーションなどで使用したスライドを掲載しています。 宜しければご自由にご覧下さい。
静的型付けの哲学 -Ruby vs. TypeScript作成者: 石田 隼人 英語版はこちら 最終更新日: 2025年06月06日 1
自己紹介 • 各種アカウント • • • • • GitHub: @hayat01sh1da Speaker Deck: @hayat01sh1da Docswell: @hayat01sh1da X: @hayat01sh1da Linkedin: @hayat01sh1da • 職業: ソフトウェアエンジニア • 趣味 • • • • • 言語学 カラオケ 音楽鑑賞 映画鑑賞 猫飼育 2
免許 / 資格 • 英語 • TOEIC® Listening & Reading 915点: 2019年12月 取得 • エンジニアリング • • • • 情報セキュリティマネジメント: 2017年11月 取得 応用情報技術者: 2017年06月 取得 基本情報技術者: 2016年11月 取得 IT パスポート: 2016年04月 取得 • その他 • 珠算2級: 2002年06月 取得 • 暗算3級: 2001年02月 取得 3
スキルセット • 言語 • 日本語: 母語 • 英語: ビジネスレベル • 開発 • Ruby: 中上級(FW: Ruby on Rails) • Python: 中級 • TypeScript:中級(Library: React.js) • HTML:中級(Library: Bootstrap) • CSS:中級(Library: Bootstrap) • SQL:中級 • その他 • ドキュメンテーション: 上級 4
職歴 1. システムエンジニア @SES • レガシー Windows Server 運用・保守 • 社内アカウント管理 • 社内セキュリティ啓蒙 • 英語通訳(海外拠点とのオンライン会議・ベンダー対応・海外スタッフのアテンド) 2. ソフトウェアエンジニア @受託開発会社 • サーバーサイド開発(Ruby on Rails, RSpec) • フロントエンド開発(HTML / CSS, JavaScript) • QA(Native iOS / Android Apps) • 企業技術ブログ記事執筆 3. ソフトウェアエンジニア @チャットボットプラットフォーム開発会社 • 既存チャットボットプラットフォーム開発・運用・保守(Ruby on Rails, RSpec) • 新規チャットボットエンジン性能検証(Ruby, Ruby on Rails, RSpec, Python) 4. ソフトウェアエンジニア @メガベンチャーの教育系サービス内製開発部門 • 学事・進路支援機能開発(Ruby on Rails, RSpec, Minitest, TypeScript + React.js) • 年次高校マスタデータ更新(Ruby on Rails, RSpec) • 負債解消活動(Ruby, Python, GitHub Actions etc.) 5
国際交流活動 • 大学時代 • • • • 英語学ゼミ(マスメディア英語) 国際交流サークル兼部(2年次) 内閣府主催国際交流プログラム(2013年 - 2016年) 日本語学の授業の S 単位取得(最終年次) • 海外生活 • オーストラリアでのワーキングホリデー(2014年04月 - 2015年03月) • • • 2ヶ月間のシドニーの語学学校通学 6ヶ月間の Hamilton Island Resort での就労 1ヶ月間の NSW 州の St Ives High School での日本語教師アシスタントボランティア活動 • その他活動 • • • • • 英語での日々の日記(2014年04月 - 現在) Sunrise Toastmasters Club 参加(2017年02月 - 2018年03月) Vital Japan 参加(2018年01月 - 2019年07月、2022年10月 - 2023年02月) 英語自己学習 Ruby 関連カンファレンス参加 6
LT に入る前に… RubyKaigi チーフオーガナイザーの松田明さんより許可を頂き、RubyKaigi 2025 の公式ロゴを背景に使わせて頂いております(著作権侵害はありません)。 Ref) https://x.com/a_matsuda/status/1918612709169672210 7
1. 静的型付けの基本おさらい 9
1. 静的型付けの基本おさらい トレードオフ • 未定義動作によってもたらされるシステムやプログラムの異常終了やセキュ リティホールから保護する • 実行前にタイプエラーを検知する • 大規模なソースコードをバグ・型の不整合・危険なリファクタリングなどの 「鼻から悪魔」からより効率的に保護する • JavaScript のような処理機構では、例えば `x.foo()` を実行するたびにレシー バーの型を検査するので、大きなオーバーヘッドによるパフォーマンス悪化を招 くケースがある • 開発者はソースコードだけでなく型定義の管理もしなければならない • 開発者は静的型付けのメカニズムを理解するための学習コストを払わなけれ ばならない 10
1. 静的型付けの基本おさらい 分類 静的型付け 型検査のタイミング コード実行前 言語 動的型付け コード実行中 • Ruby • JaveScript • Java • Swift etc. • TypeScript • C • Rust • Java • Swift etc. 11
2. 型付けエコシステム 12
2. 型付けエコシステム Ruby 機構 Gem 説明 RBS RBS(Ruby Signature) Ruby プログラムの構造を記述するための公式 Gem。Ruby の DSL ではなく別の言語である Steep RBS 上の型定義を元に型検査を行う TypeProf Ruby コードを元に RBS 上の型定義の推論を行う rbs-inline Ruby コード上のインラインコメントを元に RBS を生成する RBI(Ruby Interface) Ruby の I/F ファイルを Sorbet に提供するための Ruby API を公 開する Sorbet 既存の Rubyコードに漸進的な型付けとエラーや提案の迅速な 応答を提供する Tapioca Ruby コードだけでなく、Gem・Rails・DSL などを読み込んで RBI ファイルをコンパイルする RBI 13
2. 型付けエコシステム Ruby: RBS + Steep 例) RBS + Steep person.rb sig/person.rbs $ rbs prototype rb person.rb $ steep check # Type checking files: ... No type error detected. 14
2. 型付けエコシステム Ruby: RBS + Steep 例) rbs-inline + Steep person.rb sig/generated/person.rbs $ rbs-inline --output person.rb Generated 1 RBS files under sig/generated $ steep check # Type checking files: ... No type error detected. 15
2. 型付けエコシステム TypeScript Ruby は構文の後方互換性を担保するために RBS 以外のエコシステムを取り 入れていない。 一方、TypeScript は Generics・Object Types・Interfaces を大胆に取り入れて JavaScript のエコシステムを変化させた。 この大きな変更は「既存コードに変更を加えずに型検査を導入しなければ いけない」という思い込みを覆したと、Ruby コミッターの松本宗太郎氏 (@sotaro)はあるブログ記事で言及した。 彼は JavaScript がすでに豊富なライブラリや高機能な開発環境が整っていた ため、既存のコードベースの TypeScript への移行が可能だったとも述べた。 16
3. 型付けの哲学 17
3. 型付けの哲学 Ruby Heroku 社の Developer Advocate である Jonan Scheffler 氏が執筆したあるブログ記事 で、Ruby の開発者であるまつもとゆきひろ氏(通称 Matz)が静的型付けについて以 下のように言及している。 以下の会話は、氏が豊かなコーディング体験とその後方互換性を保つことでもた らされる開発者の喜びを重視していることを証明する。 Jonan) それでは、JIT の文脈で Ruby 3 で導入されるいくつかの変更点と静的型付け についてすでにお話しされましたが、静的型付けについて教えて下さい。 Matz) ええ、Ruby 3 という3番目のメジャーバージョンの目標はダックタイピング を担保しつつ静的型付けを導入することなので、まあある種のソフトタイピング のような構造ですね。型付け機構の主目的は早期のエラー検知です。なので、こ の静的型付けや型付けインターフェースの導入は既存のランタイムに影響はあり ません。 18
3. 型付けの哲学 Ruby 事実、RBS は Ruby そのものからは独立したエコシステムであり、signature は Ruby とは異なる言語である。 `xxx.rbs` は対応する `xxx.rb` とは分離しており rbs-inline は型定義をコメントとして 扱うので、既存の Ruby コードには影響を与えない(インライン型定義コメントがコ メント以上の意味を持ってしまってはいるが)。 私見では、rbs-inline のコンセプトは以下の点でとても開発者に優しいと考える。 • 静的型付け定義が仕様ドキュメントの役割を果たす • 特にウェブ API として使われているアプリケーションでは、返却値の型は明示さ れて然るべきである • rbs-inline のインラインコメントは文字通り一石二鳥である 19
3. 型付けの哲学 TypeScript Ruby コミッターの遠藤侑介氏の著書『型システムのしくみ - TypeScript で実 装しながら学ぶ型とプログラミング言語』の p.3 にて、「TypeScript は、無 理がなく従来の JavaScript のコーディング体験を損なわない範囲でのみ望ま ない挙動の検知を行う」という TypeScript の哲学に言及している。 例えば、以下の後方定義変数はどちら型検査時にはエラーを発生しないが、 後者実行時に ReferenceError が発生する。 WSL a.ts b.ts 20
3. 型付けの哲学 TypeScript この現象は、未初期化変数が定義済みの関数から参照出来てしまうことを 表している。 このような型不安全は型検査機構で検知されるべきであるが、TypeScript は 敢えて無視している。 それは何故か? 著者によると、JavaScript は従来この手の実装を許容してきたので、 TypeScript で未初期化変数に対する制約を入れると JavaScript との後方互換 性を破壊してしまう可能性がある。 Ruby がそうであるように、TypeScript もまた従来のコーディング体験の維持 を重要視していることが分かる。 21
4. まとめ 22
4. まとめ • Ruby と TypeScript はともに後方互換性を維持することによって従来のコー ディング体験を保証することに粉骨砕身している • TypeScript は Generics・Object Types・Interfaces の大胆な導入によって、静 的型付け周りのエコシステムの統合に成功した • Ruby は RBS(Ruby Signature) と RBI(Ruby Interface) という、静的型付けの2つ の大きな勢力が存在する。まだ「自然淘汰」「適者生存」の決着はついて いない • いずれにしろ、開発者は認識している以上の恩恵を静的型付けから享受で きるので、その導入はかなり価値の高いものである 23
5. 参考文献 24
5. 参考文献 • いかにして動的型付けの Ruby に静的な型検査を持ち込むか? Steep と RBS が目指すもの • 最終アクセス日: 2025年06月06日 • RubyKaigi 2025 初参加エンジニアのための Ruby 静的型付けガイド • 最終アクセス日: 2025年06月06日 • The State of 静的型付け in Ruby in 2025 • 最終アクセス日: 2025年06月06日 • Why 静的型付け is Essential for Efficient Ruby and Rails Development • 最終アクセス日: 2025年06月06日 • 静的型付け in Ruby: It's Not a Cult, It's a Choice (You Should Probably Make) • 最終アクセス日: 2025年06月06日 25
5. 参考文献 • Ruby 3×3: Matz, Koichi, and Tenderlove on the future of Ruby Performance • 最終アクセス日: 2025年06月06日 • RBS(Ruby Signature) • 最終アクセス日: 2025年06月06日 • Steep • 最終アクセス日: 2025年06月06日 • TypeProf • 最終アクセス日: 2025年06月06日 • rbs-inline • 最終アクセス日: 2025年06月06日 • RBI(Ruby Interface) • 最終アクセス日: 2025年06月06日 26
5. 参考文献 • Sorbet • 最終アクセス日: 2025年06月06日 • Tapioca • 最終アクセス日: 2025年06月06日 • TypeScript Official Documents • 最終アクセス日: 2025年06月06日 • 10 Must-Know TypeScript Features to Improve Your Coding Efficiency • 最終アクセス日: 2025年06月06日 • 遠藤侑介、『型システムのしくみ - TypeScript で実装しながら学ぶ型とプ ログラミング言語』、東京、ラムダノート株式会社、2025年 27
EOD 28