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はウォッチしていこうと思いました。

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