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

What's hot

HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法Hiroaki Murayama
 
俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]俺とMacとアダルトビデオ[社外版]
俺とMacとアダルトビデオ[社外版]Mitsuki Ogasahara
 
tnct.Seminar9.03#1
tnct.Seminar9.03#1tnct.Seminar9.03#1
tnct.Seminar9.03#1
Daichi Onodera
 
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事情〜 #monitoringcasual
Takahiro Okumura
 
Of tutorials v4.0
Of tutorials v4.0Of tutorials v4.0
Of tutorials v4.0
Etsuji Nomura
 
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェるPlay frameworkをエヴァンジェる
Play frameworkをエヴァンジェる
ke-m kamekoopa
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzz
yy yank
 
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+
Etsuji Nomura
 
Tmux
TmuxTmux
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 radomize
do_aki
 
セキュアな育毛
セキュアな育毛セキュアな育毛
セキュアな育毛
Ishibashi Ryosuke
 
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におけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
Yahoo!デベロッパーネットワーク
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
Yuji Otani
 
php7's ast
php7's astphp7's ast
php7's ast
do_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
 
PHP超入門@LL温泉
PHP超入門@LL温泉PHP超入門@LL温泉
PHP超入門@LL温泉
Sotaro Karasawa
 

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温泉
 

Recently uploaded

論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 

Recently uploaded (8)

論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 

オレオレPHPのつくり方