ホームページ >バックエンド開発 >PHPチュートリアル >Facebook ヒップホップ php vm 引き換えの概要 (2)
facebook hiphop php vm 実装概要 (2)
上記からわかるように、コアのランタイム環境のコードは src/runtme/eval にあります。この記事では、主にコードの実装について簡単に説明します。以下の説明はフォルダーごとに分類されています。
1. 実行時: コア データ構造 (シンボル テーブル)
1. assoc_list.cpp 変数関連付けテーブル
2. code_coverage.cpp コード カバレッジ ツール
3. php ファイルのキャッシュ
4. Variable_environment.cpp は、各関数、変数などが属する環境 (クラス、スコープなど) を維持します。
5. 変数スタック構造 (関数の呼び出し関係を記録するために使用されます)
6. eval_state.cpp 現在存在するオブジェクト、各オブジェクトが持つメソッド、グローバル関数、定数など、最も重要な実行時情報がここに収集されます。 >7. eval_object_data .h クラスの情報を記録します
8. eval_frame_injection.h 関数呼び出し内のスタックフレーム
2. ext
このディレクトリは、クラスに外部関数を追加するメソッドをカプセル化します。ランタイム、
3. パーサー
パーサー、YACC を使用して実装されたパーサー (EBNF 文法ファイルは hphp.y、hphp.tab.cpp はツールによって生成されます)。ここでの主なものは、セマンティック解析を提供することです (TreeWalker は理解できます)。 hiphop php vm の場合、セマンティック処理は、php コードを C++ コードにマップする方法を見つけることです (これには、ランタイムによって提供される多数の外部関数が必要です)。
1. hphp.yの概要
文法開始記号:start
ファイルの包含関係や文の追加などの処理はsrc/runtime/eval/parser/parser.cppにあり、 just onXXX() このツリー トラバーサーの出力は AST で、最上位ノードはステートメント
4. デバッガー ソケットを使用して実装されたデバッガー
実際に処理を開始する最後は void DebuggerProxy::processInterrupt (CmdInterrupt &cmd)
5.base
基本データ構造宣言
6. ast
パーサーによって解析された AST に対してセマンティック処理を実行します (つまり、具体的には PHP コードを変換します)コード)
各ステートメントの統一インターフェースは
virtual Statement *optimize(VariableEnvironment &env) { return NULL } // 最適化ステートメント
virtual void eval(VariableEnvironment &env) const = 0; 関係
virtual void byteCode(ByteCodeProgram &code) const;
Eval:: Construct によって開発された継承構造は非常に美しく書かれています。 🎜>7. 分析範囲
8. 実行時のセマンティック処理は、php を C++ に変換するメインプロセスです
eval.cpp Variant eval(LVariableTable *vars , CObjRef self, CStrRef code_str,bool prepend_php /* = true */)
1 . PHP ソース コードの前処理
2. ParseString() ツリー トラバーサル
3. セマンティック解析 (再帰的に下降)
9. >関数呼び出しの基本的な考え方: シンボルテーブルの情報に従って、入力するたびにオブジェクト、メソッド、変数などの実行環境情報を検索します 関数を使用して PHP 関数呼び出しを変換するときにスレッドスタックフレームを作成します外部関数の実行ロジックへの組み込み