SlideShare a Scribd company logo
1 of 21
Download to read offline
オレオレPPHHPPの
 つくりかた
              @@rrsskkyy
 22001133..0033..0022	 	 第44回闇PPHHPP勉強会
自己紹介
関山	 	 隆介	 	 ((TTwwiitttteerr	 	 @@rrsskkyy))
主な使用言語は	 	 PPHHPP,,	 	 CC,,	 	 
OObbjjeeccttiivvee--CC,,	 	 JJaavvaaSSccrriipptt
PPHHPPの改造が生業趣味です
画像処理とか圧縮アルゴリズムと
かに興味あ�ります
アジェンダ
PPHHPPスクリプトのコンパイルと実
行についてざっくりと。
実際にPPHHPPを改造したソースコー
ドを題材に、PPHHPPを改造して構文
を追加する方法を紹介します。
GGiittHHuubbで本家pphhpp--ssrrccをffoorrkk。
hhttttppss::////ggiitthhuubb..ccoomm//rrsskkyy//pphhpp--ssrrcc
PPHHPPの
コンパイルと実行
コンパイルと実行
PPHHPPスクリプトのコンパイルおよ
び実行は関数ポインタの呼び出し
で行われている。	 	 
zzeenndd__ccoommppiillee__ffiillee
zzeenndd__ccoommppiillee__ssttrriinngg
zzeenndd__eexxeeccuuttee
コンパイル
字句解析してソースコードをトー
クンに分解しつつ、構文解析して
バイトコードを生成する。
字句解析器::	 	 zzeenndd__llaanngguuaaggee__ssccaannnneerr..cc
構文解析器::	 	 zzeenndd__llaanngguuaaggee__ppaarrsseerr..cc

→これらを書き換えれば、新たな
リテラルや構文を追加できる!
コンパイル
実行
バイトコードを走査しつつ、命令
((ooppccooddee))に応じたコールバック
関数を呼び出す。
ooppccooddeeとコールバック関数は	 	 
zzeenndd__vvmm__ddeeff..hh	 	 で定義されている。

→これを書き換えれば、PPHHPPの挙
動を変えられる。
仮想機械生成
PPHHPPを
改造してみよう
PPHHPPを改造するのに
      必要なもの
CC言語の知識
 ZZeenndd	 	 EEnnggiinnee	 	 独特の作法も
YYAACCCCの知識	 	 ((なくてもOOKK))
折れない心

PPHHPP愛
uunnttiill//uunnlleessss構文
uunnttiill//uunnlleessss構文
PPeerrllのまね。
uunnlleessss	 	 (($$eexxpprr))	 	 {{	 	 ......	 	 }}
   iiff文の逆で、条件式が偽のとき
   ブロックを評価する。
uunnttiill	 	 (($$eexxpprr))	 	 {{	 	 ......	 	 }}
ddoo	 	 {{	 	 ......	 	 }}	 	 uunnttiill	 	 (($$eexxpprr));;
uunnttiill//uunnlleessssで
          やること
字句解析器にトークンを追加
  “uunnlleessss”→	 	 TT__UUNNLLEESSSS
  “uunnttiill”→	 	 TT__UUNNTTIILL
構文解析器に	 	 TT__UUNNLLEESSSS//TT__UUNNTTIILLに
対応する処理を追加。
実行部((VVMM))は変更の必要なし。
SSccaallaa風のミックスイン
ミックスイン構文
SSccaallaaの	 	 nneeww	 	 AA	 	 wwiitthh	 	 BB	 	 のまね。
$$oobbjj	 	 ==	 	 nneeww	 	 AA	 	 uussee	 	 BB;;
$$oobbjj	 	 ==	 	 nneeww	 	 AA	 	 uussee	 	 ((BB,,	 	 CC));;
   構文解析の都合で、括弧なしで	 	 uussee	 	 BB,,	 	 CC	 	 
   と書けるようにするのは難しかった。

$$oobbjj	 	 ==	 	 nneeww	 	 AA	 	 uussee	 	 $$xx;;
ミックスイン構文で
   やること
字句解析器は変更の必要なし。
構文解析器に	 	 nneeww	 	 AA	 	 uussee	 	 BB	 	 に対応
する処理を追加。
ミックスインに対応するooppccooddee
定義とコールバック関数を追加。
改造PPHHPPのビルドに
  必要なツール
コンパイラの再生成に	 	 rree22cc	 	 と	 	 	 	 
BBiissoonn	 	 が、GGiittで取得したソース
コードからのビルドには	 	 GGNNUU	 	 
AAuuttoottoooollss	 	 が必要です。
hhttttpp::////ddooccss..pphhpp..nneett//mmaannuuaall//jjaa//
iinnssttaallll..uunniixx..pphhpp
改造PPHHPPをビルドする

$ cd Zend
$ php zend_vm_gen.php
$ cd ..
$ ./buildconf --force
$ ./configure
$ make
質問タイム
ご静聴
 あ�りがとう
ございました

More Related Content

What's hot

HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法Hiroaki Murayama
 
俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]Mitsuki Ogasahara
 
EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたkyon mm
 
setTimeout関数の楽しみ
setTimeout関数の楽しみsetTimeout関数の楽しみ
setTimeout関数の楽しみmtkn
 
Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17Takashi Kawachi
 
fluent-plugin-resque_stat
fluent-plugin-resque_statfluent-plugin-resque_stat
fluent-plugin-resque_statMakoto Haruyama
 
Coffeescriptを初めて使う方へ
Coffeescriptを初めて使う方へCoffeescriptを初めて使う方へ
Coffeescriptを初めて使う方へKoya Fukuda
 
OCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せOCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せSachirou Inoue
 
制約をつけて遊ぼう
制約をつけて遊ぼう制約をつけて遊ぼう
制約をつけて遊ぼうFumihito Yokoyama
 
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasualTakahiro Okumura
 
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェるPlay frameworkをエヴァンジェる
Play frameworkをエヴァンジェるke-m kamekoopa
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzzyy yank
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方浩平 渡邉
 
PHP Conference Kansai 2015
PHP Conference Kansai 2015PHP Conference Kansai 2015
PHP Conference Kansai 2015Yasuo Harada
 

What's hot (20)

MmapScanner
MmapScannerMmapScanner
MmapScanner
 
HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法
 
Acct v3 binary
Acct v3 binaryAcct v3 binary
Acct v3 binary
 
俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]
 
tnct.Seminar9.03#1
tnct.Seminar9.03#1tnct.Seminar9.03#1
tnct.Seminar9.03#1
 
EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べた
 
setTimeout関数の楽しみ
setTimeout関数の楽しみsetTimeout関数の楽しみ
setTimeout関数の楽しみ
 
Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17
 
fluent-plugin-resque_stat
fluent-plugin-resque_statfluent-plugin-resque_stat
fluent-plugin-resque_stat
 
Coffeescriptを初めて使う方へ
Coffeescriptを初めて使う方へCoffeescriptを初めて使う方へ
Coffeescriptを初めて使う方へ
 
OCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せOCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せ
 
制約をつけて遊ぼう
制約をつけて遊ぼう制約をつけて遊ぼう
制約をつけて遊ぼう
 
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
 
Of tutorials v4.0
Of tutorials v4.0Of tutorials v4.0
Of tutorials v4.0
 
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェるPlay frameworkをエヴァンジェる
Play frameworkをエヴァンジェる
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzz
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方
 
Of tutorials v1606+
Of tutorials v1606+Of tutorials v1606+
Of tutorials v1606+
 
Tmux
TmuxTmux
Tmux
 
PHP Conference Kansai 2015
PHP Conference Kansai 2015PHP Conference Kansai 2015
PHP Conference Kansai 2015
 

Viewers also liked

詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺちdo_aki
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門Ishibashi Ryosuke
 
Php radomize
Php radomizePhp radomize
Php radomizedo_aki
 
PHPエクステンションの開発tips
PHPエクステンションの開発tipsPHPエクステンションの開発tips
PHPエクステンションの開発tipsYoshio Hanawa
 
zval をダイエットしてみた
zval をダイエットしてみたzval をダイエットしてみた
zval をダイエットしてみたYoshio Hanawa
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎Hiroyuki Sugimoto
 
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策Akishige TAKEKOSHI
 
HashTable と HashDos
HashTable と HashDosHashTable と HashDos
HashTable と HashDosYuya Takeyama
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境Yo Ya
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会Yuji Otani
 
php7's ast
php7's astphp7's ast
php7's astdo_aki
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話Satoru Yoshida
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 

Viewers also liked (20)

詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
Php radomize
Php radomizePhp radomize
Php radomize
 
セキュアな育毛
セキュアな育毛セキュアな育毛
セキュアな育毛
 
PHPエクステンションの開発tips
PHPエクステンションの開発tipsPHPエクステンションの開発tips
PHPエクステンションの開発tips
 
zval をダイエットしてみた
zval をダイエットしてみたzval をダイエットしてみた
zval をダイエットしてみた
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎
 
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
 
HashTable と HashDos
HashTable と HashDosHashTable と HashDos
HashTable と HashDos
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
php7's ast
php7's astphp7's ast
php7's ast
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
PHP超入門@LL温泉
PHP超入門@LL温泉PHP超入門@LL温泉
PHP超入門@LL温泉
 

オレオレPHPのつくり方