議論を取り巻く多くの強い意見がありますが、明らかにこれは実際には意見の問題ではなく、事実の問題です。それで、私たちは実証研究を見るべきです。そして、そこからの証拠は明らかです:
はい、静的型付けはトレードオフの価値があります-少しだけではなく、実際には実質的に。実際、静的な型付けにより、コード内のバグの数を少なくとも15%減らすことができるという確かな証拠があります(これは低い見積もりであり、実際の割合はほぼ確実に大きくなります)。それは驚くほど高い数字です。静的型付けのほとんどの支持者でさえ、このような劇的な違いを生んだとは思わなかったと思います。
これを考慮してください。プロジェクトのバグを一晩で15%削減する簡単な方法があると誰かが言ったら、それは簡単なはずです。1 それはほとんどことわざの銀の弾丸です。
この証拠は、論文「入力するか入力しないか:JavaScriptで検出可能なバグを定量化する」(Zheng Gao、Christian Bird、Earl T. Barr)に記載されています。私は誰もがそれを読むことを奨励します、それは模範的な研究を提示するよく書かれた論文です。
著者がどれだけ厳密に分析を行ったかを簡潔に要約することは困難ですが、ここに(非常に大まかな)アウトラインがあります:
TypeScriptとFlowは、JavaScriptに基づく2つのプログラミング言語であり、互換性は維持されますが、型ヒントと静的型チェックを追加します。これにより、タイプごとに既存のコードを拡張し、タイプチェックを行うことができます。
研究者は、GitHubからJavaScriptで記述されたオープンソースプロジェクトを収集し、解決されたバグレポートを調べ、報告された各バグをTypeScriptまたはFlowの静的型チェッカーによってキャッチされるコードに還元しようとしました。これにより、静的型付けを使用して修正できるバグの割合の下限を見積もることができました。
研究者は、厳密な予防措置を講じて、分析でタイプに関連しないバグがタイプに関連していると見なされないようにしました。2
過去の研究と比較して、この新しい研究には特定の長所があります。
- ある直接静的の比較対 JavaScriptや活字体/フローとの間の唯一の違いは、タイピングであるので(もしあれば)いくつかの交絡因子と動的型は、。
- TypeScriptとFlow(つまり、異なる型システム)の両方をチェックし、バグを修正するために(手動)型注釈を異なる人に再現させることにより、複数の次元でレプリケーションを実行します。そして、異なるプロジェクトの多数のコードベースでこれを実行します。
- このペーパーでは、静的なタイピングが修正可能なバグに与える直接的な影響を測定します(曖昧な品質ではありません)。
- 著者は、何をどのように事前に測定するかの厳密なモデルを定義します。さらに、それらの説明は信じられないほど明確であり、欠陥の分析を容易にします(研究論文が攻撃にさらされている場合、それは常に良いことです:攻撃がその議論をくつがえすことができなければ、それはさらに強力になります)。3
- サンプルサイズが十分になるように適切なパワー分析を実行し、その後の統計分析は気密になります。
- それらは交絡説明を除外するために過度に保守的であり、単一の可動部分のみを測定します。さらに、タイプを含めることですぐに修正可能なバグに分析を制限し、タイピングに対応するために高度なリファクタリングを必要とする可能性のあるものはすべて除外します。そのため、実際には、その効果はかなり大きくなりますが、彼らが報告したものよりも小さくありません。
- そして最後に、彼らはわずかな効果ではなく、驚くべき違いを見つけます。過度に保守的な手順にもかかわらず、95%の信頼区間の下限でも、最小限の型チェックを追加するだけで消滅するバグが少なくとも10%あることがわかります。
誰もまだ発見していない根本的な欠陥がない限り、この論文はほぼ無料で静的型付けの大きな利点を最終的に示します。4
歴史的なノートでは、プログラミングのタイピングに関する研究は、長い間、証拠がまったく明確ではなかったため、大きなスタートを切っています。この理由は、静的の効果を調べるために系統的な実験を行っていることをされた対動的型付けすることは容易ではありません:系統的な実験は、我々が調査している効果を分離する必要があります。残念ながら、プログラミング言語に関係しているため、タイピングの効果を分離することはできません。
実際には、異なる方言で静的型と動的型の両方を許可するプログラミング言語がありました(たとえば、VB Option Strict
On
またはor Off
、または静的に型付けされたLisp)。しかし、これらは直接比較にはあまり適していませんでした。最も重要なことは、直接比較を可能にする既存の十分に大きなコードベースがなかったためです。せいぜい「実験室の設定」でそれらを比較することができます。そこでは、被験者は、言語の静的または動的に型付けされたバリアントでタスクをランダムに解決します。
残念ながら、これらの人工的なプログラミングの割り当ては、実際の使用法をうまくモデル化できません。特に、それらの多くは範囲が小さく、テキストの半分のページに要約できる明確に定義された問題を解決します。
幸いなことに、これは過去のものです。なぜなら、TypeScript、Flow、およびJavaScriptは、静的型付けを除いて実際には同じ言語であり、サンプルの広範なコードとバグの現実世界のデータセットがあるからです。
1元の論文からの引用に触発されました。
2私はこれに完全に満足していません。静的に型付けされた言語の主な長所の1つは、表面上型に関係のない問題を静的に型チェックできる方法で表現できることです。これにより、多くの論理エラーが型エラーに変換され、静的型付けで捕捉できるバグの割合が大幅に増加します。実際、この論文では型に関係のないバグを大まかに分類しており、それらの大部分は実際には静的型付けで捕捉できると主張しています。
3私は誰でも、特に動的型付けの支持者に、分析で対処されていない欠陥を見つけようとするよう勧めます。私は(もしあれば)多くはないと思うし、潜在的な欠陥が結果を実質的に変えることはないと確信している。
4実際の大規模プロジェクトでの静的型付けの実際のコストは、アーキテクチャの自然な部分になり、計画を簡素化することさえあるため、存在しないと思われます。静的型エラーの修正には時間がかかりますが、後で発見されるエラーよりもはるかに少ないです。これは、経験的に広く研究されており、数十年にわたって知られています(例えば、Code Completeを参照)。