第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った
なかなかブログ書く暇を見つけられなかったのですがそろそろ書かないと溜めすぎだろうということで一つに記事でいっぺんに報告。
第三回闇PHP勉強会
第三回となる闇PHP勉強会を開催しました。最初始めたころはどれぐらい続けられるか心配でしたがなんとか第三回を開催できました。今回は以下の4つのセッションでした。
PHPカンファレンス2012
せっかくなので闇PHP勉強会で喋った内容を少し書き足してPHPカンファレンス2012では「縁の下の力持ちxdebugの縁の下!」として喋ってきました。
xdebugのメイン機能である、リモートデバッグやコールトレースやコードカバレッジ取得という機能の実装側の仕組みを解説しました。参加された肩やスタッフの皆さん、お疲れ様でした。
PHPMatsuri2012
仕事のために同僚のid:y_gurikoさんと来ていたのでアシアルのスポンサーセッションとしてMonacaの紹介をしました。その後のハッカソンではPHPの内部コンパイラのopcodeをいじるにはどうすればいいんだろうなーというところを実際に調べるべく、PHPにPerlの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のスタッフや参加者の皆さん熱いイベントありがとうございました。