Upload
yuji-otani
View
6.932
Download
0
Embed Size (px)
Citation preview
PHP7ではなく
Hack/HHVMを選ぶ理由
株式会社インテリジェンス大谷 祐司
1
2016/02/24
2
・山口県下関出身の 35 歳・インテリジェンスの新規事業で技術責任者。
・車とプログラミングを愛しています。
・ Facebookの友達申請は気軽にぜひ! https://www.facebook.com/yuji.otani.16
自己紹介
3
5年 7年1年
→ →
メイン開発言語の経歴
4
質問①
Hack/HHVMを使ったことがあるかた
5
質問②
PHP7が出たけど、これから
何を使おうか迷っているかた
6
本日の目的
Hack/HHVMの素晴らしさを伝えて
今後の選択肢にしてもらいたい。
7
インテリジェンスでは
2015年から複数のプロジェクト
で
Hack/HHVMを導入しています。(フレームワークは FuelPHP)
8
転職サイト MIIDAS
9
社員紹介サービス MyRefer
10
・ Facebookによって開発された言語
・ PHPと互換性を持っている
・ HHVMという仮想マシン上で動作する
・言語仕様は PHP5.6がベース
Hackとは?
・バグのないコードを迅速に書けるようになる
・エンジニアがコーディング体験を楽しめる
・「高速な動作」「大規模開発向きの仕様」
Hackの目指すところ
http://growthhackjapan.com/2014-03-23-facebook-hack-released-to-the-public/
12
・ PHPのノウハウを生かしながら、新しいこ
と にチャレンジしたい。
・パフォーマンスが良いサービスにしたい。
・将来的に大規模になった時にも可読性がよ
く、 スピーディーな改修ができるようにしたい。
・ PHP7がまだリリースされないので。
Hackの採用理由
13
昨年末、大きな事件が起きました
14
2015/12/03PHP7リリース !!
15
大幅な高速化を実現!!
http://talks.php.net/fluent15#/wpbench
16
・ Null合体演算子 (??)
・致命的エラーを補足可能 (EngineException)
・無名クラスの導入。
・スカラ型のタイプヒンティング。
・返り値のタイプヒンティング。
新しい言語仕様
17
・ 64bitCPUに最適化されたデータ構造。
・ CPUキャッシュを有効活用する改善。
・配列はメモリ上でも配列になった。 (PHP5は全て連想配列 )
・配列のメモリ使用量が劇的に下がった。 ※ PHP5( 72bytes →) PHP7( 32bytes)
データ構造の変更
18
Hack/HHVMの特徴がいくつも、PHP7に搭載されました。
・スカラ型のタイプヒンティング
・返り値のタイプヒンティング
・高速な動作
・配列で使うメモリが少ない
・ AST(抽象構文木 )を使ったコンパイル
19
PHPは今、大きな転換期。
だからこそ、 Hack/HHVMの良さを
ぜひ知ってもらいたいと思います。
20
ポイント①強力なタイプヒンティング
21
タイプヒンティングとは?
functionの引数/戻り値がどの種別かを指定できます。
Class Sample {public static function sampleFunc(int $a):
string{return "OK";
}}
//OKSample::sampleFunc (1);
//Fatal ErrorSample::sampleFunc ("a");
22
PHPのタイプヒンティング
指定できる種別は、バージョンアップ毎に追加されました。
PHP5.0:クラス
PHP5.1:配列
PHP5.4:クロージャや関数名
PHP7 :スカラー型 (int, float, string, bool)
23
タイプヒンティングの仕様は、
Hackと PHP7で大きく異なります。
24
タイプヒンティング/ PHP7
2つのタイプが存在。
・弱い型指定→自動的な型キャスト。→・強い型指定 型まで厳密に判別。
<?php
Class Sample {public static function sampleFunc(int $a): string{
return "OK";}
}
//どちらのタイプでも OKSample::sampleFunc(1);
//「弱い型指定」のみ OKSample::sampleFunc("1");
25
タイプヒンティング/ PHP7
・デフォルトは「弱い型指定」
・「強い型指定」には、ファイルの最初で宣言が必要。
・ファイル単位でのみ「強い型指定」が設定可能。 → iniファイル等での指定は不可能。
<?php//ファイルに「強い型指定」が有効になる。declare(strict_types=1);
26
タイプヒンティング/ PHP7
・ Nullや複数型の許可を明示することができない。
・タイプヒンティングのある functionに Nullを渡すとエラー
<?php
Class Sample {public static function sampleFunc(int $a):
string{return "OK";
}}
//Fatal ErrorSample::sampleFunc(null);
27
タイプヒンティング/ 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");
28
タイプヒンティング/ Hack
・ Nullを許容する場合には、型の初めに ?を付ける。
<?hh
Class Sample {public static function sampleFunc(?int $a): string{
return "OK";}
}
//OKSample::sampleFunc(null);Sample::sampleFunc(1);
29
タイプヒンティング/ 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));
30
タイプヒンティング/ 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");
31
タイプヒンティング
・「強い型指定」が基本。
・ Nullの許容やmixedが設定可能。
型をきちんと意識した、 大規模サービス向けの仕様。
・「弱い型指定」が基本。
・型の設定のみ可能。
型を意識せず実装できる、 開発速度を重視の仕様。
32
ポイント②専用のコレクション
33
PHP5系の配列とは
・配列と連想配列を同じものとして扱える。
・配列に入れる型は何でも OK。
・キーは整数または文字列。
・何をキーにしても、値は入れた順番に取り出される。
<?php//実行すると abと表示される。$arr = array(1 => ”a", 0 => ”b");foreach($arr as $value ) { print($value);}
34
コレクション/ 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());
35
コレクション/ 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");
36
Map
キーと値をセットで格納。
B
A
D
EC
37
Vector
順番に値を保持する純粋な配列。
21 4 53
38
Set
値の集合で、中身の重複が認められない。
BA D EC
39
Pair
2つの値をセットにして保持。
40
配列/コレクション
・ 4つの独自コレクション。
・コレクションに型を指定可能。
型をきちんと意識した、 大規模サービス向けの仕様。
・” ”何でも入る 配列のみ利用可能。
・配列の種類、型は意識しない。
連想配列に何でも突っ込める、 開発速度を重視の仕様。
※Null合体演算子は HHVM3.11から Hackで利用可能
41
ポイント③独自の言語仕様
42
独自の言語仕様
・ Lambdas (ラムダ式)
・ Generics (ジェネリクス)
・ Enum (列挙型)
・ Tuples (複数の要素を持つ配
列)
・ Shapes (複数の要素を持つマッ
プ)
43
Enum(値の列挙 )
<?hh
enum Size: int {SMALL = 0;MEDIUM = 1;LARGE = 2;X_LARGE = 3;
}
型を指定した値を宣言できる
44
Tuples(複数型の配列 )
<?hh
list($a, $b) = testFunc();
public function testFunc() : (string, int) {
return tuple(“OK”, 1);}
functionから複数の値を戻せる
45
独自の言語仕様
Hack/HHVMには多くの言語仕様が追加されています。
サービスの導入において、
・バグのないコードを迅速に書けるようになる
・エンジニアがコーディング体験を楽しめる
これらを実現することができています。
46
ポイント④並列実行のサポート
47
並列実行
Async/Awaitという独自の関数を利用して、
並列処理を実行することができます。
並列実行できる処理はあらかじめ準備されており、
それらを利用することで高速な処理が行えます。
48
並列実行
49
ポイント⑤静的解析ツール
50
静的解析ツール
hh_clientにより、コードの静的解析が可能。
構文エラーや型の不整合など実行前に潰すことができる。
厳密な型制約を持つ Hackで利用することで、
バグの少ないコードを実現することができます。
51
実行前に構文チェックを行えます。
・コンパイルエラー
・引数 /戻り値の型チェック
・非推奨の構文
・型の不適切な変換
etc
静的解析ツール/ Hack(HHVM)
※設定ファイルの hhvm.hack.lang.auto_typecheckで 自動実行の有無を設定可能。
52
ポイント⑥PHP7の機能を段階的に使える
53
PHP5/7への両対応
・ HHVM3.11から PHP7の機能に対応。
・ PHP5と PHP7の両方をサポートしていく方針。
・設定ファイル「 hhvm.php7.all = 1」で、後方互換のない PHP7の設定を有効にできる。
・ PHP7の機能を個別に適用可能。
https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings
54
ポイント⑦豊富な採用実績
55
豊富な採用実績
大規模Webサービスを中心に、多くの採用実績があります。
Wikipediaや Baidoは多くのソースコードを Hack/HHVMに
コミットしています。
https://github.com/facebook/hhvm/wiki/Users
56
素敵な Hack/HHVMですが、
不安な点もたくさんあります
57
リリースサイクル
Hack(HHVM)
・ 8週ごとにリリース。
・ 3バージョン毎の LTSを 1年間のサポート。
PHP
・リリースサイクル 1年
・ライフサイクル 3年 (バグ 2年 /セキュリティ 1年 )
LTSを約 1年間サポート。
サポートについて/ Hack
59
・ hhvm →が落ちる 監視して自動で再起動
・ pecl →が利用できない golangで記述 (HNI挑戦
中 )
・突然の CentOS6 →サポート停止 CentOS7へ移
行
・ほとんどの IDEが対応していない
運用で直面した問題点
60
ググラビリティが非常に低い。
問題点
61
HHVMの PHP7対応状況
62
HHVMは PHP7に対応していく方針
http://hhvm.com/blog/10859/php-7-support
63
ざっくりポイント
・ PHP7リリースは HHVMにとっても本当にめでたい。
・ HHVM3.11から PHP7の機能に対応していく。
・ PHP5と PHP7の両方をサポートしていく方針。
・設定ファイル「 hhvm.php7.all = 1」で、後方互換のない PHP7の設定を有効にできる。
https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings
64
PHP7に関する issueを Githubで確認可能
https://github.com/facebook/hhvm/labels/php7%20incompatibility
65
まとめ
・ PHP7と Hackは似たようで異なる機能がある。
・ Hackには「大規模開発」によりフォーカス。
・ Hackは PHPと分裂せず、同期して進化する。
66
コミュニティの投票によって機能実装が決まる PHP
と
Facebookによって開発される Hack言語。
PHPは「緩い PHPらしさ」を大切にしており、 Hack
言語は「実用性としての正しさ」を大切にしているよ
うに感じています。
個人的な印象
67
PHPという優れた言語の未来に
選択肢があることは素晴らしい!
68
PHP7が出ましたが、まだまだ
Hack/HHVMを選ぶ価値はあります!
69
ご静聴ありがとうございました。
70
この資料は、正確な記述を心がけて作成していますが、
内容の正確性や有用性を作者は保証しません。また、
本資料は作者個人が作成したものであり、所属する組
織・団体の見解等を表すものではありません。
免責事項