Skip to content

『えこひいき』される関数たち

公開日:

東京都渋谷区道玄坂GMO Yours フクラスで開催された『第147回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

『えこひいき』される関数たち

Functions Specialized by Zend Engine

pixiv Inc.

USAMI Kenta

2022-12-20 PHP勉強会@東京

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 エンジニア
  • 最近はピクシブ百科事典(dic.pixiv.net)を開発しています
  • Emacs Lisper, PHPer
  • Emacs PHP Modeを開発しています (2017年-)

Page 3

さて

Page 4

Page 5

Page 6

Zend Engineってなあに

Page 7

Page 8

仮想機械?

Page 9

Page 10

Page 11

I am CPU.

Page 12

つまり?

Page 13

自分のことをCPUだと思い込んだ象

Page 14

CPUの言葉でしゃべれ

Page 15

Zend Engine

オペコード

opcode

Page 16

PHPはオペコードにコンパイルされる

<?php

echo 1;

ECHO 1

Page 17

PHPはオペコードにコンパイルされる

<?php

echo 'foo';

ECHO 'foo'

Page 18

PHPはオペコードにコンパイルされる

<?php

print 'foo';

ECHO 'foo'

Page 19

PHPはオペコードにコンパイルされる

<?php

echo 1 + 2;

ECHO 3

Page 20

PHPはオペコードにコンパイルされる

<?php$a = 1;echo $a + 2;

ASSIGN !0, 1 ADD ~2 !0, 2 ECHO ~2

Page 21

opcodeでおk

<?php echo "foo";

ECHO 'foo'

Page 22

なんでこんなことするの

Page 23

PHP高度な構文解析が必要な高級なシンタックス

Page 24

opcode構文解析不要なシンプルな命令セット

Page 25

分けて開発することで最適化しやすくなる

Page 26

これを極めればパフォーマンス改善に役立つのか?

Page 27

Page 28

ここまでが前振り

Page 29

関数呼び出し

<?php

var_dump("foo");

INIT_FCALL 'var_dump'SEND_VAL 'foo'DO_ICALL

Page 30

関数呼び出しは関数呼び出しに

Page 31

なるとは限らない

Page 32

!?

関数呼び出し

<?php

echo is_int('foo');

TYPE_CHECK 16 ~0 'foo'ECHO ~0

Page 33

!?

関数呼び出し

<?php

ECHO 3

echo strlen('foo');

Page 34

まとめ

Page 35

『えこひいき』とは何だったのか

  • PHPの処理系の心臓部は“Zend Engine”と呼ばれる仮想機械
  • 実行時にOPCode(Zend Engineのマシン語)にコンパイルする
  • 現代的なスクリプト言語はほとんど同じような構造になっている
  • PHPコードはOPCodeにコンパイルされるが一対一で変換されず、

一部の関数呼び出しは特別な最適化が施される

  • 一般的なアプリケーションではあまりパフォーマンスに寄与しないかも