Anthony Ferraraさん(@ircmaxell)が2012年12月に公開したPHPで記述されたPHP実装「PHPPHP」について、今さらですが調べてみました。
@ircmaxellさんはPHPの内部構造についての解説サイト「PHP Internals Book」の筆者の一人であり、PHP 5.5で導入された新しいパスワードハッシュ関数の提案・実装者でもあります(参照:https://wiki.php.net/rfc/password_hash)。最近発表した「Recki-CT」も興味深いプロダクトです。
そんなわけでジョークレベルではないだろうとは思ってましたが、今回中身を見てみたらガチすぎて恐怖しました。どういうモチベーションでこんなもん作る気になるんだ…。
PHPPHPの挙動はおおよそ次のようなものです。
- PHPソースコードを受け取って構文解析して抽象構文木(AST)を作る
- これは@nikicさん作のPHP-Parserを利用しています
- ASTからZend Engineと完全互換のopcodeを生成する
- opcodeを実行する
- Zend Engineを模したようなExecutorクラスを実装している
- 参照:lib/PHPPHP/Engine/Executor.php
- (当然ながら)各opcodeの挙動はPHPで実装されている
これを実際に動かしてみると非常に遅いのですが、処理内容を考えると仕方ない気がします。そもそも、一定以上動くレベルまで作り込んだ時点で頭おかしい(褒め言葉)ですよね。
ただし、PHP標準関数の呼び出しでは基本的にPHP本体の関数を利用しており、ここはズルと言えばズルです。とはいえ、PHPの関数を自前実装するための仕組みは既に用意されているので、あとはやる気の問題だけです。実際、PHPPHPのimplode関数はPHPのimplode関数を使わずに文字列操作で実装されています。
クラス設計も非常に見通しが良いと感じたので、よーしPHP実装しちゃうかーと思っている方は参考にしてみてはいかがでしょうか。また、PHP-Parserの利用例として見ても良さそうです。