Download - PHP7がリリースされたいま、 改めてHackについて考える。
![Page 1: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/1.jpg)
PHP7がリリースされたいま、
改めて Hackについて考える。
株式会社インテリジェンス大谷 祐司
1
2016/01/19
![Page 2: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/2.jpg)
2
・山口県下関出身の 35 歳・企画からアプリ、インフラまで幅広くやっています。・車とプログラミングを愛しています。
・土日は育児しながら勉強しています。
・ Facebookの友達申請は気軽にぜひ! https://www.facebook.com/yuji.otani.16
自己紹介
![Page 3: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/3.jpg)
3
5年 7年1年
→ →
メイン開発言語の経歴
![Page 4: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/4.jpg)
4
インテリジェンスでは
2015年から複数のプロジェクト
で
Hack/HHVMを導入しています。
![Page 5: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/5.jpg)
5
PHPカンファレンス 2015では
Hack言語をテーマに登壇しました。
![Page 6: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/6.jpg)
6
・ Facebookによって開発された言語。
・ PHPと互換性を持っている。
・ HHVMという仮想マシン上で動作する。
・言語仕様は PHP5.6がベース。
Hackとは?
![Page 7: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/7.jpg)
・バグのないコードを迅速に書けるようになる。
・エンジニアがコーディング体験を楽しめる。
・「高速な動作」「大規模開発向きの仕様」。
Hackの目指すところ
http://growthhackjapan.com/2014-03-23-facebook-hack-released-to-the-public/
![Page 8: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/8.jpg)
8
昨年末、大きな事件が起きました。
![Page 9: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/9.jpg)
9
2015/12/03PHP7リリース !!
![Page 10: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/10.jpg)
10
大幅な高速化を実現!!
http://talks.php.net/fluent15#/wpbench
![Page 11: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/11.jpg)
11
・ Null合体演算子 (??)
・致命的エラーを補足可能 (EngineException)
・無名クラスの導入。
・スカラ型のタイプヒンティング。
・返り値のタイプヒンティング。
新しい言語仕様
![Page 12: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/12.jpg)
12
・ 64bitCPUに最適化されたデータ構造。
・ CPUキャッシュを有効活用する改善。
・配列はメモリ上でも配列になった。 (PHP5は全て連想配列 )
・配列のメモリ使用量が劇的に下がった。 ※ PHP5( 72bytes →) PHP7( 32bytes)
データ構造の変更
![Page 13: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/13.jpg)
13
Hack/HHVMの特徴がいくつも、PHP7に搭載されました。
・スカラ型のタイプヒンティング。
・返り値のタイプヒンティング。
・高速な動作。
・配列で使うメモリが少ない。
・ AST(抽象構文木 )を使ったコンパイル。
![Page 14: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/14.jpg)
14
Hack/HHVMと PHP7は
何を基準に選ぶべきなの
か???
![Page 15: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/15.jpg)
15
Hack/ PHP7機能の比較
![Page 16: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/16.jpg)
16
タイプヒンティング
![Page 17: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/17.jpg)
17
タイプヒンティングとは?
functionの引数/戻り値がどの種別かを指定できます。
Class Sample {public static function sampleFunc(int $a):
string{return "OK";
}}
//OKSample::sampleFunc (1);
//Fatal ErrorSample::sampleFunc ("a");
![Page 18: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/18.jpg)
18
PHPのタイプヒンティング
指定できる種別は、バージョンアップ毎に追加されました。
PHP5.0:クラス
PHP5.1:配列
PHP5.4:クロージャや関数名
PHP7 :スカラー型 (int, float, string, bool)
![Page 19: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/19.jpg)
19
タイプヒンティングの仕様は、
Hackと PHP7で大きく異なります。
![Page 20: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/20.jpg)
20
タイプヒンティング/ PHP7
2つのタイプが存在。
・弱い型指定→自動的な型キャスト。→・強い型指定 型まで厳密に判別。
<?php
Class Sample {public static function sampleFunc(int $a): string{
return "OK";}
}
//どちらのタイプでも OKSample::sampleFunc(1);
//「弱い型指定」のみ OKSample::sampleFunc("1");
![Page 21: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/21.jpg)
21
タイプヒンティング/ PHP7
・デフォルトは「弱い型指定」
・「強い型指定」には、ファイルの最初で宣言が必要。
・ファイル単位でのみ「強い型指定」が設定可能。 → iniファイル等での指定は不可能。
<?php//ファイルに「強い型指定」が有効になる。declare(strict_types=1);
![Page 22: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/22.jpg)
22
タイプヒンティング/ PHP7
・ Nullや複数型の許可を明示することができない。
・タイプヒンティングのある functionに Nullを渡すとエラー
<?php
Class Sample {public static function sampleFunc(int $a):
string{return "OK";
}}
//Fatal ErrorSample::sampleFunc(null);
![Page 23: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/23.jpg)
23
タイプヒンティング/ Hack
・ PHP7の「強い型指定」のみが存在。
・mixedを使うことで、 Nullを含むあらゆる型を許容できる。
<?hh
Class Sample {public static function sampleFunc(mixed $a): string{
return "OK";}
}
//OKSample::sampleFunc(null);Sample::sampleFunc(1);Sample::sampleFunc(”a");
![Page 24: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/24.jpg)
24
タイプヒンティング/ Hack
・ Nullを許容する場合には、型の初めに ?を付ける。
<?hh
Class Sample {public static function sampleFunc(?int $a): string{
return "OK";}
}
//OKSample::sampleFunc(null);Sample::sampleFunc(1);
![Page 25: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/25.jpg)
25
タイプヒンティング/ Hack
配列にの Key, Valueに型指定できる。(ただし実行時のチェックは機能せず、静的解析のみ。 )
<?hh
Class Sample {public static function sampleFunc(array<int, string> $a):
string{return "OK";
}}
//OKSample::sampleFunc(array(1 => "a", 2 => "b"));Sample::sampleFunc(array(1 => 1, 2 => null));
![Page 26: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/26.jpg)
26
タイプヒンティング/ Hack
Enumを指定することで、明示的な制約ができる。<?hh
enum Size: int {MEDIUM = 1;LARGE = 2;
}Class Sample {
public static function sampleFunc(Size $size): string{return "OK";
}}//OKSample::sampleFunc(Size::LARGE);Sample::sampleFunc(2);Sample::sampleFunc(4); //チェックは型のみで値は見ない。//ErrorSample::sampleFunc(”a");
![Page 27: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/27.jpg)
27
タイプヒンティング
・「強い型指定」が基本。
・ Nullの許容やmixedが設定可能。
型をきちんと意識した、 大規模サービス向けの仕様。
・「弱い型指定」が基本。
・型の設定のみ可能。
型を意識せず実装できる、 開発速度を重視の仕様。
![Page 28: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/28.jpg)
28
コレクション
![Page 29: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/29.jpg)
29
PHP5系の配列とは
・内部的には、順番つけされたマップ
・配列と連想配列を同じものとして扱える。
・キーは整数または文字列。
・数字をキーにしても、値は入れた順番に取り出される。
<?php//実行すると abと表示される。$arr = array(1 => ”a", 0 => ”b");foreach($arr as $value ) { print($value);}
![Page 30: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/30.jpg)
30
配列/ PHP7
・値の取り出しに Null合体演算子 (??)が利用可能。
→未定義の値をチェックしても Notice にならない。
<?php$arr = array();
//PHP5でよく使われた三項演算子での記述$a = isset($arr["foo"])? $arr["foo"] : "bar";
//エルビス演算子での記述 (!empty相当のチェック /Notice発生 )$b = $arr["foo"] ?: "bar";
//Null合体演算子での記述 (isset相当のチェック /Noticeしない )$c = $arr["foo"] ?? "bar";
![Page 31: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/31.jpg)
31
コレクション/ Hack
・独自のコレクションが利用可能 (Vector/Map/ Set/ Pair)
→宣言時に型を指定できる (実行時チェックは行わない )
<?hh
$a = new Map<string, string>;
//OK$a->set("key1", "value1");
//OK$a->set("key2", 2);
//OK$a->set(3, array());
![Page 32: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/32.jpg)
32
コレクション/ Hack
・ Getメソッドを使うことで、 issetでキーをチェックしなくて
も
Noticeを出さずに値の取り出しが可能。<?hh
$a = new Map<string, string>;
$a->set("key1", "value1");
//$val1 ”に value1”が入る。$val1 = $a->get("key1");
//$val2に NULLが入る。 Noticeは発生しない。$val2 = $a->get("key2");
![Page 33: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/33.jpg)
33
Map
キーと値をセットで格納。
B
A
D
EC
![Page 34: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/34.jpg)
34
Vector
順番に値を保持する純粋な配列。
21 4 53
![Page 35: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/35.jpg)
35
Set
値の集合で、中身の重複が認められない。
BA D EC
![Page 36: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/36.jpg)
36
Pair
2つの値をセットにして保持。
![Page 37: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/37.jpg)
37
配列/コレクション
・ 4つの独自コレクション。
・コレクションに型を指定可能。
型をきちんと意識した、 大規模サービス向けの仕様。
・” ”何でも入る 配列のみ利用可能。
・ Null合体演算子 (??)が利用可能。
連想配列に何でも突っ込める、 開発速度を重視の仕様。
※Null合体演算子は HHVM3.11から Hackで利用可能
![Page 38: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/38.jpg)
38
その他の言語仕様
Hackのみ存在
・ラムダ式、 Generics、 Enum、並列実行 (async, await)
PHP7のみ存在
・致命的エラーのハンドリング。
・ defineで配列が利用可能。
<?phpdefine("SAMPLE", array("a"=>1,2,3));
![Page 39: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/39.jpg)
39
静的解析ツール
HHVM
→hh_clientにより、コードの静的解析が可能。
構文エラーや型の不整合など実行前に潰すことができる。
PHP7
→同等の機能なし。
![Page 40: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/40.jpg)
40
実行前に構文チェックを行えます。
・コンパイルエラー
・引数 /戻り値の型チェック
・非推奨の構文
・型の不適切な変換
etc
静的解析ツール/ Hack(HHVM)
※設定ファイルの hhvm.hack.lang.auto_typecheckで 自動実行の有無を設定可能。
![Page 41: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/41.jpg)
41
品質重視で開発するなら Hack、
スピード重視なら PHP。
それぞれに特徴を持っています!
わかったこと
![Page 42: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/42.jpg)
42
コミュニティの投票によって機能実装が決まる PHP
と
Facebookによって開発される Hack言語。
PHPは「緩い PHPらしさ」を大切にしており、 Hack
言語は「実用性としての正しさ」を大切にしているよ
うに感じています。
個人的な印象
![Page 43: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/43.jpg)
43
リリースサイクル
Hack(HHVM)
・ 8週ごとにリリース。
・3バージョン毎の LTSを1年間のサポート。
PHP
・リリースサイクル 1年
・ライフサイクル 3年 (バグ修正 2年、セキュリティ修正 1年 )
![Page 44: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/44.jpg)
→LTSを約 1年間サポート。
サポートについて/ Hack
![Page 45: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/45.jpg)
45
HHVMの PHP7対応状況
![Page 46: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/46.jpg)
46
HHVMは PHP7に対応していく方針
http://hhvm.com/blog/10859/php-7-support
![Page 47: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/47.jpg)
47
ざっくりポイント
・ PHP7リリースは HHVMにとっても本当にめでたい。
・ HHVM3.11から PHP7の機能に対応していく。
・ PHP5と PHP7の両方をサポートしていく方針。
・設定ファイル「 hhvm.php7.all = 1」で、後方互換のない PHP7の設定を有効にできる。
https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings
![Page 48: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/48.jpg)
48
PHP7に関する issueを Githubで確認可能
https://github.com/facebook/hhvm/labels/php7%20incompatibility
![Page 49: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/49.jpg)
49
まとめ
・ PHP7と Hackには、似たようで異なる特徴が存在する。
・ Hackには「大規模開発」に適した独自機能が存在する。
・ Hackは PHPと分裂せず、 PHPと同期して進化していく。
![Page 50: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/50.jpg)
50
まとめ
・ HHVM3.11で PHP7の機能を実装。 1月 29日リリースの
3.12が
PHP7の機能をサポートする初めての LTSになる。
・ PHP7の機能については、段階的に Hackに実装予定。
![Page 51: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/51.jpg)
51
PHPという優れた言語の未来に
選択肢があることは素晴らしい!
![Page 52: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/52.jpg)
52
PHP7が出ましたが、まだまだ
Hack/HHVMを選ぶ価値はあります!
![Page 53: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/53.jpg)
53
ご静聴ありがとうございました。
![Page 54: PHP7がリリースされたいま、 改めてHackについて考える。](https://reader036.vdocuments.net/reader036/viewer/2022062401/58f1a65b1a28abb20a8b457f/html5/thumbnails/54.jpg)
54
この資料は、正確な記述を心がけて作成していますが、
内容の正確性や有用性を作者は保証しません。また、
本資料は作者個人が作成したものであり、所属する組
織・団体の見解等を表すものではありません。
免責事項