Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPerがこれから「型」とお付き合いしていくために
Search
penguin045
February 11, 2020
Programming
1
2.2k
PHPerがこれから「型」とお付き合いしていくために
PHPerKaigi 2020登壇資料
penguin045
February 11, 2020
Tweet
Share
More Decks by penguin045
See All by penguin045
20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
penguin045
1
2.1k
言語の力でモデリングを表現する
penguin045
0
230
初めてのClojure
penguin045
0
580
技術的負債を見つめなおす
penguin045
1
1.2k
社内最長老のシステムにPHPUnitで立ち向かう方法
penguin045
1
2.8k
Other Decks in Programming
See All in Programming
今こそ始める、CDKコンストラクトライブラリ開発 ― 入門から実践まで
tmokmss
1
930
feature環境をGitHub ActionsとCloudFormationでいい感じに管理する
nealle
2
310
Rust.Nagoya #1
codemountains
0
170
[After Kotlin Fest 2024 LT Night @ Sansan] もっともっとKotlinを好きになる!K2 Compiler Pluginで遊んでみよう!
kitakkun
2
260
英語
s_shimotori
1
220
日付と正規化
megmogmog1965
0
140
How to use Macrobenchmark
veronikapj
0
160
大規模マルチテナントを解決するYugabyteDBという選択肢
nnaka2992
1
250
The rollercoaster of releasing an Android, iOS, and macOS app with Kotlin Multiplatform | droidcon Berlin
prof18
0
110
Cloudflare Workers x AWS Lambdaの組み合わせユースケース / Cloudflare Workers x AWS Lambda Combination Use Case
seike460
PRO
2
310
開発部に不満を持っていたCSがエンジニアにジョブチェンしてわかった「勝手に諦めない」ことの大切さ
sakuraikotone
28
16k
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
1.9k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
26
2.1k
A better future with KSS
kneath
231
17k
What’s in a name? Adding method to the madness
productmarketing
PRO
21
2.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
224
21k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
29
2.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
149
45k
Pencils Down: Stop Designing & Start Developing
hursman
118
11k
How to train your dragon (web standard)
notwaldorf
79
5.5k
Ruby is Unlike a Banana
tanoku
96
10k
WebSockets: Embracing the real-time Web
robhawkes
59
7.2k
The Invisible Customer
myddelton
117
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
229
130k
Transcript
PHPerがこれから「型」と お付き合いしていくために やなせ たかし
自己紹介 やなせ たかし 株式会社ラクスで働いています。 PHP 歴 1 年未満 Scala 大好きマン
ギターを嗜みます。ギターと技術で何かしたい ( 願望 ) 2
今日話すこと • 型システムとは何なのか • 型システムとプログラミング言語 • PHP と型 • 今から型システムとお付き合いを始めるには
3
型システムとは何なのか 4
型システムとは何なのか • 本セッションでの前提 • 定義 • 型システムでできること 5
型システムとは何なのか • 元は型理論という分野 ◦ コンピューターが存在する前からある ◦ 数学、論理学などで用いられる • ここでは、プログラミングに関することを話します 6
型システムとは何なのか • プログラムのふるまいを推論するためのツール • 始めは int と float の違いを区別するようなもの ◦
効率よく計算するため • 1970 年ごろからより高度な概念が研究される ◦ 部分型 ◦ 再帰型 ◦ 多相 ◦ 高階型 ◦ などなど 7
型システムでできること • エラー検知 • 構造を明らかにする • 安全性を高める • プログラムの効率性を高める 8
• データ構造の不整合を検知してくれる ◦ しかも実行前にわかる • 特定のバグがないことを保証できる ◦ 静的に型検査をしている場合 エラー検知 9
• データ構造の不整合を許容しない ◦ 柔軟性を持たせるのには工夫が必要 ◦ とはいえ、全てを汎用的な型で実装すると恩恵が受けられない • 特定のバグがないことを保証しなければならない ◦ 絶対に実行されないコードのエラーも検知してしまう
エラー検知(裏の顔) 10
構造を明らかにする • 利用側と実装を分離できる ◦ インターフェイスを型として扱うことで、利用する型を保証できる • ドキュメント化しやすい ◦ シグネチャーの型が正しいことは保証されている 11
安全性を高める • 自身が抽象化した操作を保護できる ◦ 型検査の時点で不整合があるとエラーになる ◦ たとえば、配列を使っているだけではメモリ破壊を起こさない 12
安全性を高める(裏の顔) • 多くの言語では、抜け道が存在する ◦ たとえば、メモリ操作 API があるとか ◦ 低レベル API
はそういうのがありがち • 「安全」の定義がまちまち ◦ 型安全? ◦ メモリ安全? 13
プログラムの効率性を高める • 実行時に効率的なバイトコードを生成する ◦ 静的型付き言語をコンパイルする ◦ 低レベルで最適化できるので効率が良くなる ◦ 動的型付き言語でも、 JIT
をで型情報を集めてコンパイルしていることも 14
型システムがもたらすもの • 安全性と ( 実行時の ) 効率 • ただし、柔軟性とはトレードオフになりがち 15
型システムとプログラミング言語 16
型システムとプログラミング言語 17 • 静的型付け・動的型付けとは • 静的型付き言語 • 動的型付き言語 • 両者を比較してみる
静的型付け・動的型付けとは 型検査がいつ行われるかの違い • 静的型付けはコンパイル時に型検査が行われている • 動的型付けは実行時に型検査が行われている 18
静的型付き言語の特徴 • コンパイル時に型が検査されている • コンパイルされたら効率的なバイトコードになる • 型に不整合があるプログラムは実行できない • 型を書く必要がある言語もある ◦
昔の Java とか • ( 一部 ) 型を書かなくてもいい言語もある ◦ Scala とか • 型を書くのがデメリットというわけではない 19
コンパイルされたらどうなるの • コードが直接低レベルな命令に翻訳されている • 一方インタープリターはコードを解釈しながら実行 型がわかっていれば、翻訳時に最適化が効く。 => 何らかの原因で型検査が入ると効率が悪くなる • キャストやリフレクション
20
動的型付き言語の特徴 • 型検査は実行時に行われる • 型の不整合は実行時にエラーとなる(こともある) • 型を書ける言語も増えてきた ◦ PHP も型を書けるようになってきましたね
21
両者を比較してみる • 型を書くの?書かないの? • 型推論ってあるけど、動的言語と何が違うの? • 静的解析するから、静的型付き言語は不要では? • 結局どっちがいいの? 22
型を書くの?書かないの? 静的型付き言語 • 書くし、書かないこともある 動的型付き言語 • 書かないが、書くこともある 23
型をアノテーションへのモチベーション 静的型付き言語 • 自明なものは書かないでいいようにしていきたい 動的型付き言語 • 安全のために型を書こう 24
型推論ってあるけど、動的言語と何が違うの? 型推論 • 静的型付き言語で、コンパイラが型を推論する • 実行時は型検査のないただの命令に翻訳されている 動的型付き言語 • 実行時まで型が決まっていない •
実行時に型検査をする 25
横道:型推論について • 右辺の型を計算し、左辺の型を推論します • var a = hoge; だけではない def
map(ls, f) = ls match { case h::t => f(h) :: map(t, f) case Nil => Nil } • 上の疑似コードの型が決まるのが型推論のすごさ 26
静的解析するから、静的型付き言語は不要では? • 静的型付き言語と比較すると恩恵は限定的 • ある程度の恩恵は受けられる ◦ 静的解析できる範囲では型安全に実装できる ◦ 実行時の恩恵は受けられない =>
漸進的型付け などと表現される 27
結局どうなの 優劣はない その場その場の有利不利はある プロダクトのフェーズによっても変わる 文化によっても変化する 多分いつまでも優劣はつかない ただし、超えられない壁はある(双方ともに) 28
PHPと型 29
PHPと型 • どういう言語 • PHP の型 • 漸進的型付けの言語として 30
PHPってどういう言語 • 弱い型付けの動的型付き言語 ◦ ここが柔軟性に聞いてくる • インタープリターで実行される ◦ Opcache はあるけどね
• 型に関する改修が最近多いのはご存知の通り 31
型システムを強化することへの期待 • 型宣言が性能を上げる ◦ JIT で型宣言の情報を使う ◦ タイプヒンティングをすると性能が悪いのは過去の話 ▪ すでに
Opcache で性能向上に利用されている(と言えなくもない) • 開発のしやすさの向上 ◦ もちろん動的型付き言語のメリットはある程度犠牲になる ◦ プロダクトの長い成長に耐えるコードベースの基礎ができる 32
PHPが型を手に入れるべきか 後方互換性との兼ね合いが心配 新規開発ならまだいいかも知れない 言語の進化としても気になるところがある。 => 進化がドラスティックなわりに、根本的な課題 array の扱いが難しいなど 33
ケース1 設定 • 既存システムの開発者 • 動的型付き言語として普通に開発されていた • レガシーシステムかもしれない • 開発環境は
phpStorm => 型宣言より phpDoc をまず書く 34
ケース1 • 既存システムに型宣言を書くのは難しい ◦ 柔軟な運用をしている場合は特に • PHPDoc なら動作を制限しない ◦ しかし、
IDE の支援は受けることができる => ある程度型システムの恩恵を受けられる 35
ケース2 設定 • スクラッチ開発 • 既存コードなんてない => 型宣言を積極的に使っていく 36
ケース3 設定 • 既存システム • 型は意識していない • 型宣言されたライブラリを使うことになった => オーバーロードする場合は注意
型を明確にしたい場合は DTO 用意するのも良し 37
ケースバイケース 38
以上 39
Any Questions? 40