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