第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った

なかなかブログ書く暇を見つけられなかったのですがそろそろ書かないと溜めすぎだろうということで一つに記事でいっぺんに報告。

第三回闇PHP勉強会

第三回となる闇PHP勉強会を開催しました。最初始めたころはどれぐらい続けられるか心配でしたがなんとか第三回を開催できました。今回は以下の4つのセッションでした。

xdebugの実装と仕組みのちょっとした話 @anatoo

自分の発表した話ですが、xdebugの各種機能の実装の仕組みとかってどうなってるのかなーというところを調べてしゃべりました。

php-openclについて @rskyさん

rskyさんによる第一回のOpenCLの話の続きです。なぜか拡張ライブラリのライブコーディングまでやり始めて盛り上がって面白かったです。

php in ruby @do_akiさん

rubyの拡張ライブラリを書いてrubyスクリプトの中からPHPを呼び出せるようにしたという話でした。PHPを組み込むためのSAPIの話は聞いたことなかったので興味深かったです。

PHPエクステンションの開発tips @hnwさん

timecopというPHPで取得する時間を操作する拡張ライブラリの話とそれにともなう拡張ライブラリに関するtips的なお話でした。

感想

やっぱりある程度テーマを区切るとなかなか聞けない話だったりディープな話が聞けて面白いなあと思いました。拡張ライブラリなどについてメインで話せる場みたいなものはやっぱり必要だなーと勝手に思ったとの同時にもっと続けて行きたいなと思いました。多分第四回は来年春前にやります。

参加者の皆さんや発表者のid:hnwさんid:do_akiさんid:rskyさんありがとうございました&お疲れ様でした。

PHPカンファレンス2012

せっかくなので闇PHP勉強会で喋った内容を少し書き足してPHPカンファレンス2012では「縁の下の力持ちxdebugの縁の下!」として喋ってきました。


縁の下の力持ちxdebugの縁の下!

xdebugのメイン機能である、リモートデバッグやコールトレースやコードカバレッジ取得という機能の実装側の仕組みを解説しました。参加された肩やスタッフの皆さん、お疲れ様でした。

PHPMatsuri2012

仕事のために同僚のid:y_gurikoさんと来ていたのでアシアルのスポンサーセッションとしてMonacaの紹介をしました。その後のハッカソンではPHPの内部コンパイラのopcodeをいじるにはどうすればいいんだろうなーというところを実際に調べるべく、PHPPerlのreturn無しで値を返す文法や$_を勝手に代入したり参照したりするハックをやってみました。

<?php

function a() {
    if (rount(random()) === 0) {
        'hoge';
    } else {
        'fuga';
    }
}

echo $a(); // 'hoge'か'fuga'が表示される

perlの様にreturn無しで値を返しています。
こういうコードを食わせると、以下のようなコードと等価になるようにPHPの内部コンパイラに変更を加えました。

function a() {
    if (rount(random()) === 0) {
        $_ = 'hoge';
    } else {
        $_ = 'fuga';
    }
    return $_;
}

echo a(); // 'hoge'か'fuga'が表示される

また、perlでは"print;"みたいなコードを書くと、自動的に$_を参照して出力してくれるのですがこれと同じ機能も実装しました。例えば以下の様なコードが動くようにしました。

<?php

"hogehoge";
echo;

もはや$_とか変数の表示が消えてしまっていますが、以下のようなコードと等価です。

<?php

$_ = "hogehoge";
echo $_;

こういう実装をするにあたっての課題だったのは、ZendEngine内での変数の扱いがよくわかっていなかったことでした。その中でもCompiled Variableというのが最初なんなのかわかりませんでした。最初はVLDで吐き出されるZendEngine用のコードを眺めていたのですが、その中で出てくるCompiled Variableというのが出てきます。なんでしょうこれ。

ZendEngine内部で使われる変数の種類には以下の3つがあります。

Variable 通常のPHPの変数
Temporary variable ZendEngineないで利用される変数
Compiled variable ?

このうち、最初のVariableはPHPの$hogeみたいな通常の変数のことで、その次のTemporary VariableはZendEngine内部でのみ利用されるレジスタのような変数ということがわかっていたのですが、三番目のCompiled Variableというのが何のことがよくわかっていませんでした。

これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。

確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。

以下発表の際のスライドです。技術的な解説は少なめです。

書いたコードはgithub上に置いています。追加したコミットは2つだけです。

PHPMatsuriに参加して

初参加でしたが参加者がたくさん自分なりにできることを見つけて実際にたくさんの方がその成果をLTで発表していて素晴らしいイベントだと感じました。次回は是非自費で参加したいなと思いました。PHPMatsuriのスタッフや参加者の皆さん熱いイベントありがとうございました。