54
PHP7 ががががががががががががが Hack ががががががががががががががががががが がが がが 1 2016/01/19

PHP7がリリースされたいま、 改めてHackについて考える。

Embed Size (px)

Citation preview

Page 1: PHP7がリリースされたいま、 改めてHackについて考える。

PHP7がリリースされたいま、

改めて Hackについて考える。

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

1

2016/01/19

Page 2: PHP7がリリースされたいま、 改めてHackについて考える。

2

・山口県下関出身の 35 歳・企画からアプリ、インフラまで幅広くやっています。・車とプログラミングを愛しています。

・土日は育児しながら勉強しています。

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

自己紹介

Page 3: PHP7がリリースされたいま、 改めてHackについて考える。

3

5年 7年1年

→ →

メイン開発言語の経歴

Page 4: PHP7がリリースされたいま、 改めてHackについて考える。

4

インテリジェンスでは

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

Hack/HHVMを導入しています。

Page 5: PHP7がリリースされたいま、 改めてHackについて考える。

5

PHPカンファレンス 2015では

Hack言語をテーマに登壇しました。

Page 6: PHP7がリリースされたいま、 改めてHackについて考える。

6

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

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

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

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

Hackとは?

Page 7: PHP7がリリースされたいま、 改めてHackについて考える。

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

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

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

Hackの目指すところ

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

Page 8: PHP7がリリースされたいま、 改めてHackについて考える。

8

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

Page 9: PHP7がリリースされたいま、 改めてHackについて考える。

9

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

Page 10: PHP7がリリースされたいま、 改めてHackについて考える。

10

大幅な高速化を実現!!

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

Page 11: PHP7がリリースされたいま、 改めてHackについて考える。

11

・ Null合体演算子 (??)

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

・無名クラスの導入。

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

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

新しい言語仕様

Page 12: PHP7がリリースされたいま、 改めてHackについて考える。

12

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

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

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

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

データ構造の変更

Page 13: PHP7がリリースされたいま、 改めてHackについて考える。

13

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

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

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

・高速な動作。

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

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

Page 14: PHP7がリリースされたいま、 改めてHackについて考える。

14

Hack/HHVMと PHP7は

何を基準に選ぶべきなの

か???

Page 15: PHP7がリリースされたいま、 改めてHackについて考える。

15

Hack/ PHP7機能の比較

Page 16: PHP7がリリースされたいま、 改めてHackについて考える。

16

タイプヒンティング

Page 17: PHP7がリリースされたいま、 改めてHackについて考える。

17

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

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

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

string{return "OK";

}}

//OKSample::sampleFunc (1);

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

Page 18: PHP7がリリースされたいま、 改めてHackについて考える。

18

PHPのタイプヒンティング

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

PHP5.0:クラス

PHP5.1:配列

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

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

Page 19: PHP7がリリースされたいま、 改めてHackについて考える。

19

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

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

Page 20: PHP7がリリースされたいま、 改めてHackについて考える。

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について考える。

21

タイプヒンティング/ PHP7

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

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

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

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

Page 22: PHP7がリリースされたいま、 改めてHackについて考える。

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について考える。

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について考える。

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について考える。

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について考える。

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について考える。

27

タイプヒンティング

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

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

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

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

・型の設定のみ可能。

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

Page 28: PHP7がリリースされたいま、 改めてHackについて考える。

28

コレクション

Page 29: PHP7がリリースされたいま、 改めてHackについて考える。

29

PHP5系の配列とは

・内部的には、順番つけされたマップ

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

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

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

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

Page 30: PHP7がリリースされたいま、 改めてHackについて考える。

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について考える。

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について考える。

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について考える。

33

Map

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

B

A

D

EC

Page 34: PHP7がリリースされたいま、 改めてHackについて考える。

34

Vector

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

21 4 53

Page 35: PHP7がリリースされたいま、 改めてHackについて考える。

35

Set

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

BA D EC

Page 36: PHP7がリリースされたいま、 改めてHackについて考える。

36

Pair

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

Page 37: PHP7がリリースされたいま、 改めてHackについて考える。

37

配列/コレクション

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

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

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

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

・ Null合体演算子 (??)が利用可能。

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

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

Page 38: PHP7がリリースされたいま、 改めてHackについて考える。

38

その他の言語仕様

Hackのみ存在

・ラムダ式、 Generics、 Enum、並列実行 (async, await)

PHP7のみ存在

・致命的エラーのハンドリング。

・ defineで配列が利用可能。

<?phpdefine("SAMPLE", array("a"=>1,2,3));

Page 39: PHP7がリリースされたいま、 改めてHackについて考える。

39

静的解析ツール

HHVM

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

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

PHP7

→同等の機能なし。

Page 40: PHP7がリリースされたいま、 改めてHackについて考える。

40

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

・コンパイルエラー

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

・非推奨の構文

・型の不適切な変換

  etc

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

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

Page 41: PHP7がリリースされたいま、 改めてHackについて考える。

41

品質重視で開発するなら Hack、

スピード重視なら PHP。

それぞれに特徴を持っています!

わかったこと

Page 42: PHP7がリリースされたいま、 改めてHackについて考える。

42

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

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

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

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

うに感じています。

個人的な印象

Page 43: PHP7がリリースされたいま、 改めてHackについて考える。

43

リリースサイクル

Hack(HHVM)

・ 8週ごとにリリース。

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

PHP

・リリースサイクル 1年

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

Page 44: PHP7がリリースされたいま、 改めてHackについて考える。

→LTSを約 1年間サポート。

サポートについて/ Hack

Page 45: PHP7がリリースされたいま、 改めてHackについて考える。

45

HHVMの PHP7対応状況

Page 46: PHP7がリリースされたいま、 改めてHackについて考える。

46

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

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

Page 47: PHP7がリリースされたいま、 改めてHackについて考える。

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について考える。

48

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

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

Page 49: PHP7がリリースされたいま、 改めてHackについて考える。

49

まとめ

・ PHP7と Hackには、似たようで異なる特徴が存在する。

・ Hackには「大規模開発」に適した独自機能が存在する。

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

Page 50: PHP7がリリースされたいま、 改めてHackについて考える。

50

まとめ

・ HHVM3.11で PHP7の機能を実装。 1月 29日リリースの

3.12が

  PHP7の機能をサポートする初めての LTSになる。

・ PHP7の機能については、段階的に Hackに実装予定。

Page 51: PHP7がリリースされたいま、 改めてHackについて考える。

51

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

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

Page 52: PHP7がリリースされたいま、 改めてHackについて考える。

52

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

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

Page 53: PHP7がリリースされたいま、 改めてHackについて考える。

53

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

Page 54: PHP7がリリースされたいま、 改めてHackについて考える。

54

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

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

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

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

免責事項