差分

ナビゲーションに移動 検索に移動

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

3,422 バイト追加, 2014年3月24日 (月) 11:37
ページの作成:「'''Hack'''とは、PHPから派生したプログラミング言語である。 == 概要 == HackはFacebookが2014年に発表したPHPを[[魔改造]...」
'''Hack'''とは、[[PHP]]から派生した[[プログラミング言語]]である。

== 概要 ==
Hackは[[Facebook]]が2014年に発表した[[PHP]]を[[魔改造]]した[[プログラミング言語]]である<ref>https://code.facebook.com/posts/264544830379293/hack-a-new-programming-language-for-hhvm/</ref>。PHP自体を魔改造により独自拡張したものなので長い歳月をかけてアホみたいに増えまくった[[PHP]]の関数群もそのまま使える。

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

HHVM実行環境の[[ソースコード]]は[[PHPライセンス]]および[[Zendライセンス]]の下で公開されている。
<ref>https://github.com/facebook/hhvm</ref>

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

=== 型アノテーション===
Hackを大雑把に言えば[[PHP]]を[[静的型付け]]にした[[プログラミング言語]]である。

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

その書式は[[JavaScript]]に型の概念を入れた[[ActionScript3]]と非常によく似ている。
<source lang="php">
<?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;
}
}
</source>

===ジェネリクス===
[[C Sharp|C#]]のような[[ジェネリクス]]が使える。
<source lang="php">
<?hh
class Box<T>
{
protected T $data;

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

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

=== null許容型 ===
[[C Sharp|C#]]のような[[null許容型]]が使える。
ただし反抗期なのか「?」の位置が異なり、たとえば[[C Sharp|C#]]では末尾(int?)なのが、Hackでは先頭(?int)となっている。
<source lang="php">
<?hh
?int nullableInt = null;
?bool nullableBool = null;
</source>

===コレクション===
[[PHP]]で扱える[[コレクション]]と言えばArray型で表される[[リスト]]のみであったが、Hackでは以下のコレクションが組込型として搭載されている。
*[[Vector]] - 並び順付きのリスト
*[[Map]] - 並び順付きのディクショナリ
*[[Set]] - ユニークなリスト
*[[Pair]] - 2つの関連するオブジェクトを格納する

===ラムダ式===
[[C Sharp|C#]]のような[[ラムダ式]]が使える。
<source lang="php">
function foo(): (function(string): string)
{
$x = 'bar';
return $y ==> $x . $y;
}

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

== 感想 ==
ざっくり見た感じ[[Phalanger]]に近い。

==関連項目==
*[[PHP]]
*[[Facebook]]

==参考文献==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー