【入門編】【初心者向け】Hackのコレクション型(vec, dict, keyset)入門:PHP配列との違いと型安全なデータ操作 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

こんにちは。HHVMアーキテクチャの深淵を日々覗き込んでいる、Hackのチーフアーキテクトです。

PHPの「なんでも入る配列」に慣れ親しんだ皆さんが、Hackの門を叩くとき、最初にぶつかる壁が「コレクション型」です。しかし、この壁こそが、あなたの書くコードを「動くだけのコード」から「信頼できる強固なシステム」へと進化させる最初のステップになります。

今回は、Hackが誇る3つの最強の武器、`vec`、`dict`、`keyset`について、その本質を紐解いていきましょう。

—

なぜPHPの「配列」ではいけないのか?

PHPの配列は、連想配列であり、リストであり、スタックであり、キューでもあります。自由で魅力的ですが、その代償は「型安全性の喪失」です。

// PHPの悪夢:型が混在し、中身を予測できない
$data = [‘id’ => 1, ‘name’ => ‘Alice’, ‘roles’ => [‘admin’, 123]];

この `$data` を受け取った関数は、常に「キーが存在するか?」「中身は文字列か?数値か?」をチェックし続けなければなりません。これではランタイムエラーが起きるのを待っているようなものです。

Hackのコレクション型は、この「曖昧さ」をコンパイル時に完全に排除します。

—

Hackの3つの武器:vec, dict, keyset

Hackでは、用途に応じてこれらを明確に使い分けます。これらはPHPの配列とは異なり、実行時にメモリレイアウトが最適化されるため、パフォーマンスも非常に高いのが特徴です。

1. vec (可変長リスト)

順序付きのデータの集合です。PHPの「添字配列(0から始まるインデックス)」に近いですが、型が固定されます。

<<__EntryPoint>>
function main(): void {
// vec 型として定義。文字列を混ぜようとすると型チェッカーが怒ります。
vec $numbers = vec[1, 2, 3];

// $numbers[] = ‘a’; // これはコンパイルエラー!

foreach ($numbers as $n) {
echo $n . “\n”;
}
}

2. dict (連想配列)

キーと値のペアです。`vec` と決定的に違うのは、キーが整数または文字列である必要がある点です。

// dict 型
dict $user = dict[
‘name’ => ‘Alice’,
‘email’ => ‘alice@example.com’,
];

3. keyset (値のみの集合)

「重複しない値」の集合です。特定の要素が含まれているかを確認する(`contains`)操作が極めて高速です。

keyset $roles = keyset[‘admin’, ‘editor’];
if ($roles->contains(‘admin’)) {
// 高速な判定
}

—

初心者が陥りやすい「罠」

Hackを始めたばかりの方がよく躓くポイントを、アーキテクトの視点から解説します。

その1:型推論を過信しすぎない

Hackは強力な型推論を持っていますが、関数の引数や戻り値には、必ず明示的に型を書くようにしてください。

// ダメな例:型が曖昧
function process($data) { … }

// 良い例:厳格な型定義
function process(vec $names): void { … }

明示的な型は、他の開発者(そして未来のあなた自身)への最強のドキュメントになります。

その2:不変性(Immutability)を意識する

Hackのコレクションは、デフォルトで非常に扱いやすい性質を持っています。PHPのように「参照渡しで意図せず中身が書き換わる」といったバグが起きにくい設計です。新しい値が必要なときは、元のコレクションを破壊するのではなく、新しいコレクションを生成する意識を持ちましょう。

—

HHVMがこれらを愛する理由

ここからは少しだけアーキテクチャの話をしましょう。

PHPの配列はハッシュテーブルとして実装されており、非常に柔軟ですがメモリ効率はあまり良くありません。一方、Hackの `vec` は、内部的に連続したメモリ領域として確保されることが多いです。

型チェッカーが「これは `vec` だ」と保証してくれることで、HHVMのJITコンパイラは、そのメモリ領域が整数のみで埋まっていることを前提に、究極の最適化(ネイティブな配列アクセスに近い命令への変換)を行うことができます。

つまり、型を厳格に守ることは、あなたのコードを速くすることに直結しているのです。

—

最後に:型安全という「自由」を手に入れよう

「厳格なモード(Strict Mode)は堅苦しい」と感じるかもしれません。しかし、コンパイル時に型チェッカーがエラーを指摘してくれることは、「実行時に発生する未知のバグ」という恐怖から解放されることと同義です。

まずは、既存のPHP配列を `vec` や `dict` に置き換えることから始めてみてください。型チェッカーが警告を出すたびに、「ああ、ここがバグの温床だったのか」と気づけるはずです。

ここをクリアすれば、あなたはもうHackの基礎をマスターしたも同然です。さあ、より安全で、より高速なコードの世界へ飛び込みましょう!

もし分からないことがあれば、いつでもHHVMのドキュメントを開いてください。そこには、世界中のエンジニアが辿り着いた「最適解」が待っていますよ。

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