やあ。Hack言語の世界へようこそ。
HHVMの深淵を覗き、型安全という武器を手に入れようとする君の姿勢を心から歓迎するよ。
PHPの`array`は、ある意味で「最強の万能ナイフ」だった。しかし、何でも切れるナイフは、往々にして手元を狂わせる。Hackでは、その曖昧さを許さない。なぜなら、曖昧さはランタイムの悪夢(バグ)の温床だからだ。
今日は、PHPの「なんでも屋」である配列を、HSL(Hack Standard Library)の洗練されたデータ構造へと解体し、型安全なアーキテクチャへ昇華させる術を伝授しよう。
—
1. なぜ「PHPのarray」は危険なのか?
PHPの`array`は、内部的に「ハッシュマップ」として実装されている。君が単なるリストとして使っていても、キーを文字列として使っていても、エンジン側は「これはリストか? 連想配列か? それとも集合か?」と推測し続ける。
この「推測のオーバーヘッド」が、メモリ消費を肥大化させ、型チェッカーを盲目にさせるんだ。
Hackでは、これを明確に分離する。
- `vec
` : 順序あるリスト(高効率) - `dict
` : キーと値のマッピング(連想配列) - `keyset
` : 一意な要素の集合(Set)
これらを適切に使い分けることが、HHVMの最適化を最大限に引き出す第一歩だよ。
—
2. DictとKeysetへの分解:責務の切り離し
PHPでよくある「重複を排除するために配列を使う」コードを見てみよう。
// PHPの悪しき習慣
$tags = [‘hack’, ‘php’, ‘hack’, ‘hhvm’];
// これが「リスト」なのか「集合」なのか、型チェッカーは判断できない
これをHackで再設計するなら、こうなる。
A. マッピングには `dict` を使う
キーと値が「1対1」の関係にあるなら、それは `dict` の領分だ。
// dictはキーの型と値の型を厳格に定義できる
$user_map: dict
1 => ‘Alice’,
2 => ‘Bob’,
];
// キーが存在しない場合、HHVMはこれを即座に検知する
// $user_map[3] は型チェックをパスしない(あるいは実行時に安全にハンドリング可能)
B. 重複排除には `keyset` を使う
「同じ値はいらない」というロジックが必要なとき、`array`を使うのは非効率だ。`keyset`は内部的に高度に最適化されたハッシュ構造を持ち、値の一意性を保証する。
// keysetへの変換は非常に直感的だ
$raw_tags = vec[‘hack’, ‘php’, ‘hack’, ‘hhvm’];
$unique_tags = keyset($raw_tags);
// 結果: keyset(‘hack’, ‘php’, ‘hhvm’)
// 探索コスト(O(1))が保証され、メモリ効率も最適化される
—
3. ここをクリアすればOK!よくある失敗
初学者が陥りやすい「型エラー」を先回りして教えるね。
罠1: `dict` のキーに不正な型を使おうとする
`dict`のキーは `int` か `string` でなければならない。オブジェクトをキーにしようとしてエラーになるケースが多いんだ。
- 対策: オブジェクトをキーにしたい場合は `Map` ではなく、オブジェクトのIDをキーにするか、別のデータ構造を検討しよう。
罠2: `keyset` をリストとして扱おうとする
`keyset` は順序を保証しない(あるいは最適化のために順序が入れ替わる)。`$keyset[0]` のようなインデックスアクセスは、意味をなさないことが多い。
- 対策: 順序が重要なときは `vec` を使い、集合としての性質が重要なときは `keyset` を使う。この境界線を意識するだけで、バグは激減する。
—
4. アーキテクトからのアドバイス
PHPからHackへの移行において、最も重要なのは「データ構造を、その用途に合わせて型定義する」という意識改革だ。
- 「リストとして扱うなら `vec` 」
- 「IDで引くなら `dict` 」
- 「重複を許さないなら `keyset` 」
この3つを使い分けるだけで、君の書くコードはHHVMにとって「非常に予測しやすい、高速なコード」へと変貌する。計算量は最適化され、メモリのゴミ(GCの負荷)も減る。
最初は少し面倒に感じるかもしれない。だが、型チェッカーが君のコードの矛盾を指摘してくれるとき、それは「コンパイル前にバグを殺してくれている」ということなんだ。これほど心強いパートナーは他にいないだろう?
さあ、次は君自身のコードで、この「型による断捨離」を試してみてほしい。ここをクリアすれば、君はもうHackの基本をマスターしたと言っても過言ではないよ。
何か詰まったら、いつでも聞いてくれ。アーキテクチャの深淵は、まだ奥が深いからね。