Q:動的に型付けされた言語は静的に型付けされた言語よりも生産性が高いという主張をよく耳にしました。この主張の理由は何ですか?」
これには歴史的な理由があります。数十年前に戻ると、動的言語は静的言語よりも間違いなく非常に生産的でした(また、非常に低速でした)。両方を知っていて、手元のタスクでどちらかが許可されている場合、Perlは明らかにCよりも生産的です。しかし、時間をかけて言語は互いに多くを借りてきており、新しい言語はギャップを狭めています(生産性とパフォーマンスの両方で)。
考慮すべき点は次のとおりです。
ガベージコレクション:ガベージコレクションがある巨大な生産性の向上。私は、JavaがGCを備えた最初の主流の静的言語であると信じています。これ以前は、基本的に静的は手動のメモリ管理を意味していました。(注:ここと以下では、主流の言語のみを検討しています。多くの実験的およびニッチな言語が存在し、私が作成した任意のポイントに対する反例を提供します。)
メモリーの安全性:生産性の向上により、自分自身を足で撃つことを心配する必要がなくなります。Javaのような「マネージド」静的言語の前、静的は通常、直接メモリアクセスを意味していました。デバッグも生産性の一部であり、安全でないメモリアクセスは本当に目立たないバグにつながる可能性があります。
面倒なタイプのシステム。静的言語でパラメーター化された型(テンプレートやジェネリックなど)を導入する前は、静的型システムの制限がしばしば負担でした。たとえばJavaでは、コレクションからアイテムを選択するたびに明示的にダウンキャストする必要がありました。したがって、キャストの構文上のオーバーヘッドが発生し、タイプセーフはありません。プログラミングにおけるユビキタスコレクションの存在を考えると、これは大きな欠点でした。
すべての型を宣言しなければならないことは、多くの冗長な型付けですが、現代の型推論では、これを大幅に減らすことができます。
大きな標準ライブラリ。Pythonは、標準ライブラリが大きいため「バッテリーを含む」と宣伝されたことで有名です。これは、非常に最小限の標準ライブラリを持つCと比較して。しかし、Javaや.netのようなプラットフォームでは、膨大な標準ライブラリが標準になりつつあり、ScalaやF#のような新しい言語はこれを「無料で」継承しています。
ファーストクラスのデータ構造。PerlやPythonなどの動的言語には、一般的な操作のための便利な構文ショートカットを備えたリストやマップなどの組み込みのファーストクラスのデータ構造があります。これと比較して、Cには固定サイズの配列以外の組み込みコレクションはありません。
クロージャとラムダ構文 -通常、動的言語では最初からこれが行われていましたが、静的言語ではこれが採用され、最近ではJavaが採用されました。
コードスニペットをインタラクティブにすばやくテストする機能をREPLすることは大きな恩恵です。しかし、Visual Studioの「イミディエート」ウィンドウのようなIDEツールでも、静的言語はある程度これをエミュレートできます。
高度なツール -静的言語が動的言語の利便性に近づいている上記の点に加えて、現代のエディターは動的言語のマッチングが難しい方法で静的分析を利用しています。たとえば、エディターは安全な自動リファクタリングを提供できます。これは、動的言語では厳密に言えば不可能です。
結論:歴史的には事実でしたが、今日の答えはそれほど明確ではありません。
Q:では、動的型付けの生産性のために、型モデル自体の利点であるとはどういうことですか?
動的型付けモデルを動的言語から分離するのはやや困難ですが、例として、C#は、コアとして静的言語であるにもかかわらず、時間とともにより動的な機能を採用しています。これは実際に動的型モデルの利点の証拠です。例:
リフレクション
リフレクションは、基本的に動的なタイピング機能です。オブジェクトタイプは、コンパイル時よりも実行時評価時に検査します。それが導入されたとき、それはある種眉をひそめられていましたが、C#ではリフレクションの使用はますますユビキタスになります。たとえば、ASP.Net MVCはリフレクションを多用します。
属性
属性は、動的型付けの例です。コンパイル時にクラスに任意の属性を追加し、実行時に(リフレクションを介して)検査し、それに基づいてオブジェクトを操作できます。MEPのようなものは、基本的に動的型モデルに基づいた拡張フレームワークです。
Linq to SQL、EF mv。
さまざまなLinqトランスフォーマーは、クエリをランタイムオブジェクトとして検査し、その場でSQLを生成します。実行時にコードを検査するよりも動的になりません。CodeDomはコインの反対側であり、実行時にコードを生成できます
Roslyn
Roslynは基本的にを実装しますがeval
、これはかつては真に動的な言語の特徴的な機能と考えられていました。
ダイナミックdynamic
型は、C#で最も明示的にダイナミックな機能であり、外部のオブジェクトや、より簡単で生産的な言語との相互作用を作るのがアドバタイズされます。しかし、便宜上Asp.net MVCでも使用されます。
上記のすべての機能の利点は、動的なモデルが、パラメーター化された型、構造型、および型推論を備えた静的言語であっても明確な利点があることを示しています。