PHPカンファレンス2014でHHVM/Hackの話を聞いて感動した

使える言語の幅を広げたいと思ってPHP カンファレンス 2014に参加してきました。徳丸さんの「安全な PHP アプリケーションの作り方 2014」は改めて自分のセキュリティの知識を確かめるのに大変有意義だったのですが、何より感動したのが Facebook の Paul Tarjan による「HHVM + Hack == PHP++」のセッションでした。

すごく簡単に僕が理解した限りで HHVM/Hack を紹介すると、HHVM とは PHP の処理系の一つの実装です。その特徴は JIT コンパイルにより超高速になっていることに加え、圧倒的な魅力は PHP の Extension(C 拡張ライブラリ)の多くが実装されていて PHP のメジャーなフレームワークが問題なく動作するということです。つまりもう実践で戦えるということ。そして、Hack というのは HHVM が処理できるもう一つの言語で、PHP を拡張した文法によって型を明示することで静的解析が強力に行えるモダンな言語です。非同期処理も書きやすい模様(Hack には C#の開発者が join してるとか言ってました)。なお Facebook ではすでに 98%の実装が Hack になっているそうです。

熱のあるセッション

まず通訳をされてた方が素晴らしかった。同時通訳ではないのですが、Paul ととても息のあった通訳のテンポで、しかも JIT の話や Generics の話を日本語にするという超絶難しいことをされているのに特に大きな違和感を感じなかったのはすごかったです。おかげで、英語の分からない人でもどっぷりと HHVM/Hack の魅力を感じ取ることができていたと思います。Q&A が特に素晴らしく、双方向の通訳をこなされていて感動的でした。

そして何よりセッションとして感動したのは、HHVM/Hack というプロダクトに対する彼の熱い思いが伝わってきたからでしょう。「Done is better than perfect(完璧よりも完成の方が良い)」を掲げる Facebook がやりきった HHVM/Hack 化の話は、運用をやってた身としては震える程に感動しました。スライドの PDF の p37 にあるグラフが象徴的ですが、2013 年 2 月には Facebook のコードの 10%弱しか Hack で書かれていなかったものが、Hackificatorという変換ツールのお陰で徐々に Hack 化されていき、2013 年 10 月には 98%が Hack になったということでした。PHP のコードに型をアノテーションしていくことで、推論によって他の部分も自動で型が付与されていくそうです。やばい。しかも静的解析周りは OCaml で書かれてるそうです。。。

1 時間のセッションでしかも日本語通訳が入って半分以下のスピードだったにもかかわらず、1 時間とは思えないぐらい濃密なセッションでした。英語のみだったらいったいどれだけの情報量だったのだろう。。。

まさに PHP++だった

さて、そのプロダクトの話ですが、冒頭にちょっと説明したように HHVM は PHP も Hack も解釈できるので、まるで C++の中に C が書ける様に、Hack と PHP を混ぜて書くことができます。これのお陰で先ほどのグラフの様に既存のコードを徐々に Hack に移行していくことができます。別の見方をすれば、Java と Scala を混ぜて書ける、みたいな感じですね。

PHP 自体もともと型はある程度静的とはいえ、返り値の型も指定できたり Generics とかまである Hack とはやっぱり全然違う言語なわけですが、同じ VM 上で動作するということがこのハイブリッドな状態を可能にしています。デザインとして素晴らしすぎる。ちなみに、先ほども書いたように静的解析は OCaml で書かれているそうで、javascript にも変換が簡単とか言ってて、Hack のサイトの静的解析のデモやチュートリアルはそうやったやつで走っているそうです。

HHVM の美しさ

HHVM 自体もすごいです。APC のように、PHP のスクリプトから VM が実行できるバイトコードに変換してキャッシュしておいた上で、何度も実行される部分に関しては JIT で Native コード(つまり HHVM のバイトコードではなく実際の CPU の処理できるバイトコード)に自動で変換してくれるので、超高速になると。僕は JIT コンパイルとか全然詳しくないわけですが、JIT コンパイルの処理の実装のおかげで、より型の明示的な Hack も走るぞ!というアイデアが出てきたのかな − とか思いながら聴いてました。

ついでに、キャッシュという発想も見方を変えれば事前に変換できるよね、ということであり、かつ本番環境ではランタイムにソースコードを変更することはないわけで、そのままバイトコードのキャッシュをデプロイすればいいよね、ってのもその通りやな~と思いました。JIT な Native コードもデプロイできるとかできないとか(同じアーキテクチャならできそう?)。

さっとドキュメントのさわりとか読んでみましたが、もともと HipHop for PHP とか呼ばれてたやつは、C++への翻訳機だったわけですが、開発中と本番環境で異なる実装になっていたらしく、それをダブルメンテナンスするのが辛かったそうです。また C++への変換では JIT が効きづらかったと。そこで、C++へ直接変換するのではなく、新たな中間表現に変換しそれを実行できる VM を実装したのが HHVM だそうです。(理解間違ってたらすみません)

実に熱い。Facebook という超大規模開発環境で実際に使われながら洗練されてきたからこその、理論と実践が美しく統合されたデザインと実装に僕は感動しました。

PHP とは何なのか

すでに存在する言語処理系とは別の処理系を作るということは、すなわちその言語自体の仕様を浮き彫りにするということでもあります。HHVM を作ったお陰で「What is PHP?(PHP とは何なのか)」が分かったと Paul は言っていました。その成果は 300 ページにも及ぶ PHP の言語仕様書としてコミュニティに還元されています。

実際、Perl は処理系が 1 つしかなく言語仕様とはその実装そのものですし、Ruby も MRI という実装が仕様になっています。まともに互換性のある処理系が複数存在するというのはすごいなと感じました。

PHP と HHVM/Hack のこれから

PHP 自身は次のメジャーリリースは PHP7 となるそうです(Perl 同様バージョン 6 はここでも呪われていました)。Paul は PHP の進歩にキャッチアップしていくと言っていたので、HHVM はこれからも互換性のある処理系として存在し続けそうな印象でした。

もしかしたら HHVM が PHP コアになってしまったりするのかな?とかもちょっと思いました。ただ、多分そのためには、現状 HHVM のビルドが依存関係が多く大変という問題がありそうです。C++11 で書かれていて boost も必要だったりしてるし、JIT を効かせるためには多分アーキテクチャ毎の実装も必要だったりするのかな?とか考えると、実際は Yet Another PHP として歩んでいくのかなーとか素人目に考えてました。

僕は PHP は実は 1 行も書いたことないんですが、今回のこのセッションを聴いて非常に未来ある言語だなと感じました。徳丸さんもセキュリティの観点から「例えば PHP を避ける」は時代遅れという話もありましたし、実際 PHP はサーバサイドでは最も使われている言語であるという話。HHVM を使っていれば、強い型が欲しいと思えば Hack を部分的に使うこともできたりするわけで、非常に実践的に思えました。(こんな妄想してる間に手を動かしてコード書けよハゲって話なんですけどね、ホントは。。。)

というわけで、PHP および HHVM/Hack はウォッチしていこうと思いました。

最後に、こんな素晴らしいセッションのあるカンファレンスを参加費無料で開催して頂いた運営の方々にも大感謝。もっともっと新規の人も参加していくといいと思いました!