PHP7調査(2)コンパイル時にASTを構築するようになった

  • 27
    Like
  • 0
    Comment
More than 1 year has passed since last update.

PHP7から内部的にAST(抽象構文木)が実装されるよ!とのこと。反対票ゼロでPHP7への採用が決まっています。

https://wiki.php.net/rfc/abstract_syntax_tree

構文解析とコンパイルの分離

PHPでは構文解析にYACCを利用しています。YACCでの構文解析は、概念的には構文木を辿るような処理なのですが、これまでのPHPでは実装として木構造を構築することはせず、構文解析をしながら即座にopcodeを作り出すような処理をしていました。

このようなつくりが原因で、これまでのPHPではYACCレベルの文法が冗長になったり、PHP文法に一見無意味な制約ができたりしていました。

PHP7からは一度ASTを作りあげてからopcodeの生成を行うため、パーサーや最適化の実装がシンプルになって保守性が上がったり、これまで技術的な理由で不可能だったスマートな文法が導入しやすくなると期待できます。

ソースコードを見たい方のために実装箇所も紹介しておきます。現時点では、Zend/zend_language_parser.yでASTを作り、それを元にZend/zend_compile.czend_compile_top_stmt()でopcode生成するという処理になっています。

OPcacheとの関係

いまのところ、コンパイル時に作られるASTはOPcacheの最適化フェーズとは完全に切り離されています。OPcacheがopcodeの最適化をする時点では、コンパイル時に作ったASTは破棄されているようです。

OPcacheの最適化処理でASTが使えれば今より高度な最適化ができるはずなので、少しもったいない気がします。

今後の可能性

ASTをuser landから見えるようにするextensionも作れるよね、なんて話も出ています。PHP7公開までに間に合うといいですね。

もしこれが作られると、文法チェッカなどのツールが発達する可能性がありそうです。これまでもnikic/PHP-ParserのようにPHPレイヤでASTを作る試みはありましたが、あまり使われていない印象があります。PHPの標準関数としてサポートされれば可能性が広がるのではないでしょうか。