zephirとは?
zephirはphpエクステンションを生成することに特化した開発言語です。
http://zephir-lang.com/
特徴として、
- メモリ操作を気にすることなくコードが書ける
- 静的型付け+動的型付け
- PHPの組み込み関数を利用する事が出来る
- PHPライクなシンタックス
といった特徴が挙げられます。
PHPを書けるエンジニアなら習得するのは容易で、簡単にエクステンションを作成することが可能です。
インストール
centos6.5で検証しました。
Git
がインストールされていること、remi
リポジトリを参照出来る事を前提としています。
yum install -y --enablerepo=remi gcc automake autoconf pecr re2c php-devel
# 適当なディレクトリに移動
cd /usr/local/src
git clone https://github.com/json-c/json-c.git
cd json-c
sh autogen.sh
./configure && make && make install
cd ../
git clone https://github.com/phalcon/zephir
cd zephir
./install -c
上記手順でインストールした場合、
/usr/local/src/zephir/bin/zephir-parser
が生成されていればインストールは成功です。
スケルトン生成
コマンドラインからzephir init [name]
と実行すればスケルトンが生成されます。
[name]
Lext
L[name]
Lconfig.json
コードは[name]/[name]以下に作成していきます。
エディタ
Sublime Text2 にはzephirのシンタックスハイライトパッケージが提供されていました。
その他エディタについては存じません。
Hello World
定番のHello Worldです。
zephirでエクステンション作成
zephir init sample
でスケルトンを生成します
sample/sample/helloworld.zep
でファイルを作成します。(拡張子は.zep
です)
// namespaceは必須です、スケルトン生成時に指定した名前と同じ値を指定します。
namespace Sample;
// クラス名はファイル名と同一である必要があります
class HelloWorld
{
public static function say()
{
echo 'Hello World!!';
}
}
zephir build
でコンパイルを実行し、.so
ファイルを生成します、.so
ファイルは適当なディレクトリ(phpのエクステンションがデフォルトで置かれているディレクトリ)に生成されます。
今回はパッケージからPHPをインストールすることを想定して、
/etc/php.d/
以下にsample.ini
を作成しエクステンションを追加します。
echo "extension=sample.so" > /etc/php.d/sample.ini
PHPから作成したエクステンションを実行
Sample\HelloWorld::say(); // Hello World!!
変数はイミュータブル?
zephirで定義した変数はPHPのように直接変更することが出来ません。
var a;
a = 0; // コンパイルエラー
変数に値を設定する場合はlet
を使います
var a;
let a = 0; // OK
型付けを試してみる
zephirでは静的片付けと動的型付けの両方をサポートしています。
int型を例にどの程度静的型付け出来るのか確認してみた
// 数値以外も代入可能なint型...
int a = 0; // OK
int b = false; // これはコンパイルエラー
int c = 100.5; // これもコンパイルエラー
int d;
let d = false, // 0 コンパイルエラーにならない
d = 100.5, // 100 コンパイルエラーにならない
d = 'foo' // これは流石にコンパイルエラー
あまりカッチリしてないですね…
メソッドで型定義
public function foo(string str) -> <Foo\Bar>
{
}
引数、戻り値に対して型指定することが出来ます。
型がscalarではない場合<namespace\class>
といった形で表現します。
else ifがない
何か代替となる手段があるかというとそうでもない。
else if
を使わないようなコーディングが求められるかも。
// else if と書けないので、同じことをしたいならifをネストさせる
if (1) {
// 何か
} else {
if (1) {
// 何か
} else {
// 何か
}
}
まとめ
軽くzephir
について書いてみましたが、この子、言語的には全く洗練されていません。
とはいっても、処理を高速化したいというケースは何処かしらで出てくるのではないでしょうか?
そういったケースを解決する時にC
は難しいけど...というエンジニアでも解決策としてzephir
を利用するという答えを持っておくのはいいかなと思います。
(現状大したベンチマークとってないので、どれだけ早いかには言及出来ませんが;;)
まだ新しい言語でもありますので、今後の発展に期待したいです。