PHPの「闇」からHackの「光」へ:`vec`, `dict`, `keyset` がもたらす型安全の真実
こんにちは。Hackの深淵を覗き込み、HHVMの心臓部を日々チューニングしているアーキテクトです。
PHPの歴史において、`array`は最強にして最凶のデータ構造でした。リストなのか、連想配列なのか、あるいはその混合物なのか――実行時にしか分からないその「曖昧さ」が、どれほどのバグを生み、どれほどのエンジニアを絶望させてきたか。
しかし、Hackの`strict`モードにおいて、私たちはその混沌に終止符を打ちました。それが今回解説する「Hackコレクション型(`vec`, `dict`, `keyset`)」です。
—
1. なぜ「ただの配列」ではダメなのか?
PHPの`array`は、実は「順序付きマップ」という一つの実装にすべてを詰め込んでいます。メモリ効率は悪く、型チェッカーも「中身が何であるか」を厳密に追跡できません。
対してHackのコレクションは、用途ごとにメモリレイアウトが最適化されています。
- `vec
` : インデックスが0から始まる連続したリスト。最適化されたメモリ上に配置され、アクセスは極めて高速です。 - `dict
` : キーと値のペア。ハッシュマップとして最適化されており、検索効率が一定です。 - `keyset
` : 値の集合(Set)。重複を許さず、値の存在確認が爆速で行えます。
これらを使うことは、単に「型を揃える」ことではありません。HHVMが生成するJITコンパイルコードの質を劇的に向上させることと同義なのです。
—
2. 実践:Hackコレクションの書き方
まずは、これら3つの基本を見ていきましょう。
<<__EntryPoint>>
function main(): void {
// vec: リスト構造。型推論が優秀なので、
vec
// dict: キーと値の構造。型を明示すると、後のコードが劇的に安全になります
dict
‘alice’ => 90,
‘bob’ => 85,
];
// keyset: 集合。値がユニークであることを保証したい時に使います
keyset
// ここで $numbers[] = ‘string’; を書くと、型チェッカーが即座にエラーを吐きます
// これが「実行前の安心感」です。
}
よくある間違いと解決策
初心者の方がよくやるのが、`vec`の中に異なる型を混ぜようとすることです。
// ❌ 間違い:型の一貫性がない
$bad_vec = vec[1, “hello”];
// 型チェッカー: “vec
解決策: もしどうしても異なる型が必要なら、`shape`や`tuple`、あるいはインターフェースを活用しましょう。Hackは「なんでも入る箱」を許さないことで、あなたのコードを堅牢に保つのです。
—
3. HHVMアーキテクチャから見た「なぜ速いのか」
HHVMの内部では、`vec`や`dict`は「Type Specialized(型特化)」されたデータ構造として扱われます。
普通のPHP配列だと、HHVMは「この配列の中身は整数か? それとも文字列か? 途中で変わるかも?」と常に監視(プロファイリング)し続けなければなりません。しかし、`vec
型を明示することは、HHVMに対する「最適化のヒント」を与えているのです。 これにより、実行時のオーバーヘッドが削ぎ落とされ、CPUのキャッシュ効率も向上します。
—
4. 現場で使えるTips:コレクション操作の極意
コレクション操作には、`vec`, `dict`, `keyset`それぞれに専用の関数群が用意されています。
// 例:vecのフィルタリングと変換
$numbers = vec[1, 2, 3, 4];
$doubled = Vec\map($numbers, $x ==> $x 2);
// 結果: vec[2, 4, 6, 8]
$evens = Vec\filter($numbers, $x ==> $x % 2 === 0);
// 結果: vec[2, 4]
`Vec`や`Dict`といった名前空間にある関数(`HH\Lib`)を使いましょう。これらは、元々の配列を壊さず(イミュータブル)、安全に新しいコレクションを生成するように設計されています。
—
最後に:型安全という「地図」を手に入れよう
Hackの`strict`モードで開発するということは、コンパイラとペアプログラミングをしているようなものです。「ここ、`null`が入るかもしれないけど大丈夫?」「このキーは本当に存在するの?」と、コンパイラが常にあなたの背中を守ってくれます。
最初は厳しく感じるかもしれません。しかし、一度`vec`, `dict`, `keyset`の快適さを知れば、もう二度とPHPのレガシーな`array`には戻れないはずです。
ここをクリアすれば、あなたはもうHackの基礎をマスターしたと言っても過言ではありません。次はぜひ、`Shape`や`Enum`の世界へ足を踏み入れてみてください。より深い、Hackの真髄が待っていますよ。
それでは、素晴らしいHackライフを!