30
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-02

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

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

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の標準関数としてサポートされれば可能性が広がるのではないでしょうか。

30
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?