静的に型指定された言語と比較すると、動的に型指定された言語を高速化することが困難になる原因。 つまり、実行速度を最適化するのを容易にする静的型付き言語の固有の特性は何ですか?動的に型指定された言語が遅いのはなぜですか?
答えて
静的型付き言語で属性/メソッドにアクセスする場合、通常、参照は静的関数アドレスに縮小できます。より遅い仮想メソッドの場合でも、参照はvtableからのオフセットを読み取るだけです。
動的言語では、名前は文字列に基づいています。 foo.bar
を検索したいですか?ローカル変数のハッシュテーブルでfoo
を見つけてfoo
のハッシュテーブルにbar
を見つけてください。 PythonやRubyのようないくつかの動的言語では、動的に生成される属性を実装するための追加のルックアップ/メソッド呼び出しがあるかもしれません。
これらの検索のすべては、非常にです。 Pythonには世界で最もよく調整されたハッシュテーブル実装の1つがあり、JavaScriptには何百万ドルもの研究費がかかっています。これらの戦術は機能します - ChromeのJavaScriptとIE 5を比較すると、どれだけ多くのものが表示されますが、静的に関数呼び出しを生成するだけでははるかに困難です。
「動的な」言語がどのように変わる可能性があるかを言及する必要があります。 Pythonはいくつかの状況でうまくいく変数参照と対話するいくつかの異なる方法を持っていますが、最適化は非常に困難です。 Common LispやSmalltalkなどの他の動的言語は、動的検索/変更がより制御されるため、多くのユースケースで静的言語と均等に競合することができます。
これは、静的型付き言語が機械コードにコンパイルされることが多いからです。一方、動的型付き言語はほとんどの場合、インタープリタによって実行されるためです。
少し過単純化しているようです。すべての静的型付き言語が、静的CLRまたはJVM言語を含むマシンコードにコンパイルされるわけではありません。動的に型付けされたすべての言語が解釈されるわけではありません。たとえば、多くのLispsをバイトコードにコンパイルすることができます。また、PythonとPHPのコンパイラも多数あります。 – Juliet
Common Lispは実際にはマシンコードにコンパイルできます。 –
最も良いCommon Lispの実装はマシンコードにコンパイルされます。通訳者がいない人もいれば、JITコンパイルだけです。 –
特定のタイプのコンパイル時間の最適化は、変数の正確な型がわかっている場合にのみ実行できます。
動的に型指定された言語には、型を決定し、その型が正しいことを保証するロジックも追加されていることがよくあります。このPythonの例で
ルック:
def fact(n):
if n==0:
return n
return n*fact(n-1)
nは何ですか?それは数字ですか?それは文字列ですか?前に定義したクラスですか? コンパイラがどの入力を得るかを知る方法はありません。実行時に多くのチェックを行う必要があります。つまり、単純な操作のために暗黙の作業をしています。
実際には、Ocaml、F#、Haskellのようないくつかの言語がサポートされているので、コンパイラは型名を使わずに変数のデータ型をその使用法に基づいて判断することができます(http://en.wikipedia.org/wiki/Type_inference)。 。たとえば、 'n == 0'の場合、整数リテラルに対する等価検定は、 'n'が整数であることを示します。コンパイラは 'n'が整数であることを知っているので、 'return n'は関数が整数も返すことを意味します。したがって、関数がintをとり、intを返すと判断できます。 – Juliet
@Princess:ああ、それはマシンサイズのintかbignumですか?あなたはまだこれをテストしなければなりません(しかしそれは効率的に行うことができます) – simon
あなたはまだ静的すぎると思っています - ダイナミックな再コンパイルと仕様(自己論文を読む)はいかがですか?実際には、実際の型情報を持つことによって、ダイナミックコンパイラは静的コンパイラよりも高速なコードを生成することさえあります。値の範囲などについても知っているかもしれないからです。言語を作成するために、高速... – blabla999
実行時に型が変更される可能性があるため、動的型付き言語は実行時にすべてのチェックを行う必要があります。
スタティック型言語は、コンパイル時にすべての型を解決します。したがって、コストは前に1回消費されます。
これは、動的型指定言語が通常より遅い主な理由です。しかし、考えなければならないことは他にもあります。多くは、コンパイラやインタプリタ、GCの実装、ディスパッチテーブルのレイアウト、ルックアップのアルゴリズムと他の最適化に依存します。
これはすべて実装に依存します。ダイナミックな型付き言語は、コンパイルされた言語よりも高速であり、これを達成するためにより多くの作業が必要です。
コンパイルされた動的言語;-) – Ponkadoodle
動的に型指定された言語の実装は、静的型付けされた言語の実装が非常に貧弱であることを意味します。 – niagr
動的に型指定された言語は実際には遅くないので、あなたの質問はちょっとです。多くの例が実際にはあるかもしれませんが、他の例は速いです(速いのは "合理的にcと似ています"など)。
多くの動的言語がVM上で実行されているか、または解釈されていても、回避できる速度低下を引き起こす可能性があります。あるレベルでは、完全に動的な状況では不可能な静的言語コンパイラ(または、適切な種類の約束を何かに対して動的ではない動的なもの)で使用できる最適化があります。
しかし、例えばPythonとC++の違いについて考えているのであれば、それは本当に問題である動的対静的ではありません。
最近のJavascriptのバイトコード変換プログラムの中には、C++ほど速く動作するものがあることに注意してください。 – eyelidlessness
- 1. なぜC++テンプレートが動的に型指定されていますか?
- 2. 動的に型指定された言語(Rubyなど)での変数の名前付け
- 3. 厳密に型指定された言語とは何ですか?
- 4. クエリを実行するときにデータベースや言語プラットフォームが厳密に型指定されたクラスを返さないのはなぜですか?
- 5. 動的に型指定された言語のマップ/リストの変数命名規則
- 6. 静的型付き言語で型の宣言が重要なのはなぜですか?
- 7. Bashのこれらの例では、動的な型定義と静的な型指定がありますか?
- 8. NSLocalizedString()Swiftは指定された言語でしか動作しません
- 9. Flowtype:型指定されたユーザーと型指定されていないユーザーの両方のパッケージですか?
- 10. 高速、コンパクト、ストリーミング、多言語、厳密に型指定されたシリアライズフォーマット
- 11. オープン型述語がなぜそれよりも遅い
- 12. ポストバックで言語が変更されないのはなぜですか?
- 13. 動的に型指定されたC#イテレータブロックを作成するにはどうすればよいですか?
- 14. なぜHTMLハイパーリンクに言語を指定する必要がありますか?
- 15. lookAtが指定されたベクターを見ないのはなぜですか?
- 16. WordPressのこのカスタムフォームが指定されたアクションに移動しないのはなぜですか?
- 17. debug.getinfo(1)に 'name'が指定されていないのはなぜですか?
- 18. 厳密に型指定されたFaultExceptionsが機能しない
- 19. std :: reverse_iterator :: operator []の戻り値の型が指定されていないのはなぜですか?
- 20. 動的型指定言語で関数の引数を記述する方法は?
- 21. コンポーネント指向言語とオブジェクト指向言語の違いは何ですか?
- 22. 'Personal'は指定されたコンテキストでは無効な型です
- 23. コンパイルされた言語やスクリプト言語が好きですか?
- 24. XSLで明示的に型指定された変数
- 25. 強く型付けされたクライアント側の言語ですか?
- 26. Djangoの新しいi18n_patternsの使用:設定モジュールで指定されたデフォルト言語にフォールバックするには?
- 27. TensorFlow、なぜpythonが選ばれた言語ですか?
- 28. 同じ "auto"宣言で基本クラスが自動的に推論されないのはなぜですか?
- 29. 強く型付けされた言語の違いは?
- 30. 英語の言語のローカライズされた表示名が動作しない
必要があると感じたときに、Common Lispで型を静的に指定することは可能です。速度のために構築された実装は非常に高速なコードを生成することができます。 –