「Hack (プログラミング言語)」の版間の差分
(→ラムダ式) |
|||
4行目: | 4行目: | ||
Hackは[[Facebook]]が2014年に発表した[[PHP]]を[[魔改造]]した[[プログラミング言語]]である<ref>https://code.facebook.com/posts/264544830379293/hack-a-new-programming-language-for-hhvm/</ref>。PHP自体を魔改造により独自拡張したものなので長い歳月をかけてアホみたいに増えまくった[[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]] | + | Hackは[[JavaVM]]の[[パクリ]]のような[[HHVM]]([[ヒップホップ仮想マシン]])という[[仮想マシン]]の上で動作する。ヒップホップ仮想マシン自体は古くから有名であり、もともとは[[PHP]]を[[中間コード]]にして多段階で[[最適化]]する手法を実現したかったようだ。ただ、これだけ聞くと[[Phalanger]]の[[車輪の再発明]]のように思えるが真相は不明である。 |
HHVM実行環境の[[ソースコード]]は[[PHPライセンス]]および[[Zendライセンス]]の下で公開されている。 | HHVM実行環境の[[ソースコード]]は[[PHPライセンス]]および[[Zendライセンス]]の下で公開されている。 | ||
112行目: | 112行目: | ||
</source> | </source> | ||
− | == 感想 == | + | === 感想 === |
ざっくり見た感じ[[Phalanger]]に近い。 | ざっくり見た感じ[[Phalanger]]に近い。 | ||
+ | |||
+ | ==インストール== | ||
+ | Hackは[[HHVM]]([[ヒップホップ仮想マシン]])の[[ソースコード]]の中に埋蔵されている。最新のHHVMの[[ソースコード]]を[[ダウンロード]]してきて[[ビルド]]すれば実行環境は整う。 | ||
==関連項目== | ==関連項目== |
2014年3月24日 (月) 13:41時点における版
目次
概要
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;
}
}
ジェネリクス
<?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では以下のコレクションが組込型として搭載されている。
ラムダ式
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
{
}
感想
ざっくり見た感じPhalangerに近い。
インストール
HackはHHVM(ヒップホップ仮想マシン)のソースコードの中に埋蔵されている。最新のHHVMのソースコードをダウンロードしてきてビルドすれば実行環境は整う。