Hack (プログラミング言語)

提供: MonoBook
ナビゲーションに移動 検索に移動

Hack(読み:はっく)とは、PHPから派生したプログラミング言語である。

概要[編集 | ソースを編集]

HackはFacebookが2014年に発表したPHP魔改造したプログラミング言語である[1]。PHP自体を魔改造により独自拡張したものなので長い歳月をかけてアホみたいに増えまくったPHPの関数群もそのまま使える。

HackはJavaVMパクリのようなHHVMヒップホップ仮想マシン)という仮想マシンの上で動作する。ヒップホップ仮想マシン自体は古くから有名であり、もともとはPHP中間コードにして多段階で最適化する手法を実現したかったようだ。ただ、これだけ聞くとPhalanger車輪の再発明のように思えるが真相は不明である。

HHVM実行環境のソースコードPHPライセンスおよびZendライセンスの下で公開されている。 [2]

PHPとの違い[編集 | ソースを編集]

開始タグ[編集 | ソースを編集]

PHPの開始タグといえば「<?php」だが、Hackの開始タグは「<?hh」である。

型アノテーション[編集 | ソースを編集]

Hackを大雑把に言えばPHP静的型付けにしたプログラミング言語である。

たとえば関数宣言する際などには引数戻り値を明示する。 また、型推論も行われるので従来のPHPのような書き方も部分的に許される。

その書式はJavaScriptに型の概念を入れたActionScript3と非常によく似ている。

<?hh
class MyClass 
{
    const int MyConst = 0;

    private string $x = '';

    // 引数$xはint
    // 戻り値もint
    public function increment(int $x): int 
    {
        // $yは型推論
        $y = $x + 1;
        return $y;
    }
}

ジェネリクス[編集 | ソースを編集]

C#のようなジェネリクスが使える。

<?hh
class Box<T> 
{
    protected T $data;

    public function __construct(T $data) 
    {
        $this->data = $data;
    }

    public function getData(): T 
    {
        return $this->data;
    }
}

null許容型[編集 | ソースを編集]

C#のようなnull許容型が使える。 ただし反抗期なのか「?」の位置が異なり、たとえばC#では末尾(int?)なのが、Hackでは先頭(?int)となっている。

<?hh
?int  nullableInt  = null;
?bool nullableBool = null;

コレクション[編集 | ソースを編集]

PHPで扱えるコレクションと言えばArray型で表されるリストのみであったが、Hackでは以下のコレクションが組込型として搭載されている。

  • Vector - 並び順付きのリスト
  • Map - 並び順付きのディクショナリ
  • Set - ユニークなリスト
  • Pair - 2つの関連するオブジェクトを格納する

ラムダ式[編集 | ソースを編集]

C#のようなラムダ式が使える。

function foo(): (function(string): string) 
{
    $x = 'bar';
    return $y ==> $x . $y;
}

function test(): void
{
    $fn = foo();
    // barbazが表示される
    echo $fn('baz'); 
}

newtype[編集 | ソースを編集]

HackにはC++typedefのようなものが搭載されている。

newtype RoofRaised = float;

Bjarne Stroustrup インタビュー」の一説で、「RoofRaised って何だと思って、長い時間をかけてヘッダーファイルを調べてみたら、ただの double だった、なんてことがよくあったでしょ。大規模なプロジェクトのすべてのクラスで暗黙の typedef を見つけ出すのにどれくらい時間がかかると思う? 」などと馬鹿にされたアレである。

一方、Hackのnewtypeは若干良くなっており、既存の型に制約を与えるための物として機能する。

<?hh
// email型を宣言
newtype email = string;

// 引数mailに渡す値は、email型に明示的にキャストしていないとエラーになる。
function setName(email $mail) : void 
{
}

浮動小数点型はfloatに統一[編集 | ソースを編集]

PHPでは浮動小数点型を巡るfloat派とdouble派の抗争が頻発していたが、Hackでは「float」に統一された。float派の大勝利である。

float  $win  = 1.0;
double $lose = 0.0; //エラーになるよ

感想[編集 | ソースを編集]

ざっくり見た感じPhalangerに近い。

インストール[編集 | ソースを編集]

HackはHHVMヒップホップ仮想マシン)のソースコードの中に埋蔵されている。最新のHHVMのソースコードダウンロードしてきてビルドすれば実行環境は整う。

関連項目[編集 | ソースを編集]

  • PHP
  • Facebook
  • Hack - 曖昧
  • HUCK - 名古屋大学のアドベンチャーサークル「Huckleberry Finn(ハックルベリーフィン)」の略称。かつて鳥取砂丘に描かれて話題になった。

外部リンク[編集 | ソースを編集]

参考文献[編集 | ソースを編集]