Suche senden
Hochladen
php7's ast
•
Als PPTX, PDF herunterladen
•
3 gefällt mir
•
9,125 views
do_aki
Folgen
第六回闇PHP勉強会
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 27
Jetzt herunterladen
Empfohlen
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
do_aki
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
php-src の歩き方
php-src の歩き方
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
Php in ruby
Php in ruby
do_aki
OPcache の最適化器の今
OPcache の最適化器の今
y-uti
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
charsbar
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
Empfohlen
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
do_aki
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
php-src の歩き方
php-src の歩き方
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
Php in ruby
Php in ruby
do_aki
OPcache の最適化器の今
OPcache の最適化器の今
y-uti
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
charsbar
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
最近の PHP の話
最近の PHP の話
y-uti
2017年夏のPerl
2017年夏のPerl
charsbar
How to debug a perl script using gdb
How to debug a perl script using gdb
akirahiguchi
PHPとシグナル、その裏側
PHPとシグナル、その裏側
do_aki
CMSとPerlで遊ぼう
CMSとPerlで遊ぼう
Daiki Ichinose
OSS開発勉強会-10
OSS開発勉強会-10
Kohei KaiGai
PHPの今とこれから2014
PHPの今とこれから2014
Rui Hirokawa
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
ELFの動的リンク
ELFの動的リンク
7shi
PECL を数えてみた
PECL を数えてみた
y-uti
2017年春のPerl
2017年春のPerl
charsbar
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
Local php-100828 2
Local php-100828 2
Akio Ishida
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
Kenichirou Oyama
PHPの今とこれから 2013
PHPの今とこれから 2013
Rui Hirokawa
WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hiroaki Murayama
HHVM Hack
HHVM Hack
Masaaki Yonebayashi
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
uchan_nos
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
詳説ぺちぺち
詳説ぺちぺち
do_aki
Writing php extensions in golang
Writing php extensions in golang
do_aki
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
Weitere ähnliche Inhalte
Was ist angesagt?
最近の PHP の話
最近の PHP の話
y-uti
2017年夏のPerl
2017年夏のPerl
charsbar
How to debug a perl script using gdb
How to debug a perl script using gdb
akirahiguchi
PHPとシグナル、その裏側
PHPとシグナル、その裏側
do_aki
CMSとPerlで遊ぼう
CMSとPerlで遊ぼう
Daiki Ichinose
OSS開発勉強会-10
OSS開発勉強会-10
Kohei KaiGai
PHPの今とこれから2014
PHPの今とこれから2014
Rui Hirokawa
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
ELFの動的リンク
ELFの動的リンク
7shi
PECL を数えてみた
PECL を数えてみた
y-uti
2017年春のPerl
2017年春のPerl
charsbar
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
Local php-100828 2
Local php-100828 2
Akio Ishida
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
Kenichirou Oyama
PHPの今とこれから 2013
PHPの今とこれから 2013
Rui Hirokawa
WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hiroaki Murayama
HHVM Hack
HHVM Hack
Masaaki Yonebayashi
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
uchan_nos
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
詳説ぺちぺち
詳説ぺちぺち
do_aki
Was ist angesagt?
(20)
最近の PHP の話
最近の PHP の話
2017年夏のPerl
2017年夏のPerl
How to debug a perl script using gdb
How to debug a perl script using gdb
PHPとシグナル、その裏側
PHPとシグナル、その裏側
CMSとPerlで遊ぼう
CMSとPerlで遊ぼう
OSS開発勉強会-10
OSS開発勉強会-10
PHPの今とこれから2014
PHPの今とこれから2014
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
ELFの動的リンク
ELFの動的リンク
PECL を数えてみた
PECL を数えてみた
2017年春のPerl
2017年春のPerl
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
Local php-100828 2
Local php-100828 2
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
PHPの今とこれから 2013
PHPの今とこれから 2013
WebAPIではじめるphp入門
WebAPIではじめるphp入門
HHVM Hack
HHVM Hack
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
Hack/HHVM 入門
Hack/HHVM 入門
詳説ぺちぺち
詳説ぺちぺち
Andere mochten auch
Writing php extensions in golang
Writing php extensions in golang
do_aki
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
Akishige TAKEKOSHI
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
do_aki
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
Satoru Yoshida
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
Yoshio Hanawa
PHPNGの動向
PHPNGの動向
Yoshio Hanawa
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Yoshio Hanawa
Laungage Update PHP編
Laungage Update PHP編
Yoshio Hanawa
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
Yoshio Hanawa
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
Yoshio Hanawa
PHP7はなぜ速いのか
PHP7はなぜ速いのか
Yoshio Hanawa
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
Yoshio Hanawa
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
20141011 mastering mysqlnd
20141011 mastering mysqlnd
do_aki
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
kuroneko1988
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
Yoshio Hanawa
Andere mochten auch
(20)
Writing php extensions in golang
Writing php extensions in golang
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
PHPNGの動向
PHPNGの動向
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Laungage Update PHP編
Laungage Update PHP編
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
PHP7はなぜ速いのか
PHP7はなぜ速いのか
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
20141011 mastering mysqlnd
20141011 mastering mysqlnd
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
Ähnlich wie php7's ast
Php5.4
Php5.4
ke-m kamekoopa
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
Java8から17へ
Java8から17へ
onozaty
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Noritada Shimizu
Racc でおてがる構文解析
Racc でおてがる構文解析
morphine57
Lisp batton - Common LISP
Lisp batton - Common LISP
Masaomi CHIBA
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
icchy
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
Jun Ohtani
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
Perl io layer
Perl io layer
Hiroko Suzuki
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
Write good parser in perl
Write good parser in perl
Jiro Nishiguchi
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
Buffer overflow
Buffer overflow
ionis111
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
Boost Fusion Library
Boost Fusion Library
Akira Takahashi
Ähnlich wie php7's ast
(20)
Php5.4
Php5.4
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
Java8から17へ
Java8から17へ
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Racc でおてがる構文解析
Racc でおてがる構文解析
Lisp batton - Common LISP
Lisp batton - Common LISP
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
What is Metasepi?
What is Metasepi?
Perl io layer
Perl io layer
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Write good parser in perl
Write good parser in perl
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Buffer overflow
Buffer overflow
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Boost Fusion Library
Boost Fusion Library
Mehr von do_aki
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
do_aki
再考:列挙型
再考:列挙型
do_aki
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
do_aki
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
20141017 introduce razor
20141017 introduce razor
do_aki
php in ruby
php in ruby
do_aki
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
N:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
Php radomize
Php radomize
do_aki
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
Immortal
Immortal
do_aki
Excel is image viewer
Excel is image viewer
do_aki
A bridge between php and ruby
A bridge between php and ruby
do_aki
Ruby and comparison_and...php
Ruby and comparison_and...php
do_aki
Sore php
Sore php
do_aki
Ruby enumerable source code reading
Ruby enumerable source code reading
do_aki
続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方
do_aki
Mod lua
Mod lua
do_aki
Mehr von do_aki
(18)
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
再考:列挙型
再考:列挙型
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
20141017 introduce razor
20141017 introduce razor
php in ruby
php in ruby
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
N:1 Replication meets MHA
N:1 Replication meets MHA
Php radomize
Php radomize
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
Immortal
Immortal
Excel is image viewer
Excel is image viewer
A bridge between php and ruby
A bridge between php and ruby
Ruby and comparison_and...php
Ruby and comparison_and...php
Sore php
Sore php
Ruby enumerable source code reading
Ruby enumerable source code reading
続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方
Mod lua
Mod lua
Kürzlich hochgeladen
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
Kürzlich hochgeladen
(8)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
php7's ast
1.
php7’s ast 2015/11/22 第六回闇PHP勉強会 do_aki
2.
@do_aki @do_aki http://do-aki.net/
3.
4.
コンパイルプロセス(教科書的) 字句 解析 構文 解析 最適化 コード 生成
5.
字句解析 • ソースコードをトークンに分解 • トークン
:= 意味を持つ最小単位 <?php function hello ( ) { echo ‘HELLO WORLD’ ; }
6.
字句解析 • ソースコードをトークンに分解 • トークン
:= 意味を持つ最小単位 <?php function hello ( ) { echo ‘HELLO WORLD’ ; } T_OPEN_TAG T_FUNCTION T_STRING ( ) { } T_ECHO T_CONSTANT _ENCAPSED_STRING ;
7.
構文解析 • トークン列から規則(文法)を導く function hello
( ) { echo ‘HELLO WORLD’ ; } T_FUNCTION T_STRING ( ) { } T_ECHO T_CONSTANT _ENCAPSED_STRING ;inner_statement_list 関数定義
8.
php5 の コンパイルプロセス 字句解析
構文解析+コード生成 php7 の コンパイルプロセス 字句解析 構文解析 コード生成 zendlex -> TOKEN zendparse -> OPCODE zendlex -> TOKEN zendparse -> AST zend_compile_stmt -> OPCODE
9.
php5 の コンパイルプロセス 字句解析
構文解析+コード生成 php7 の コンパイルプロセス 字句解析 構文解析 コード生成 zendlex -> TOKEN zendparse -> OPCODE zendlex -> TOKEN zendparse -> AST zend_compile_stmt -> OPCODE 構文解析で AST を構築し、 AST から OPCODE を生成
10.
導入理由 コンパイラおよびパーサのメンテナンス 性向上 (技巧的なコードの排除) 技術的な問題により、導入が困難であっ た文法を扱えるようになる
11.
PHP の AST
12.
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 より 一部見やすさのために改変
13.
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 など
14.
特殊ノード (special nodes) •
ZEND_AST_ZVAL – zval を包含するノード – リテラル や 変数名、呼び出し関数名等 – 常にリーフ • ZEND_AST_ZNODE – 構文解析の過程では一切利用されない – コンパイル時に一時的に使われる – あまり詳しく追ってない
15.
定義ノード (declaration nodes) •
doc_comment を保持 • 常に4つの子ノードを確保 (NULL の場合もある) • ZEND_AST_FUNC_DECL 関数定義 • ZEND_AST_CLOSURE 無名関数定義 • ZEND_AST_METHOD メソッド定義 • ZEND_AST_CLASS クラス、無名クラス、 インタフェース、トレイト定義
16.
リストノード (list nodes) •
配下に複数のノードを格納するノード • ZEND_AST_STMT ステートメントを格納(ASTのROOT) • ZEND_AST_IF if文の各条件とブロックを格納 • ZEND_AST_ARRAY 配列 • その他、 ZEND_AST_ARG_LIST 等 “,” を 使って列挙するところは大体ここに分類
17.
通常ノード(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}
18.
専用のメモリ領域 • 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)
19.
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;
20.
nikic/php-ast https://github.com/nikic/php-ast
21.
do-aki/phpast https://github.com/do-aki/phpast
22.
DEMO
23.
Hello world function hello()
{ echo 'hello wporld'; }
24.
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; }
25.
any question?
26.
(blank)
27.
字句解析器の状態 (全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
Hinweis der Redaktion
ほかにも zval, list, decl といった構造体もあるが、 kind, attr を持ち、lineno を包含し、 0以上の子ノードを持つ というのは同じ
Jetzt herunterladen