php7ではなくhack/hhvmを選ぶ理由

70
PHP7 でででで Hack/HHVM ででででで でででででででででででで でで でで 1 2016/02/24

Upload: yuji-otani

Post on 15-Apr-2017

6.932 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: PHP7ではなくHack/HHVMを選ぶ理由

PHP7ではなく

Hack/HHVMを選ぶ理由

株式会社インテリジェンス大谷 祐司

1

2016/02/24

Page 2: PHP7ではなくHack/HHVMを選ぶ理由

2

・山口県下関出身の 35 歳・インテリジェンスの新規事業で技術責任者。

・車とプログラミングを愛しています。

・ Facebookの友達申請は気軽にぜひ!  https://www.facebook.com/yuji.otani.16

自己紹介

Page 3: PHP7ではなくHack/HHVMを選ぶ理由

3

5年 7年1年

→ →

メイン開発言語の経歴

Page 4: PHP7ではなくHack/HHVMを選ぶ理由

4

質問①

Hack/HHVMを使ったことがあるかた

Page 5: PHP7ではなくHack/HHVMを選ぶ理由

5

質問②

PHP7が出たけど、これから

何を使おうか迷っているかた

Page 6: PHP7ではなくHack/HHVMを選ぶ理由

6

本日の目的

Hack/HHVMの素晴らしさを伝えて

今後の選択肢にしてもらいたい。

Page 7: PHP7ではなくHack/HHVMを選ぶ理由

7

インテリジェンスでは

2015年から複数のプロジェクト

Hack/HHVMを導入しています。(フレームワークは FuelPHP)

Page 8: PHP7ではなくHack/HHVMを選ぶ理由

8

 転職サイト MIIDAS

Page 9: PHP7ではなくHack/HHVMを選ぶ理由

9

社員紹介サービス  MyRefer

Page 10: PHP7ではなくHack/HHVMを選ぶ理由

10

・ Facebookによって開発された言語

・ PHPと互換性を持っている

・ HHVMという仮想マシン上で動作する

・言語仕様は PHP5.6がベース

Hackとは?

Page 11: PHP7ではなくHack/HHVMを選ぶ理由

・バグのないコードを迅速に書けるようになる

・エンジニアがコーディング体験を楽しめる

・「高速な動作」「大規模開発向きの仕様」

Hackの目指すところ

http://growthhackjapan.com/2014-03-23-facebook-hack-released-to-the-public/

Page 12: PHP7ではなくHack/HHVMを選ぶ理由

12

・ PHPのノウハウを生かしながら、新しいこ

と  にチャレンジしたい。

・パフォーマンスが良いサービスにしたい。

・将来的に大規模になった時にも可読性がよ

く、  スピーディーな改修ができるようにしたい。

・ PHP7がまだリリースされないので。

Hackの採用理由

Page 13: PHP7ではなくHack/HHVMを選ぶ理由

13

昨年末、大きな事件が起きました

Page 14: PHP7ではなくHack/HHVMを選ぶ理由

14

2015/12/03PHP7リリース !!

Page 15: PHP7ではなくHack/HHVMを選ぶ理由

15

大幅な高速化を実現!!

http://talks.php.net/fluent15#/wpbench

Page 16: PHP7ではなくHack/HHVMを選ぶ理由

16

・ Null合体演算子 (??)

・致命的エラーを補足可能 (EngineException)

・無名クラスの導入。

・スカラ型のタイプヒンティング。

・返り値のタイプヒンティング。

新しい言語仕様

Page 17: PHP7ではなくHack/HHVMを選ぶ理由

17

・ 64bitCPUに最適化されたデータ構造。

・ CPUキャッシュを有効活用する改善。

・配列はメモリ上でも配列になった。  (PHP5は全て連想配列 )

・配列のメモリ使用量が劇的に下がった。  ※ PHP5( 72bytes →) PHP7( 32bytes)

データ構造の変更

Page 18: PHP7ではなくHack/HHVMを選ぶ理由

18

Hack/HHVMの特徴がいくつも、PHP7に搭載されました。

・スカラ型のタイプヒンティング

・返り値のタイプヒンティング

・高速な動作

・配列で使うメモリが少ない

・ AST(抽象構文木 )を使ったコンパイル

Page 19: PHP7ではなくHack/HHVMを選ぶ理由

19

PHPは今、大きな転換期。

だからこそ、 Hack/HHVMの良さを

ぜひ知ってもらいたいと思います。

Page 20: PHP7ではなくHack/HHVMを選ぶ理由

20

ポイント①強力なタイプヒンティング

Page 21: PHP7ではなくHack/HHVMを選ぶ理由

21

タイプヒンティングとは?

functionの引数/戻り値がどの種別かを指定できます。

Class Sample {public static function sampleFunc(int $a):

string{return "OK";

}}

//OKSample::sampleFunc (1);

//Fatal ErrorSample::sampleFunc ("a");

Page 22: PHP7ではなくHack/HHVMを選ぶ理由

22

PHPのタイプヒンティング

指定できる種別は、バージョンアップ毎に追加されました。

PHP5.0:クラス

PHP5.1:配列

PHP5.4:クロージャや関数名

PHP7 :スカラー型 (int, float, string, bool)

Page 23: PHP7ではなくHack/HHVMを選ぶ理由

23

タイプヒンティングの仕様は、

Hackと PHP7で大きく異なります。

Page 24: PHP7ではなくHack/HHVMを選ぶ理由

24

タイプヒンティング/ PHP7

2つのタイプが存在。

・弱い型指定→自動的な型キャスト。→・強い型指定 型まで厳密に判別。

  <?php

Class Sample {public static function sampleFunc(int $a): string{

return "OK";}

}

//どちらのタイプでも OKSample::sampleFunc(1);

//「弱い型指定」のみ OKSample::sampleFunc("1");

Page 25: PHP7ではなくHack/HHVMを選ぶ理由

25

タイプヒンティング/ PHP7

・デフォルトは「弱い型指定」

・「強い型指定」には、ファイルの最初で宣言が必要。

・ファイル単位でのみ「強い型指定」が設定可能。  → iniファイル等での指定は不可能。

<?php//ファイルに「強い型指定」が有効になる。declare(strict_types=1);

Page 26: PHP7ではなくHack/HHVMを選ぶ理由

26

タイプヒンティング/ PHP7

・ Nullや複数型の許可を明示することができない。

・タイプヒンティングのある functionに Nullを渡すとエラー

<?php

Class Sample {public static function sampleFunc(int $a):

string{return "OK";

}}

//Fatal ErrorSample::sampleFunc(null);

Page 27: PHP7ではなくHack/HHVMを選ぶ理由

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");

Page 28: PHP7ではなくHack/HHVMを選ぶ理由

28

タイプヒンティング/ Hack

・ Nullを許容する場合には、型の初めに ?を付ける。

<?hh

Class Sample {public static function sampleFunc(?int $a): string{

return "OK";}

}

//OKSample::sampleFunc(null);Sample::sampleFunc(1);

Page 29: PHP7ではなくHack/HHVMを選ぶ理由

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));

Page 30: PHP7ではなくHack/HHVMを選ぶ理由

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");

Page 31: PHP7ではなくHack/HHVMを選ぶ理由

31

タイプヒンティング

・「強い型指定」が基本。

・ Nullの許容やmixedが設定可能。

  型をきちんと意識した、  大規模サービス向けの仕様。

・「弱い型指定」が基本。

・型の設定のみ可能。

  型を意識せず実装できる、  開発速度を重視の仕様。

Page 32: PHP7ではなくHack/HHVMを選ぶ理由

32

ポイント②専用のコレクション

Page 33: PHP7ではなくHack/HHVMを選ぶ理由

33

PHP5系の配列とは

・配列と連想配列を同じものとして扱える。

・配列に入れる型は何でも OK。

・キーは整数または文字列。

・何をキーにしても、値は入れた順番に取り出される。

<?php//実行すると abと表示される。$arr = array(1 => ”a", 0 => ”b");foreach($arr as $value ) { print($value);}

Page 34: PHP7ではなくHack/HHVMを選ぶ理由

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());

Page 35: PHP7ではなくHack/HHVMを選ぶ理由

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");

Page 36: PHP7ではなくHack/HHVMを選ぶ理由

36

Map

キーと値をセットで格納。

B

A

D

EC

Page 37: PHP7ではなくHack/HHVMを選ぶ理由

37

Vector

順番に値を保持する純粋な配列。

21 4 53

Page 38: PHP7ではなくHack/HHVMを選ぶ理由

38

Set

値の集合で、中身の重複が認められない。

BA D EC

Page 39: PHP7ではなくHack/HHVMを選ぶ理由

39

Pair

2つの値をセットにして保持。

Page 40: PHP7ではなくHack/HHVMを選ぶ理由

40

配列/コレクション

・ 4つの独自コレクション。

・コレクションに型を指定可能。

  型をきちんと意識した、  大規模サービス向けの仕様。

・” ”何でも入る 配列のみ利用可能。

・配列の種類、型は意識しない。

  連想配列に何でも突っ込める、  開発速度を重視の仕様。

※Null合体演算子は HHVM3.11から Hackで利用可能

Page 41: PHP7ではなくHack/HHVMを選ぶ理由

41

ポイント③独自の言語仕様

Page 42: PHP7ではなくHack/HHVMを選ぶ理由

42

独自の言語仕様

・ Lambdas (ラムダ式)

・ Generics (ジェネリクス)

・ Enum (列挙型)

・ Tuples (複数の要素を持つ配

列)

・ Shapes (複数の要素を持つマッ

プ)

Page 43: PHP7ではなくHack/HHVMを選ぶ理由

43

Enum(値の列挙 )

<?hh

enum Size: int {SMALL = 0;MEDIUM = 1;LARGE = 2;X_LARGE = 3;

}

型を指定した値を宣言できる

Page 44: PHP7ではなくHack/HHVMを選ぶ理由

44

Tuples(複数型の配列 )

<?hh

list($a, $b) = testFunc();

public function testFunc() : (string, int) {

return tuple(“OK”, 1);}

functionから複数の値を戻せる

Page 45: PHP7ではなくHack/HHVMを選ぶ理由

45

独自の言語仕様

Hack/HHVMには多くの言語仕様が追加されています。

サービスの導入において、

・バグのないコードを迅速に書けるようになる

・エンジニアがコーディング体験を楽しめる

これらを実現することができています。

Page 46: PHP7ではなくHack/HHVMを選ぶ理由

46

ポイント④並列実行のサポート

Page 47: PHP7ではなくHack/HHVMを選ぶ理由

47

並列実行

Async/Awaitという独自の関数を利用して、

並列処理を実行することができます。

並列実行できる処理はあらかじめ準備されており、

それらを利用することで高速な処理が行えます。

Page 48: PHP7ではなくHack/HHVMを選ぶ理由

48

並列実行

Page 49: PHP7ではなくHack/HHVMを選ぶ理由

49

ポイント⑤静的解析ツール

Page 50: PHP7ではなくHack/HHVMを選ぶ理由

50

静的解析ツール

hh_clientにより、コードの静的解析が可能。

構文エラーや型の不整合など実行前に潰すことができる。

厳密な型制約を持つ Hackで利用することで、

バグの少ないコードを実現することができます。

Page 51: PHP7ではなくHack/HHVMを選ぶ理由

51

実行前に構文チェックを行えます。

・コンパイルエラー

・引数 /戻り値の型チェック

・非推奨の構文

・型の不適切な変換

  etc

静的解析ツール/ Hack(HHVM)

※設定ファイルの hhvm.hack.lang.auto_typecheckで  自動実行の有無を設定可能。

Page 52: PHP7ではなくHack/HHVMを選ぶ理由

52

ポイント⑥PHP7の機能を段階的に使える

Page 53: PHP7ではなくHack/HHVMを選ぶ理由

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

Page 54: PHP7ではなくHack/HHVMを選ぶ理由

54

ポイント⑦豊富な採用実績

Page 55: PHP7ではなくHack/HHVMを選ぶ理由

55

豊富な採用実績

大規模Webサービスを中心に、多くの採用実績があります。

Wikipediaや Baidoは多くのソースコードを Hack/HHVMに

コミットしています。

https://github.com/facebook/hhvm/wiki/Users

Page 56: PHP7ではなくHack/HHVMを選ぶ理由

56

素敵な Hack/HHVMですが、

不安な点もたくさんあります

Page 57: PHP7ではなくHack/HHVMを選ぶ理由

57

リリースサイクル

Hack(HHVM)

・ 8週ごとにリリース。

・ 3バージョン毎の LTSを 1年間のサポート。

PHP

・リリースサイクル 1年

・ライフサイクル 3年 (バグ 2年 /セキュリティ 1年 )

Page 58: PHP7ではなくHack/HHVMを選ぶ理由

LTSを約 1年間サポート。

サポートについて/ Hack

Page 59: PHP7ではなくHack/HHVMを選ぶ理由

59

・ hhvm →が落ちる 監視して自動で再起動

・ pecl →が利用できない golangで記述 (HNI挑戦

中 )

・突然の CentOS6 →サポート停止 CentOS7へ移

・ほとんどの IDEが対応していない

運用で直面した問題点

Page 60: PHP7ではなくHack/HHVMを選ぶ理由

60

ググラビリティが非常に低い。

問題点

Page 61: PHP7ではなくHack/HHVMを選ぶ理由

61

HHVMの PHP7対応状況

Page 62: PHP7ではなくHack/HHVMを選ぶ理由

62

HHVMは PHP7に対応していく方針

http://hhvm.com/blog/10859/php-7-support

Page 63: PHP7ではなくHack/HHVMを選ぶ理由

63

ざっくりポイント

・ PHP7リリースは HHVMにとっても本当にめでたい。

・ HHVM3.11から PHP7の機能に対応していく。

・ PHP5と PHP7の両方をサポートしていく方針。

・設定ファイル「 hhvm.php7.all = 1」で、後方互換のない  PHP7の設定を有効にできる。

https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings

Page 64: PHP7ではなくHack/HHVMを選ぶ理由

64

PHP7に関する issueを Githubで確認可能

https://github.com/facebook/hhvm/labels/php7%20incompatibility

Page 65: PHP7ではなくHack/HHVMを選ぶ理由

65

まとめ

・ PHP7と Hackは似たようで異なる機能がある。

・ Hackには「大規模開発」によりフォーカス。

・ Hackは PHPと分裂せず、同期して進化する。

Page 66: PHP7ではなくHack/HHVMを選ぶ理由

66

コミュニティの投票によって機能実装が決まる PHP

Facebookによって開発される Hack言語。

PHPは「緩い PHPらしさ」を大切にしており、 Hack

言語は「実用性としての正しさ」を大切にしているよ

うに感じています。

個人的な印象

Page 67: PHP7ではなくHack/HHVMを選ぶ理由

67

PHPという優れた言語の未来に

選択肢があることは素晴らしい!

Page 68: PHP7ではなくHack/HHVMを選ぶ理由

68

PHP7が出ましたが、まだまだ

Hack/HHVMを選ぶ価値はあります!

Page 69: PHP7ではなくHack/HHVMを選ぶ理由

69

ご静聴ありがとうございました。

Page 70: PHP7ではなくHack/HHVMを選ぶ理由

70

この資料は、正確な記述を心がけて作成していますが、

内容の正確性や有用性を作者は保証しません。また、

本資料は作者個人が作成したものであり、所属する組

織・団体の見解等を表すものではありません。

免責事項