Skip to content

哲学

なぜpsalmはこうなのか?これは生きたドキュメントである!

PsalmはPHPで書かれたPHPのためのツールです。

利点

  • PHPはほとんどのユースケースで十分に高速である - PHPで書かれたツールは、PHPコミュニティのメンバーがそれほど苦労せずに貢献できることを保証する。

欠点

  • Psalmは非常に大きなモノレポ(チェックインされたコードが500万行以上)では遅い。- Psalmの言語サーバーは、同等のコンパイル言語ツールよりも提供できるものが限られている。例えば、あるシンボルを使用しているすべてのファイルにおいて、そのシンボルを入力するたびに、そのシンボルのすべての出現箇所を検索・変更することは不可能です。

他の言語やツールとの比較

多くの言語には、同じ言語で書かれたタイプチェッカ/コンパイラがあります。人気のある例としては、Go、Rust、TypeScriptなどがある。Pythonは特別なケースで、半公式のタイプチェッカーMyPy (Pythonで書かれている)もcompile to a C Python extension 、インタプリタ型の同等品より4倍速く実行できる。

インタプリタ型言語の中には、より高速なコンパイル言語で書かれた非公式なオープンソースのタイプチェッカーがあるものもある。どのような場合にも、一つの中規模から大規模の企業がそれぞれの取り組みの背後にあり、その企業に雇用されていない少数の貢献者がいる:

  • PHP -NoVerify - Goで書かれている。Psalmよりはるかに高速に動作する(ただし、最新のPHPの機能の多くはサポートされていない) - Ruby -Sorbet - Cで書かれている - Python -Pyre - OCamlで書かれている -Hack - タイプチェッカーはOCamlとRustで書かれている。

Psalmの主な目的はバグを見つけることである。

Psalmは多くの機能を持っているが、主にコードの潜在的なバグを見つけるために使われている。

その他の機能-言語サーバー、セキュリティ分析、コードの操作/修正-はすべて二次的な関心事です。

構文的に正しいコードで実行されるように設計されている

Psalmは、ほとんどの場合、リントチェック(php -l <filename>) を解析する PHP コード、つまり構文的に正しいコードで実行されます。Psalm は構文チェックの代わりではありません。

nikic/php-parser Psalm はほとんどの場合、構文的に正しいコードで使用されるため、 その目的のために構築されたパーサを使用する必要があります。

Psalmが構文的に正しくないコードで動作する必要がある場合(言語サーバーモードなど)、Psalmは同じパーサーを使用する必要があります(そして、そのパーサーが生成する問題を回避する必要があります)。

Docblockアノテーションは型提供プラグインよりも優れている

PsalmはプラグインAPIを提供しており、あなたのプログラムのプロパティ型、戻り値型、パラメータ型を指定することができます。

Psalmは、他の静的解析ツールとの共存を目指している。ユーザーがプラグインに頼れば頼るほど、他のツールがユーザーの意図を理解する機会は減っていく。

Psalmは、開発者が型を提供するプラグインではなく、docblockアノテーションを使用することを奨励すべきです。これはConditional Types 、Psalmが内部の型提供プラグインの一部を置き換えることを可能にする原動力となった。

ほとんどの場合、Psalmはdocblockアノテーションが正しいかどうかを検証することができますが、プラグインが使われている場合には多くの保証を提供することはできません。

これはプラグイン全体が悪いとか、プラグインが有用な型を提供できないという意味ではありません。プラグインを使用することで、Psalm型アノテーションを持たないライブラリのために Psalm型アノテーションを持つスタブを提供することができます。これはPHPのエコシステムを助けることになります。 なぜなら、それらのスタブが最終的には現在スタブになっているプロジェクトに入るかもしれないからです。

検証可能なDocblockアノテーションは、検証不可能なアノテーションよりも優れています。

Psalmは現在、検証できない多くの関数/クラスのdocblockアノテーションをサポートしています:

-@psalm-assert,@psalm-assert-if-true,@psalm-assert-if-false -@property,@method@mixin

新しいdocblockアノテーションが追加されるたびに、Psalmがその正しさを検証できるように努力する必要があります。

状況によっては、docblockアノテーションはPHP 8の属性よりも優れています。

静的解析ツールで利用することを目的とした情報については、 PHP 8 の属性よりも docblock の方が適しています。

その根拠はthis article にあります。

ユーザーノート