PHP 8は、Just In Time(JIT)コンパイラと多数の言語機能を新たに加えた、PHPのメジャーアップデートである。InfoQは今回、PHPおよびPHP 8が今日の言語環境において果たす役割についての理解を深めるべく、SentryのプリンシパルデベロッパであるMark Story氏に話を聞いた。
間違いなく最も待ち望まれていた機能のひとつであるPHP JITは、DynASM(Dynamic Assembler for code generation engines)を使ってPHPバイトコードからネイティブコードを生成することによる、PHPのパフォーマンス向上を目的とした機能だ。CPU集約型コードの実行に関して言えば、PHP 8は、PHP JITによって以前のバージョンよりもはるかに高速になった。しかしながら、ネットワークパフォーマンスやデータベースアクセスなど、他のファクタが重要な役割を果たすWordpressなどの実際のアプリケーションでは、これがパフォーマンス改善に必ずしも転化される訳ではない。
言語面に目を向ければ、PHP 8には、型システムを改善して言語をより"モダン"なものにすることを目的とした、多数の新機能が含まれている。関数シグネチャ内で共用(union)型が使用可能になったこと、switch
を安全なセマンティクスで置き換え可能なmatch
式、バグや期待しない動作の頻繁な原因を取り除くための文字列と数値の比較に関する改善、位置ではなく名前によって関数に引数を渡すことが可能な名前付き引数、オブジェクトを保持しないマップの生成を可能にするweak mapなどがその内容だ。
InfoQは今回、アプリケーション監視企業SentryのプリンシパルデベロッパであるMark Story氏と話す機会を得て、PHPおよびPHP 8が今日の言語環境において果たす役割についての理解を深めることができた。
InfoQ: 2020年の今、なぜ、まだPHP 8を使う必要があるのでしょうか、ご意見を聞かせてください。
Story: PHPは現在でも、WebアプリケーションやAPIサーバの有力な選択肢のひとつなのです。手軽に始められることや、強力かつ完成度の高いフレームワークやライブラリを活用して、プロダクトを短期間で提供できることは、PHPの変わらないメリットです。それ以降、チーム組織が大きくなった時でも、PHPは人材が豊富なので、経験を積んだ開発者を探すことも、他の新しい言語や斬新なプラットフォームより簡単です。
PHPが2020年でも有用であると考えるもうひとつの理由は、PHPチームが7.xリリースのシリーズを通じて提供した、継続的な進化とパフォーマンスの向上です。リリース毎にPHPの"悪い部分"が改良されていく一方で、パフォーマンスや使い勝手、型安全性も改善されています。PHPは数多くの成功企業を支えてきた、実戦でテストされたテクノロジです。Facebook、Esty、Slackなどの企業や、Wikipediaなどのプロジェクトは、すべてPHPからスタートしています。
InfoQ: PHPを、より"モダン"なWeb開発用プログラミング言語と比較した場合、どう思いますか?
Story: PHPは多くの点で、"モダン"なサーバ環境がどうあるべきかについての基準を定めるために一役買っています。その他のプラットフォームは、PHPに組み込まれている"シェアードナッシング"アーキテクチャを提供するために多大な労力を払っています。PHPはまた、クラス最高の水平スケーラビリティを提供しています。スレッディングと共有メモリがないことから、PHPは、水平方向のスケーリングを可能にするための適切な設定を可能にしてくれます。より多くのトラフィックを処理する必要があれば、Webサーバをフリートに追加すればよいのです。
PHPを他の言語と比較するならば、動的なインタプリタ言語と比べることが大切です。GoやRustのようなコンパイル言語は、PHPよりもパフォーマンスが大幅に優れているでしょう。コンパイル言語と比較した場合のトレードオフは、作業の立ち上がりや新たな機能を構築する場合に開発スピードが落ちることが多い、という点です。
InfoQ: PHP 8で最も魅力的な新機能は何だと思われますか?
Story: 個人的には、名前付きパラメータの追加や、null安全オペレータやmatch式といった人間工学的な改善がPHP 8の最大のセールスポイントだと思います。共用型は、PHPをより完全な型システムを持った言語に近付ける上で望ましいものだと思います。また、人間工学的な改善は、コードの可読性を向上させることから、PHPがより使いやすい言語になります。名前付きパラメータはPythonのキーワード引数"kwargs"にヒントを得たもので、必要なパラメータ、あるいはデフォルト以外の値の必要なパラメータのみを定義すればよくなります。パラメータ名が関数呼び出し手続きの一部になるので、コードの可読性も向上します。setcookie()の第5パラメータは何かを調べる必要はもうありません。パラメータ名と必要な値のみを覚えていればよいのです。
match式とnull安全演算子はRustやJavaScriptから拝借したもので、表現力の豊かなコードが可能になることによって、一般的に使用されるパターンの実装が簡単にできるようになります。
InfoQ: PHP 8で実現して欲しかった機能は何ですか?
Story: 共用型だけでなく、交差(intersection)型もあれば、と思いますね。この2つがあれば静的解析が可能になりますし、PHPランタイムもより型安全になります。
PHP 8には後方互換性のない変更も含まれているため、コードベースの清廉性の度合によっては開発者の足をすくう可能性もある。
この新PHPの全容に関心があるのであれば、公式発表をぜひ確認してほしい。