Facebookの規模ではPHPの限界が厳しく響いた。数千人のエンジニアが1日2回新しいコードを出荷していたが、nullオブジェクトのメソッド呼び出しや複雑なAPIのメソッド名の推測は実行時までエラーにならず、言語はツールに内省のための構造をほとんど与えなかった。動的言語は編集して更新するループを高速に保ったが早期の安全網はなく、従来の静的型付き言語なら反復速度を犠牲にして検査を得たであろうし、書き直しはFacebookのPHPとそのライブラリへの投資を捨てることになっただろう。

2014年3月20日にHHVMランタイムの一部として発表されたHackは、PHPのスーパーセットであり続けることでこの矛盾を解消した。ほとんどのPHPファイルはすでに有効なHackであるため、エンジニアはある関数に型注釈を追加し、次の関数は動的のままにでき、静的型付きコードと動的型付きコードは単一ファイル内でもシームレスに相互運用できた。Hackはジェネリクス、nullable型、型エイリアス、コレクション、ラムダ式を追加し、HHVMは注釈された戻り値と引数の型を実行時に強制し、そのことでJITが最適化のために注釈を安全に信頼できるようにもした。

高速なPHPワークフローを維持するため、チームは型チェッカーをファイルシステムを監視しコードグラフ全体をメモリに保持するローカルサーバーとして設計した。典型的なチェックは200ミリ秒未満で実行され、1秒を超えることはまれだった。変換は粒度が細かく任意参加だったため、エンジニアは自分のコードの大部分を自発的に変換し、自作のコード修正ツールが残りを自動化し、前年の間にFacebookのPHPコードベースのほぼ全体がHackへ移行していた。

同じ発表でHackと変換ツールはHHVMの傘下でオープンソース化され、HHVMはHackの隣で未修正のPHPを動かし続けることになり、翌月にメンロパークのキャンパスで開催されるHack Developer Dayへ開発者を招待した。このリリースは掲載当日にHacker Newsで576ポイントと415コメントを集めた。

PHP自体に段階的な静的型付けをボルト留めし、安全性が一度にすべてではなく関数ごとに広がるようにした

スーパーセットの互換性により書き直しもビッグバン移行も不要だった。既存のPHPファイルは動き続け、HHVMはPHPランタイムのままで、サードパーティのPHPライブラリも全体を通じて利用可能だった。

関数単位の粒度により、注釈のないコードはファイルやモジュール全体の変換を妨げず動的のままだったため、安全性は各チームのペースで広がった。

ファイルシステムを監視するチェッカーサーバーがフィードバックを200ミリ秒未満に保ったため、静的型付けはPHPの反復を速くした編集・更新ループに負担をかけなかった。

エンジニアが自分のコードに注釈を付けることを選び、反復的な残りはcodemodが処理したため、数百万行のコードベースが専任の移行チームを待たずに1年以内に変換された。

安全性を得るために書き直してはならない。言語に古いコードを受け入れさせ、新しい規律を一度に一関数ずつ広げ、チェックをワークフローを決して中断しないほど高速に保つことだ。

Hackとそのコード修正ツールはHHVMの一部としてhacklang.orgでオープンソース化され、FacebookはHHVMがPHP-5との同等性に向けて取り組みつつPHPランタイムであり続け、サードパーティのPHPコードがHackの隣で動き続けると述べた。この発表は2014年3月20日にHacker Newsで576ポイントと415コメントを集め、Facebookは翌月にメンロパークのキャンパスでHack Developer Dayを計画した。Facebook内部では移行はすでに事実上完了しており、約1年の自発的な採用と自動リファクタリングツールの後、PHPコードベースのほぼ全体がHackで動いていた。

出典をたどる

出典

  1. Hack: a new programming language for HHVM Engineering at Meta · engineering.fb.com ·
  2. Hacker News discussion: Hack: a new programming language for HHVM Hacker News · news.ycombinator.com ·