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.

オレオレPHPのつくり方

9,536 views

Published on

第4回 闇PHP勉強会の資料です

Published in: Technology
  • Be the first to comment

オレオレPHPのつくり方

  1. 1. オレオレPPHHPPの つくりかた @@rrsskkyy 22001133..0033..0022 第44回闇PPHHPP勉強会
  2. 2. 自己紹介関山 隆介 ((TTwwiitttteerr @@rrsskkyy))主な使用言語は PPHHPP,, CC,, OObbjjeeccttiivvee--CC,, JJaavvaaSSccrriippttPPHHPPの改造が生業趣味です画像処理とか圧縮アルゴリズムとかに興味あ�ります
  3. 3. アジェンダPPHHPPスクリプトのコンパイルと実行についてざっくりと。実際にPPHHPPを改造したソースコードを題材に、PPHHPPを改造して構文を追加する方法を紹介します。GGiittHHuubbで本家pphhpp--ssrrccをffoorrkk。hhttttppss::////ggiitthhuubb..ccoomm//rrsskkyy//pphhpp--ssrrcc
  4. 4. PPHHPPのコンパイルと実行
  5. 5. コンパイルと実行PPHHPPスクリプトのコンパイルおよび実行は関数ポインタの呼び出しで行われている。 zzeenndd__ccoommppiillee__ffiilleezzeenndd__ccoommppiillee__ssttrriinnggzzeenndd__eexxeeccuuttee
  6. 6. コンパイル字句解析してソースコードをトークンに分解しつつ、構文解析してバイトコードを生成する。字句解析器:: zzeenndd__llaanngguuaaggee__ssccaannnneerr..cc構文解析器:: zzeenndd__llaanngguuaaggee__ppaarrsseerr..cc→これらを書き換えれば、新たなリテラルや構文を追加できる!
  7. 7. コンパイル
  8. 8. 実行バイトコードを走査しつつ、命令((ooppccooddee))に応じたコールバック関数を呼び出す。ooppccooddeeとコールバック関数は zzeenndd__vvmm__ddeeff..hh で定義されている。→これを書き換えれば、PPHHPPの挙動を変えられる。
  9. 9. 仮想機械生成
  10. 10. PPHHPPを改造してみよう
  11. 11. PPHHPPを改造するのに 必要なものCC言語の知識 ZZeenndd EEnnggiinnee 独特の作法もYYAACCCCの知識 ((なくてもOOKK))折れない心PPHHPP愛
  12. 12. uunnttiill//uunnlleessss構文
  13. 13. uunnttiill//uunnlleessss構文PPeerrllのまね。uunnlleessss (($$eexxpprr)) {{ ...... }} iiff文の逆で、条件式が偽のとき ブロックを評価する。uunnttiill (($$eexxpprr)) {{ ...... }}ddoo {{ ...... }} uunnttiill (($$eexxpprr));;
  14. 14. uunnttiill//uunnlleessssで やること字句解析器にトークンを追加 “uunnlleessss”→ TT__UUNNLLEESSSS “uunnttiill”→ TT__UUNNTTIILL構文解析器に TT__UUNNLLEESSSS//TT__UUNNTTIILLに対応する処理を追加。実行部((VVMM))は変更の必要なし。
  15. 15. SSccaallaa風のミックスイン
  16. 16. ミックスイン構文SSccaallaaの nneeww AA wwiitthh BB のまね。$$oobbjj == nneeww AA uussee BB;;$$oobbjj == nneeww AA uussee ((BB,, CC));; 構文解析の都合で、括弧なしで uussee BB,, CC と書けるようにするのは難しかった。$$oobbjj == nneeww AA uussee $$xx;;
  17. 17. ミックスイン構文で やること字句解析器は変更の必要なし。構文解析器に nneeww AA uussee BB に対応する処理を追加。ミックスインに対応するooppccooddee定義とコールバック関数を追加。
  18. 18. 改造PPHHPPのビルドに 必要なツールコンパイラの再生成に rree22cc と BBiissoonn が、GGiittで取得したソースコードからのビルドには GGNNUU AAuuttoottoooollss が必要です。hhttttpp::////ddooccss..pphhpp..nneett//mmaannuuaall//jjaa//iinnssttaallll..uunniixx..pphhpp
  19. 19. 改造PPHHPPをビルドする$ cd Zend$ php zend_vm_gen.php$ cd ..$ ./buildconf --force$ ./configure$ make
  20. 20. 質問タイム
  21. 21. ご静聴 あ�りがとうございました

×