この記事の内容の大部分は、AST の RFC ドキュメントに基づいています: https://wiki.php.net/rfc/abstract_syntax_tree , 理解を容易にするために、ソース文書からの抜粋が紹介されています。
この記事では、抽象構文ツリーが何であるかについては説明しません。これは自分で理解する必要があります。この記事では、AST が PHP にもたらすいくつかの変更についてのみ説明します。
新しい実行プロセス
PHP7 のコアにおける重要な変更は、AST の追加です。 PHP5 では、PHP スクリプトからオペコードまでの実行プロセスは次のとおりです:
1. 字句解析: 字句スキャン分析、ソース ファイルをトークン ストリームに変換します;
2. 解析: 構文分析、Op 配列はこの段階で生成されます。
3. PHP7 では、op 配列は構文分析段階で直接生成されなくなりましたが、AST が最初に生成されるため、プロセスにはもう 1 つのステップがあります:
4. 字句解析:字句スキャン分析、ソース ファイルをトークン ストリームに変換;
5. 解析: 構文分析、トークン ストリームから抽象構文ツリーを生成;
6. コンパイル: 抽象から op 配列を生成構文ツリー。
実行時間とメモリ消費量
上記の手順から、これは前のプロセスよりも 1 つの手順が多いため、常識的には、これによりプログラムの実行時間が増加します。時間とメモリの使用量。しかし実際には、メモリ使用量は確かに増加していますが、実行時間は減少しています。
次の結果は、小規模 (約 100 行のコード)、中規模 (約 700 行)、および大規模 (約 2800 行) の 3 つのスクリプトをテストして得られます。テスト スクリプト: https ://gist.github.com/nikic/289b0c7538b46c2220bc
各ファイルを 100 回コンパイルする実行時間 (記事のテスト結果時間は 14 年であることに注意してください、PHP7 とも呼ばれます) PHP-NG ):
##php-ng |
php-ast | diff | |
---|---|---|---|
0.160s | -12.5% | MEDIUM | |
1.268s | -17.7% | LARGE | |
5.736s | -16.9% |
php-ast |
diff | ##SMALL | |
---|---|---|---|
9.5% | ##MEDIUM | 507kB | |
26.8% | 大 | 1084kB | |
71.3% | 単一コンパイルのテスト結果は、実際の使用状況を表していない可能性があります。以下は、PhpParser を使用した完全なプロジェクト テストの結果です: |
diff |
時間 | 25.5ms | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
##メモリ | 2360kB | 2482kB | |||||||||||||
## |
式 | PHP5 | PHP7 |
---|---|---|
$foo['bar']['baz'] |
#$ {$foo['bar']['baz']}
|
($$foo)['bar']['baz'] |
$foo->$bar['baz']
| ##$foo->{$bar['baz']}
#($foo->$bar)['baz'] |
| ##$foo->$ bar['baz' ]()
$foo->{$bar['baz']}() |
#($ foo->$bar )['baz']() |
##Foo::$bar['baz']() |
Foo ::{$bar['baz']}()
|
(Foo::$bar)['baz']()
|
全体的に、以前の順序は右から左でしたが、現在は左から右です。また、括弧は動作に影響を与えないという原則に従います。このような複雑な変数の書き方は、実際の開発では注意が必要です。 |
以上が新しい抽象構文ツリー (AST) によって PHP7 に加えられた変更の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。