Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

php7's ast

8,659 views

Published on

第六回闇PHP勉強会

Published in: Technology
  • Sex in your area is here: ❤❤❤ http://bit.ly/39pMlLF ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD FULL eBOOK INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, CookeBOOK Crime, eeBOOK Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD FULL eBOOK INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, CookeBOOK Crime, eeBOOK Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

php7's ast

  1. 1. php7’s ast 2015/11/22 第六回闇PHP勉強会 do_aki
  2. 2. @do_aki @do_aki http://do-aki.net/
  3. 3. コンパイルプロセス(教科書的) 字句 解析 構文 解析 最適化 コード 生成
  4. 4. 字句解析 • ソースコードをトークンに分解 • トークン := 意味を持つ最小単位 <?php function hello ( ) { echo ‘HELLO WORLD’ ; }
  5. 5. 字句解析 • ソースコードをトークンに分解 • トークン := 意味を持つ最小単位 <?php function hello ( ) { echo ‘HELLO WORLD’ ; } T_OPEN_TAG T_FUNCTION T_STRING ( ) { } T_ECHO T_CONSTANT _ENCAPSED_STRING ;
  6. 6. 構文解析 • トークン列から規則(文法)を導く function hello ( ) { echo ‘HELLO WORLD’ ; } T_FUNCTION T_STRING ( ) { } T_ECHO T_CONSTANT _ENCAPSED_STRING ;inner_statement_list 関数定義
  7. 7. php5 の コンパイルプロセス 字句解析 構文解析+コード生成 php7 の コンパイルプロセス 字句解析 構文解析 コード生成 zendlex -> TOKEN zendparse -> OPCODE zendlex -> TOKEN zendparse -> AST zend_compile_stmt -> OPCODE
  8. 8. php5 の コンパイルプロセス 字句解析 構文解析+コード生成 php7 の コンパイルプロセス 字句解析 構文解析 コード生成 zendlex -> TOKEN zendparse -> OPCODE zendlex -> TOKEN zendparse -> AST zend_compile_stmt -> OPCODE 構文解析で AST を構築し、 AST から OPCODE を生成
  9. 9. 導入理由 コンパイラおよびパーサのメンテナンス 性向上 (技巧的なコードの排除) 技術的な問題により、導入が困難であっ た文法を扱えるようになる
  10. 10. PHP の AST
  11. 11. zend_ast (基本形) • Zend/zend_ast.h / Zend/zend_ast.c typedef uint16_t zend_ast_kind; typedef uint16_t zend_ast_attr; struct _zend_ast { zend_ast_kind kind; /* Type of the node (ZEND_AST_* enum constant) */ zend_ast_attr attr; /* Additional attribute, use depending on node type */ uint32_t lineno; /* Line number */ zend_ast *child[1]; /* Array of children (using struct hack) */ }; typedef struct _zend_ast zend_ast; // <- Zend/zend_types.h Zend/zend_ast.h より 一部見やすさのために改変
  12. 12. zend_ast_kind • ZEND_AST_* • 全98種 (php7.0.0 RC7 時点) • 大まかに分類して4系統 – 特殊ノード ZEND_AST_ZVAL / ZEND_AST_ZNODE – 定義ノード ZEND_AST_CLASS など – リストノード ZEND_AST_STMT_LIST など – 通常ノード ZEND_AST_VAR, ZEND_AST_FOREACH など
  13. 13. 特殊ノード (special nodes) • ZEND_AST_ZVAL – zval を包含するノード – リテラル や 変数名、呼び出し関数名等 – 常にリーフ • ZEND_AST_ZNODE – 構文解析の過程では一切利用されない – コンパイル時に一時的に使われる – あまり詳しく追ってない
  14. 14. 定義ノード (declaration nodes) • doc_comment を保持 • 常に4つの子ノードを確保 (NULL の場合もある) • ZEND_AST_FUNC_DECL 関数定義 • ZEND_AST_CLOSURE 無名関数定義 • ZEND_AST_METHOD メソッド定義 • ZEND_AST_CLASS クラス、無名クラス、 インタフェース、トレイト定義
  15. 15. リストノード (list nodes) • 配下に複数のノードを格納するノード • ZEND_AST_STMT ステートメントを格納(ASTのROOT) • ZEND_AST_IF if文の各条件とブロックを格納 • ZEND_AST_ARRAY 配列 • その他、 ZEND_AST_ARG_LIST 等 “,” を 使って列挙するところは大体ここに分類
  16. 16. 通常ノード(standard nodes) • 0 child nodes – ZEND_AST_MAGIC_CONST / ZEND_AST_TYPE – __LINE__ とか / callable とか • 1 child nodes – 変数、定数、キャスト、単項演算子 等 • 2 child nodes – 配列の要素参照、関数呼び出し、代入、2項演算子、new など • 3 child nodes – メソッド呼び出し、プロパティ定義、3項演算子 など • 4 child nodes – ZEND_AST_FOR / ZEND_AST_FOREACH – for (1, 2, 3) { 4 } / foreach (1 as 2 => 3) {4}
  17. 17. 専用のメモリ領域 • CG(ast_arena) • 初期サイズは32MB • 構文解析前に確保 (zend_arena_create) • OPCODE生成後に破棄 (zend_arena_destroy) zend_ast_create_* zend_ast_alloc(size) zend_arena_alloc( &CG(ast_arena), size)
  18. 18. AST Hook Function • AST構築直後 (OPCODE 生成前)に呼ばれる • AST そのものが渡される -> 改変可能 • 将来的には、このフックポイントを利用した、最 適化やフィルタを行う拡張が生まれるのでは • https://wiki.php.net/rfc/parser- extension-api typedef void (*zend_ast_process_t)(zend_ast *ast); extern ZEND_API zend_ast_process_t zend_ast_process;
  19. 19. nikic/php-ast https://github.com/nikic/php-ast
  20. 20. do-aki/phpast https://github.com/do-aki/phpast
  21. 21. DEMO
  22. 22. Hello world function hello() { echo 'hello wporld'; }
  23. 23. FizzBuzz for ($i = 1; $i <= 100; $i++) { if ($i % 3 == 0 && $i % 5 == 0) { echo 'FizzBuzz'; } elseif ($i % 5 == 0) { echo 'Buzz'; } elseif ($i % 3 == 0) { echo 'Fizz'; } else { echo $i; } echo PHP_EOL; }
  24. 24. any question?
  25. 25. (blank)
  26. 26. 字句解析器の状態 (全10状態) • 初期状態 (INITIAL) • PHP Script (ST_IN_SCRIPTING) • 文字列解析のための状態 – ST_DOUBLE_QUOTES – ST_BACKQUOTE – ST_HEREDOC – ST_END_HEREDOC – ST_NOWDOC – ST_LOOKING_FOR_VARNAME (${) • プロパティ参照解析のための状態 – ST_LOOKING_FOR_PROPERTY ($xxx->) • 配列要素参照解析のための状態 – ST_VAR_OFFSET

×