SlideShare 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を
改造してみよう
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

PDF
8F Emacs seminar 1st
KEY
Emacs 使いが Vim を使ってみた(ちょっとだけGit)
PDF
fanscala1 1 インストールとreplまで
PDF
Rubyで和暦をよみとる
PPTX
Shell で制限付き並列処理をしよう
PDF
第6回鹿児島node.jsの会資料_内村
PDF
PDF
kvm-clock に時間を尋ねるのは 間違っているだろうか
8F Emacs seminar 1st
Emacs 使いが Vim を使ってみた(ちょっとだけGit)
fanscala1 1 インストールとreplまで
Rubyで和暦をよみとる
Shell で制限付き並列処理をしよう
第6回鹿児島node.jsの会資料_内村
kvm-clock に時間を尋ねるのは 間違っているだろうか

What's hot (20)

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

Viewers also liked (20)

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

オレオレPHPのつくり方