【入門編】HackのCapabilitiesとCoeffects(コンテキスト):PHPコードの副作用(I/O・状態変更)を型で制約する – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

副作用を型で支配する:Hackの「Capabilities(能力)」がもたらすコードの静寂

やあ。HHVMの深淵へようこそ。Hackのコア開発に関わっていると、よく「なぜPHPからこれほど厳しい制約を課す言語へと進化したのか?」と聞かれる。答えはシンプルだ。「予測可能性」をコンパイラに証明させるためだ。

PHPで開発していると、「この関数はデータベースを叩くのか? それともただの計算か?」と不安になったことはないかな? 実行してみるまで分からないコードは、バグの温床だ。

Hackが導入した「Capabilities(機能・能力)」と「Coeffects(コンテキスト)」は、その不安を型レベルで消し去るための究極の武器だ。今日は、このHack最強の武器を解説しよう。

—

1. Capabilitiesとは何か?:関数の「所信表明」

Hackにおいて、関数は単に引数と戻り値を持つだけではない。その関数が「何ができるか(何に触れるか)」を型シグネチャに刻み込むことができる。

// 何も副作用を持たない純粋な関数([defaults]なし)
function add(int $a, int $b): int {
return $a + $b;
}

// I/Oや状態変更を伴う関数([defaults]は一般的な副作用を許可する)
function saveToDb(string $data): void [defaults] {
// ここでデータベース接続やファイル書き込みが可能
}

なぜこれが重要なのか?

[defaults]を明記しない関数は、「副作用を一切起こさない」という強力な制約下にある。もし、純粋な関数の中で`echo`したり、グローバル変数に触れようとしたりすれば、HHVMの型チェッカー(`hh_client`)は容赦なくレッドカードを突きつける。

—

2. 副作用を型で分離する:[write_props]と[io]

HackのCoeffectsシステムは、より細かい制御を可能にする。

  • `[pure]`: 完全に純粋(引数以外へのアクセス禁止)。
  • `[write_props]`: オブジェクトのプロパティを変更する許可。
  • `[io]`: ファイルシステムやネットワークに触れる許可。

実践:副作用を「隔離」する設計

class User {
private int $age = 0;

// プロパティを変更する権限を持つ関数
public function setAge(int $age): void [write_props] {
$this->age = $age;
}

// 読み取り専用の計算関数(副作用を持たない)
public function isAdult(): bool {
return $this->age >= 18;
}
}

ここで重要なのは、`isAdult()` には `[write_props]` がついていないことだ。もし誰かがこの関数内でうっかり `$this->age = 0;` と書いたら、コンパイルエラーになる。「読み取り専用だと言っただろ?」とコンパイラが教えてくれるわけだ。

—

3. 初学者が必ずハマる「罠」と解決策

Hackを始めたばかりの人が必ず直面するエラーがある。

エラー例:「副作用があるのに許可がない」

function logger(string $msg): void {
echo $msg; // 警告: [io] が不足している
}

解決策: 「この関数はI/Oを行う」と宣言する。

function logger(string $msg): void [io] {
echo $msg;
}

なぜこうなるのか?

HHVMの型システムは、上位の関数から下位の関数へ「権限の委譲」を確認する。`logger` が `[io]` を必要とするなら、それを呼び出す側の関数もまた `[io]` の権限を持っていなければならない。

イメージ図:

  • `main()` [defaults] -> `process()` [io] -> `logger()` [io]
  • もし `process()` が `[io]` を持っていなければ、`logger()` を呼ぶことはできない。

この「権限の伝播」こそが、アプリケーション全体で副作用を制御するための要だ。

—

4. なぜPHPからHackへ移行するのか?

多くの開発者は、PHPの自由さに疲弊してHackへ来る。PHPでは「どこでグローバル状態が書き換わったのか?」を追うためにデバッガをフル稼働させる必要があるが、Hackではコンパイラがそれを教えてくれる。

Hackの知見:
1. 純粋性を高める: `[pure]` なコードを増やすほど、ユニットテストは不要になる(入力に対する出力が常に一定だからだ)。
2. 制約は自由の始まり: 「何をしてもいい」コードベースはカオスだが、「何ができるか決まっている」コードベースは、大規模開発における唯一の救いだ。

—

さあ、Hackの掌握を始めよう

最初は `[io]` や `[write_props]` の記述が面倒に感じるかもしれない。だが、これは「将来の自分への保険」だ。

Hackの型システムは、君のコードが暴走しないように見張る強力なガーディアンだ。最初は厳格さに戸惑うかもしれないが、一度この「型による秩序」に慣れてしまえば、もうPHPの混沌とした世界には戻れなくなるはずだよ。

何か詰まったら、いつでも型チェッカーの出すエラーメッセージを読み解いてみてほしい。それは君を攻撃しているのではなく、君のコードをより堅牢にするための「設計図の修正案」なのだから。

ここをクリアすれば、君はもうHackのアーキテクチャの入り口に立ったも同然だ。さあ、次はどの機能の深淵を覗いてみたい?

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