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

公開日:

東京都渋谷区道玄坂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; ASSIGN !0, 1


ADD ~2 !0, 2


echo $a + 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

INIT_FCALL 'var_dump' SEND_VAL 'foo'


var_dump("foo");

DO_ICALL

Page 30

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

Page 31

なるとは限らない

Page 32

!?

関数呼び出し

<?php

TYPE_CHECK 16 ~0 'foo'

echo
is_int('foo'); ECHO ~0

Page 33

!?

関数呼び出し

<?php

ECHO 3

echo
strlen('foo');

Page 34

まとめ

Page 35

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

  • PHPの処理系の心臓部は,Zend Engine5と呼ばれる仮想機械
    • 実行時にOPCode(Zend Engineのマシン語)にコンパイルする
    • 現代的なスクリプト言語はほとんど同じような構造になっている
  • PHPコードはOPCodeにコンパイルされるが一対一で変換されず、
    一部の関数呼び出しは特別な最適化が施される
  • 一般的なアプリケーションではあまりパフォーマンスに寄与しないかも