Page 1
Analyzing PHP
pixiv Inc.
USAMI Kenta
2023-08-30 TechFeed Expert Night
公開日:
by USAMI Kenta@tadsan
にオンラインのYouTube Liveで開催された『TechFeed Experts Night#24 〜 プログラミング言語をつくる・解析する ー 言語界隈をエキスパートが語る』で10分枠として発表しました。
2023-08-30 TechFeed Expert Night
お前誰よ
PHPってどんな言語?
みなさんの想像するPHPとは
脆弱性 ゆるふわ 弱い型 動的クソザコ 型なし 意味不明 弱い自動変換 貧弱 Perlっぽい 適当
PHPについてのパブリックイメージ
脆弱性 ゆるふわ 弱い型 動的クソザコ 型なし 意味不明 弱い自動変換 貧弱 Perlっぽい 適当
PHPについての認識は概ね間違い
ソースコードで見ると
<!DOCTYPE html><html><head><title>Hello, PHP!</title></head><p><?php if (date('H') < 19): ?>こんにちは<?php else: ?>こんばんは<?php endif; ?></p><p>今は<?= htmlspecialchars(date('H')) ?>時です</p>
<?php require 'bootstrap.php';$db = mysqli_connect();$stmt = mysqli_prepare($db, 'SELECT * FROM books');mysqli_stmt_execute($stmt);print '<h1>本の一覧</h1>';print '<ul>';foreach ($stmt as $s) {print '<li>'; print $s->name; print '</li>';}print '</ul>';
<?php declare(strict_types=1);namespace Foo\Http\Controller;
class BooksController extends BaseController {public function index() {$books = Books::getAll();
$this->render(compact("books"));}}
“We have things like protected properties.We have abstract methods. We have all this stuff that your computer science teacher told you you should be using.I don't care about this crap at all.”–Rasmus Lerdorf https://en.wikiquote.org/wiki/Rasmus_Lerdorf
“PHPにはprotectedプロパティも抽象メソッドもありますよ。計算機科学の教授が「使え」と言ってるものは全部。そんなことはクソ興味ないですけど”–Rasmus Lerdorf (tadsanによる超訳)
変数に$があってPerlっぽくて
C言語っぽい関数と-> があって
雰囲気Javaっぽいオブジェクト指向で
use DBI;
$db = DBI->connect('...');$stmt = $db->prepare('SELECT * FROM books');$stmt->execute;print '<h1>本の一覧</h1>'; print '<ul>';for ($i = 0; $I < $sth->rows; $i++) {@row = $sth->fetchrow_array;print '<li>'; print $row[0]; print '</li>';}print '</ul>';
<?php require 'bootstrap.php';$db = mysqli_connect();$stmt = mysqli_prepare($db, 'SELECT * FROM books');mysqli_stmt_execute($stmt);print '<h1>本の一覧</h1>';print '<ul>';foreach ($stmt as $s) {print '<li>'; print $s->name; print '</li>';}print '</ul>';
言語としてのPHP
PHPの実行フロー
自分のことをCPUだと思い込んだ象
オペコード
<?php
echo 1;
ECHO 1
<?php
echo 'foo';
ECHO 'foo'
<?php
print 'foo';
ECHO 'foo'
<?php
echo 1 + 2;
ECHO 3
<?php$a = 1;echo $a + 2;
ASSIGN !0, 1 ADD ~2 !0, 2 ECHO ~2
opcodeでおk
<?php echo "foo";
ECHO 'foo'
なんでこんなことするの
PHP高度な構文解析が必要な高級なシンタックス
opcode構文解析不要なシンプルな命令セット
分けて開発することで最適化しやすくなる
PHPと型宣言
実行時に確実にその型であることが保障される
PHPとDocComment型注釈
PhpStormのようなIDEや静的解析ツールなどが参照してくれる
保障されない型が書ける
静的解析しやすい特徴
PHPの進化は型宣言の進化
いまやPHPは静的型付きと言っても過言ではない(本当か…?)
function add($a, $b) {return $a + $b;}
int + intって本当にintなの?
function add(int $a, int $b): int {return $a + $b;}
ひとつの解決策ではあるが… 不必要にfloatを強制するのか
function add(float $a, float $b): float {return $a + $b;}
あえて型宣言を省略する
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
function add(int|float $a, int|float $b): int|float {return $a + $b;}
よく使われていた頃は「重厚鈍重なIDEが必要な言語」のアンチテーゼとしてシンプルなスクリプト言語とエディタが好まれていた (ように思う)
ディタでは開発のオーバーヘッドが無視しがたくなってきた
を提供してくれるようになった
PHPと静的解析
型システムや変数スコープを正確に扱えるツールが開発され始めた
PHPStanとは
高速な解析を実現していた
PHPStanの提供する型
PHP処理系
受け付けてくれる
PHPの開発体制
EmacsとPHP
最近のEmacs
php-ts-mode
それほど簡単ではなかった
9月後半にリリースすることを目標に準備しています
