footmark

ひよっこエンジニアの足跡

新言語HackとHHVM

PHPの上位互換(?)、新言語Hackを弄ってみた。

新言語Hackとは

PHPer必見!最強PHPerになれると噂の「新言語Hack」を試してみよう! | 株式会社LIG

こちらの記事が分かりやすかったので抜粋させていただきます。

  • Facebook製の新言語
  • HHVM(実行環境)上で動作
  • PHPと互換性アリ
  • 静的型付言語
  • PHPには無い機能を持つ
    • Generics
    • Nullable Type
    • Collection
    • Lambda
    • Async
    • Await
    • Tuple
    • Override Attribute
    • Type aliasing

文章で補足すると、

PHPを開発言語としていたFacebookがパフォーマンスを上げるために新しい言語を開発した。
新しい言語とPHPの間には、一部ずつ置き換えていけるよう互換性を持たせた。
何が違うのかというと、HHVM上で動作すること(HHVMはPHPの実行環境よりも早い)、PHPには無い機能を持っていることである。

といった感じです。

あれ?Hack?HHVM?

僕の場合、パッと読んだ感じだと、どうしても実行速度が速いんです!という点に目が行ってしまい、HackはPHPよりも速くて、それはHHVMのおかげで、HackはHHVM上で動いて。。。
あれ?
HHVMが早いのであってHackは速くない?
といった具合に混乱してきたので手を動かしてみました。

とりあえずインストール

$ yum -y install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum -y upgrade
$ cd /etc/yum.repos.d/
$ wget http://www.hop5.in/yum/el6/hop5.repo
$ yum install -y hhvm

PHPer必見!最強PHPerになれると噂の「新言語Hack」を試してみよう! | 株式会社LIG


参考記事ではHHVMのインストール時にエラーがあったとありますが、僕の環境では大丈夫でした。

ウ●コードを書く

実行時間を測るため、何も考えずにウ●コードを書く。
友達に見せたら「最適化が(中略)正しいベンチマークは測れないよ!」って言われたけど、結果が出たからまあ良しとする。
(良い友だちを持ったわ。。。)
PHPとHackのコードを書くんですが、以下の通り、先頭の

<?php

<?hh

とするだけの高互換性です。


PHPのコード

<?php

$N = 1000000000;

$time_start = microtime(true);

$x = 0;
for($i = 0; $i < $N; $i++) {
    $x++;
}

$time_end = microtime(true);
$time = $time_end - $time_start;

print("$time\n");


Hackのコード

<?hh

$N = 1000000000;

$time_start = microtime(true);

$x = 0;
for($i = 0; $i < $N; $i++) {
    $x++;
}

$time_end = microtime(true);
$time = $time_end - $time_start;

print("$time\n");

実行結果

実行結果はコチラ。
数字の単位は秒です。

$ php php_time.php
92.892948150635

$ hhvm php_time.php
6.9471001625061

$ hhvm hack_time.hh
6.3032808303833


HHVM様様ですね。
PHPの実行環境さんごめんなさい。。。
この結果を見ると、同じHHVM上でもPHPよりHackが若干速いように見えますが、誤差の範囲でした。

ということで、Hackの速さの大部分はHHVMの恩恵であることが分かりました。
もちろん、Hackが静的型付言語であることやPHPには無い機能を持っていることを考慮したコードを書けば、更に速度を上げることも可能だと思います。

トーシローな僕は、とりあえずPHPの実行環境をHHVMに置き換えればいいんじゃないの?とか思ってしまうのですが、どうなんでしょうか。

まとめ

  • HHVMは速い
  • 新言語Hack=HHVM上で動くPHPの上位互換言語