PHP7から内部的にAST(抽象構文木)が実装されるよ!とのこと。反対票ゼロでPHP7への採用が決まっています。
構文解析とコンパイルの分離
PHPでは構文解析にYACCを利用しています。YACCでの構文解析は、概念的には構文木を辿るような処理なのですが、これまでのPHPでは実装として木構造を構築することはせず、構文解析をしながら即座にopcodeを作り出すような処理をしていました。
このようなつくりが原因で、これまでのPHPではYACCレベルの文法が冗長になったり、PHP文法に一見無意味な制約ができたりしていました。
PHP7からは一度ASTを作りあげてからopcodeの生成を行うため、パーサーや最適化の実装がシンプルになって保守性が上がったり、これまで技術的な理由で不可能だったスマートな文法が導入しやすくなると期待できます。
ソースコードを見たい方のために実装箇所も紹介しておきます。現時点では、Zend/zend_language_parser.y
でASTを作り、それを元にZend/zend_compile.c
のzend_compile_top_stmt()
でopcode生成するという処理になっています。
OPcacheとの関係
いまのところ、コンパイル時に作られるASTはOPcacheの最適化フェーズとは完全に切り離されています。OPcacheがopcodeの最適化をする時点では、コンパイル時に作ったASTは破棄されているようです。
OPcacheの最適化処理でASTが使えれば今より高度な最適化ができるはずなので、少しもったいない気がします。
今後の可能性
ASTをuser landから見えるようにするextensionも作れるよね、なんて話も出ています。PHP7公開までに間に合うといいですね。
もしこれが作られると、文法チェッカなどのツールが発達する可能性がありそうです。これまでもnikic/PHP-ParserのようにPHPレイヤでASTを作る試みはありましたが、あまり使われていない印象があります。PHPの標準関数としてサポートされれば可能性が広がるのではないでしょうか。