【入門編】Hackの`vec`, `dict`, `keyset`:PHP配列からの脱却と型安全なコレクション操作 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

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 $numbers = vec[1, 2, 3];

// dict: キーと値の構造。型を明示すると、後のコードが劇的に安全になります
dict $scores = dict[
‘alice’ => 90,
‘bob’ => 85,
];

// keyset: 集合。値がユニークであることを保証したい時に使います
keyset $tags = keyset[‘hack’, ‘php’, ‘performance’];

// ここで $numbers[] = ‘string’; を書くと、型チェッカーが即座にエラーを吐きます
// これが「実行前の安心感」です。
}

よくある間違いと解決策

初心者の方がよくやるのが、`vec`の中に異なる型を混ぜようとすることです。

// ❌ 間違い:型の一貫性がない
$bad_vec = vec[1, “hello”];
// 型チェッカー: “vec に string は入れられません” と怒られます

解決策: もしどうしても異なる型が必要なら、`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ライフを!

タイトルとURLをコピーしました