こんにちは、お昼はもっぱら社内のキッチンで料理をしているエンジニアののびすけです。
LIGではメインの開発言語にPHPを使っていて、僕はPHPが大好きなのですが、昨今のWeb業界ではPHPなんて…(ry とか言う輩が少なくないです。
※気になる人は「PHP Dis」でググってみるといいかも
そんな声に負けずにPHPの新たな可能性を感じるFacebook製の「新言語Hack」を紹介します!
なお、今回の記事はPHPer界隈で話題になっていた「新言語Hackで最強PHPerになろう!」という記事を元に、初心者向けの内容にしたものです。
参考:新言語Hackで最強PHPerになろう!
https://qiita.com/yone098@github/items/7ff3616030e8d19400a7
それでは、はじめます!
目次
「新言語Hack」とは
Hackとは2014年3月20日にFacebookがHHVM(後述)向けに発表した新言語です。ホントについ最近ですね。
Facebook曰く、「PHPの開発スピードと、静的型付言語の統制性を調和させ、他の現代プログラミング言語に共通する多くの特徴を付加した」言語となっています。PHPと互換性があるため、PHPのコードをほぼそのままHackとして利用できます。
FacebookはもともとPHPを開発言語としていましたが、パフォーマンスを上げるために独自でPHPの実行環境を開発し、そこで動作するHackを開発したという経緯であるようです。Facebook社内では2013年からPHPコードのほぼ全体をHackに移行させ、大きな成功を収めているといいます。
Hackの特徴
一言で言うと「PHPより速いPHP」です。
- 静的型付言語
PHPは動的型付言語ですが、Hackでは変数の型宣言を静的に行うことで速度向上をしています。動的の特徴であるスピーディーな特徴に加えて、静的の特徴であるエラーハンドリングの行いやすさなど兼ね備えたハイブリッドな言語になっています。
- HHVM上で動作
PHP(言語)はPHP(実行環境)上で動作しますが、HackはHHVMという実行環境上で動作します。HHVMがPHPよりも高速なので、Hackも必然的にPHPより速くなります。
- PHPとの互換性
Hackは既存のPHPのコードほぼそのまま使うことができます。HackはPHPで構築されたシステムの中に共存することを想定した設計になっているため、Hackへ移行する場合でも競合せずに段階的に移行することが可能です。
- PHPには無い機能が使える
- Generics
- Nullable Type
- Collection
- Lambda
- Async
- Await
- Tuple
- Override Attribute
- Type aliasing
これらが使えるようになります。各機能の詳細な紹介は省略しますが、なんとなくJavaに近づけている印象がありますね。
参考:Nullable 型 (C# によるプログラミング入門)
参考:ジェネリックス – Java 入門
参考:Facebook Hack Programming Language – Business Insider
参考:速くて安全:フェイスブック、HHVM向けの新プログラミング言語「Hack」を発表 – @IT
HHVM(HipHop Virtual Machine)とは
正式名称はHipHop Virtual Machineと言います。
PHP(言語)のコードの実行を、現在標準的に使われているPHP(実行環境)よりも高速化することを目的として作られています。
実行環境としてのPHPっていう表現にピンと来ない人もいると思いますが、例えばScalaという言語はJVM(Java Virtual Machine)上で動作します。同じように今回紹介しているHackという言語はHHVM上で動作します。
一方、PHPは言語と実行環境が同じ呼び方という感じです。
<img loading="lazy" alt="言語と実行環境の対応" src="https://i.gyazo.com/e438c260f1949c8f8ab59f31672d4dfb.png" width="907" height="336" /> 言語と実行環境の対応[/caption]
つまるところ、<strong>HHVMはPHPよりも早くPHPを実行可能な環境</strong>ということになります。
<h2 id="m3">PHPとHHVM</h2>
先程の話でHHVMはPHPをより高速に実行することを目的にしていることが分かりましたが、実際どれくらい違いがあるのでしょう。
実行環境としてのPHPとHHVMの比較を行ったサイトを見つけたので紹介します。
PHP5.5.7とHHVM2.3.1が比較対象となっています。
<strong>1秒間にさばけるリクエスト数</strong>は<strong>PHPが88.80、HHVMは196.14</strong>となっており、HHVMの方が倍以上のリクエストをさばけることが分かります。
また、<strong>1回のリクエストに対してかかる実行時間</strong>は<strong>PHPが約0.04秒、HHVMでは約0.02秒</strong>となっており、HHVMの方がPHPの倍の速度でさばけることが分かります。
このデータだけで一概に判断はできませんが、平均的に<strong>HHVMの方がPHPを倍以上の速度で実行</strong>できるようです。
環境によっては10倍以上速度の差も出るという報告もありました。
<img loading="lazy" class="alignnone" alt="" src="https://i.gyazo.com/829c5c44537e5f5b1a64989665ffb891.png" width="720" height="193" />
<strong>参考: Drupal 7: HHVM vs. PHP 5.5 + Zend Opcache | web-rocker.de</strong>
<p class="link"><a href="https://go.shr.lc/1kE9aMy" target="_blank" rel="nofollow noopener noreferrer">https://go.shr.lc/1kE9aMy</a></p>
<h2 id="m4">HHVMとHackを試してみよう!</h2>
お待たせしました! それではCentoOSに<strong>HHVMをインストールをしてHackでHello World</strong>するまでを紹介します。
<h3>環境</h3>
CentOS release 6.5 (Final) (GMOクラウドのVPS)
こちらはほぼ何も入ってないクリーンな状態です。
<h3>HHVMのインストール</h3>
それではHHVMをインストールしてみましょう。sudoなどの記述は省略して書いています。
<pre><pre>[code]
$ yum -y install https://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum -y upgrade
$ cd /etc/yum.repos.d/
$ wget https://www.hop5.in/yum/el6/hop5.repo
$ yum install -y hhvm
・
・
Complete!
※私の場合は、最後のhhvmのインストールでエラーが発生しました。
Error: Package: gcc-java-4.4.7-4.el6.x86_64 (@base) Requires: gcc = 4.4.7-4.el6 Removing: gcc-4.4.7-4.el6.x86_64 (@base) gcc = 4.4.4-15.el6 gcc = 4.4.7-4.el6 Updated By: gcc-4.8.2-8.el6.x86_64 (hop5) gcc = 4.8.2-8.el6 Available: gcc-4.6.3-2.el6.x86_64 (hop5) gcc = 4.6.3-2.el6 Available: gcc-4.8.2-7.el6.x86_64 (hop5) gcc = 4.8.2-7.el6 Error: Package: libgnat-devel-4.4.7-4.el6.x86_64 (@base) Requires: libgnat-4.4.so()(64bit) Removing: libgnat-4.4.7-4.el6.x86_64 (@base) libgnat-4.4.so()(64bit) Obsoleted By: gcc-4.8.2-8.el6.x86_64 (hop5) Not found
理解してないけど参考ブログのようにgcc-javaとlibgnat-develを削除してみました。
$ sudo yum remove -y gcc-java $ sudo yum remove -y liggnat-devel
その後インストール再チャレンジしたら上手くいきました!
$ yum install -y hhvm ・ ・ Complete!
おお、成功した!
HHVMのインストールが完了したら確認してみましょう。
$ hhvm --version HipHop VM 3.0.1 (rel)
HHMVでPHPを実行
上記の手順でhhvmコマンドが使えるようになっているので、phpファイルを作成してhhvmで動かしてみましょう。
$ echo '<?php echo "hello hhvm\n";' >> hello.php $ hhvm hello.php hello hhvm
コンソールにhello hhvmの文字が表示されれば成功です!
phpコマンド以外でphpを実行したのは初体験です。笑ちなみにサーバーにphpがインストールされていなくても動作します。
$ php -v -bash: php: コマンドが見つかりません
phpのファイルがphpをインストールしてなくても動くのですね。なんか不思議な感じですね(,,゚Д゚)
Hackを使ってみる
hhvm上でphpの実行ができたので、いよいよhackを動かしてみましょう!と言ってもphpのコードを少し変更するだけでhackになるので簡単です。
先程のhello.phpのファイル名をリネームしてhello.hhにしましょう。
次にhello.hhの中を編集してphpタグの
php
をhh
にすればOKです。$ cp hello.php hello.hh $ vi hello.hh <?php echo "hello hhvm\n"; ↓ <?hh echo "hello hhvm\n";
それではさっきと同じようにhhvmコマンドで実行してみましょう。
$ hhvm hello.hh hello hhvm
再度hello hhvmが表示されれば成功です
Webから実行してみる
PHPということでやはりWeb上から実行したいですね。hhvmでサーバーを立ち上げてウェブブラウザから確認してみましょう。
コンソール上でそのまま確認する場合はcurlコマンドを使って確認します。
$ hhvm -m server $ curl localhost/hello.php hello hhvm
ブラウザからアクセスする場合はhttps://localhost/hello.phpにアクセスして「hello hhvm」と表示されれば成功です。
以上、簡単でしたがHHVMとHackの体験ができましたね。
参考:CentOS6.5にHHVMを入れる時のTips - 生涯未熟
まとめ
今回はFacebookが開発した「新言語Hack」についてと実際の利用の紹介をしました。簡単にまとめると以下のようになります。
- Facebookが開発
- PHPよりも"性能"が良い
- PHPからHackへの移行はとても簡単
ちなみに、この記事は「いわてPHPカンファレンス」というイベントに参加した際のHackについてのライトニングトーク内容をまとめた感じです。
何かと言われがちなPHPですが、Hackの登場でまた新たな方向性が見えて来たのではないかと思います。
世界最大のSNSであるFacebookで開発され、利用されているということは、今後かなりの期待ができるのではないでしょうか。
PHPerの皆さんや、そうでないエンジニアの皆さんにおかれましては、ぜひ選択肢の1つとして考えつつ、一度Hackを体験してみてください。
Hackはまだ公開されて間もないので、今から始めれば国内Hack市場ではかなりのアーリーアダプターになれると思います!それでは!
参考:Hackhttps://hacklang.org/
参考:HHVMhttps://hhvm.com/
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。