狠狠撸

狠狠撸Share a Scribd company logo
オレオレ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を
改造してみよう
笔笔贬贬笔笔を改造するのに
      必要なもの
CC言語の知識
 ZZeenndd	 	 EEnnggiinnee	 	 独特の作法も
YYAACCCCの知識	 	 ((なくてもOOKK))
折れない心

PPHHPP愛
耻耻苍苍迟迟颈颈濒濒//耻耻苍苍濒濒别别蝉蝉蝉蝉构文
耻耻苍苍迟迟颈颈濒濒//耻耻苍苍濒濒别别蝉蝉蝉蝉构文
PPeerrllのまね。
uunnlleessss	 	 (($$eexxpprr))	 	 {{	 	 ......	 	 }}
   iiff文の逆で、条件式が偽のとき
   ブロックを評価する。
uunnttiill	 	 (($$eexxpprr))	 	 {{	 	 ......	 	 }}
ddoo	 	 {{	 	 ......	 	 }}	 	 uunnttiill	 	 (($$eexxpprr));;
耻耻苍苍迟迟颈颈濒濒//耻耻苍苍濒濒别别蝉蝉蝉蝉で
          やること
字句解析器にトークンを追加
  “uunnlleessss”→	 	 TT__UUNNLLEESSSS
  “uunnttiill”→	 	 TT__UUNNTTIILL
構文解析器に	 	 TT__UUNNLLEESSSS//TT__UUNNTTIILLに
対応する処理を追加。
実行部((VVMM))は変更の必要なし。
厂厂肠肠补补濒濒补补风のミックスイン
ミックスイン構文
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

オレオレ笔贬笔のつくり方