2017-01-12 10 views
2

私は動的に型付けされた言語の大きな問題は、型チェックが非常に遅いという多くの逸話を聞いたことがあります。なぜそれは遅いですか?変更可能な実行時割り当てタイプを使用すると、計算効率が大幅に低下する可能性があるというコンピュータ科学の合理性は何ですか?タイプチェックには高価な理由は何ですか?

答えて

6

動的に型指定された言語は、コードが実行されている間にタイプチェックを実行する必要があります。彼らは時々コンパイルすることができますが、合理的なパフォーマンスのために多くのコーナーをカットする必要があります。実行時にチェックする大きな欠点の1つは、型が有効でない場合、インタプリタは例外をスローするか実行を停止できることです。

したがって、望ましくない場合であっても例外を防ぐためにタイプを強制することがよくあります。私が明示的にキャストしたのはintなので、整数全体の単純な除算は私のユーザ出力が突然 '2.0'でいっぱいであることを意味することは珍しくありません。

コンピュータ科学は合理的です。タイプチェックは非常に重いアルゴリズムです。あなたが呼び出すすべての関数について、関連するすべての型を検証しなければならない(または別の関数呼び出しかもしれない)。型情報は後で更新する必要がある。実行時にはシンプルな型システムと最適化はほとんどありません。コンパイラは、弱い型のシステムでさえ、効率の悪いアルゴリズムを最適化するために、これを利用することができます。


静的型言語をコンパイルし、動的型言語を解釈するのは非常に一般的です。これは、言語がコンパイラ用に設計されている場合、コードがより最適になり、実行時に型を管理する必要がないように、コンパイラに型チェックの責任を与えるのは簡単なことではないからです。実行時に実行する必要が少ないほど、より高速なコードが実行されます。

最終的には、これはインタープリタ用に設計された言語がコンパイラが入力できるレベルを提供できないことを意味します。タイプ情報を活用してパフォーマンスを向上させるためのタイプ情報を利用する自由度が低いことに加えて、実行時にタイプ情報を保持し、変更する必要があります。ストライク2。弱いタイプのシステムでも、多くのタイプ安全バグが発生します。

当然、弱いタイピングが望ましい多くのケースもあります。動的言語はしばしばスクリプティングの役割を果たします。コード化が簡単で、解釈が容易で、コンパイラよりも新しいプラットフォームに移植することができます。これは非常に異なるシステムを一緒に接着するのに非常に役立ちます。 1つのスクリプトは、オペレーティングシステムやその上の多くのプログラムと対話して、お気に入りのWebサイトから最新のすべての猫のビデオを毎日ダウンロードするようにスケジュールできます。

いつものように、あなたのレパートリーには動的言語と静的言語があることを強くお勧めします。強力なタイピングと弱いタイピングの容易さへのアクセスを保証するためにアクセスすることは非常に貴重です。コードomnivore :)

+0

これは包括的でよく考えられた答えです。これをまとめてくれてありがとう、ありがとう! – user3325789

関連する問題