2009-04-17 18 views

答えて

20

静的型付き言語で属性/メソッドにアクセスする場合、通常、参照は静的関数アドレスに縮小できます。より遅い仮想メソッドの場合でも、参照はvtableからのオフセットを読み取るだけです。

動的言語では、名前は文字列に基づいています。 foo.barを検索したいですか?ローカル変数のハッシュテーブルでfooを見つけてfooのハッシュテーブルにbarを見つけてください。 PythonやRubyのようないくつかの動的言語では、動的に生成される属性を実装するための追加のルックアップ/メソッド呼び出しがあるかもしれません。

これらの検索のすべては、非常にです。 Pythonには世界で最もよく調整されたハッシュテーブル実装の1つがあり、JavaScriptには何百万ドルもの研究費がかかっています。これらの戦術は機能します - ChromeのJavaScriptとIE 5を比較すると、どれだけ多くのものが表示されますが、静的に関数呼び出しを生成するだけでははるかに困難です。


「動的な」言語がどのように変わる可能性があるかを言及する必要があります。 Pythonはいくつかの状況でうまくいく変数参照と対話するいくつかの異なる方法を持っていますが、最適化は非常に困難です。 Common LispやSmalltalkなどの他の動的言語は、動的検索/変更がより制御されるため、多くのユースケースで静的言語と均等に競合することができます。

+0

必要があると感じたときに、Common Lispで型を静的に指定することは可能です。速度のために構築された実装は非常に高速なコードを生成することができます。 –

0

これは、静的型付き言語が機械コードにコンパイルされることが多いからです。一方、動的型付き言語はほとんどの場合、インタープリタによって実行されるためです。

+1

少し過単純化しているようです。すべての静的型付き言語が、静的CLRまたはJVM言語を含むマシンコードにコンパイルされるわけではありません。動的に型付けされたすべての言語が解釈されるわけではありません。たとえば、多くのLispsをバイトコードにコンパイルすることができます。また、PythonとPHPのコンパイラも多数あります。 – Juliet

+0

Common Lispは実際にはマシンコードにコンパイルできます。 –

+0

最も良いCommon Lispの実装はマシンコードにコンパイルされます。通訳者がいない人もいれば、JITコンパイルだけです。 –

10

特定のタイプのコンパイル時間の最適化は、変数の正確な型がわかっている場合にのみ実行できます。

動的に型指定された言語には、型を決定し、その型が正しいことを保証するロジックも追加されていることがよくあります。このPythonの例で

10

ルック:

def fact(n): 
    if n==0: 
     return n 
    return n*fact(n-1) 

nは何ですか?それは数字ですか?それは文字列ですか?前に定義したクラスですか? コンパイラがどの入力を得るかを知る方法はありません。実行時に多くのチェックを行う必要があります。つまり、単純な操作のために暗黙の作業をしています。

+2

実際には、Ocaml、F#、Haskellのようないくつかの言語がサポートされているので、コンパイラは型名を使わずに変数のデータ型をその使用法に基づいて判断することができます(http://en.wikipedia.org/wiki/Type_inference)。 。たとえば、 'n == 0'の場合、整数リテラルに対する等価検定は、 'n'が整数であることを示します。コンパイラは 'n'が整数であることを知っているので、 'return n'は関数が整数も返すことを意味します。したがって、関数がintをとり、intを返すと判断できます。 – Juliet

+2

@Princess:ああ、それはマシンサイズのintかbignumですか?あなたはまだこれをテストしなければなりません(しかしそれは効率的に行うことができます) – simon

+0

あなたはまだ静的すぎると思っています - ダイナミックな再コンパイルと仕様(自己論文を読む)はいかがですか?実際には、実際の型情報を持つことによって、ダイナミックコンパイラは静的コンパイラよりも高速なコードを生成することさえあります。値の範囲などについても知っているかもしれないからです。言語を作成するために、高速... – blabla999

4

実行時に型が変更される可能性があるため、動的型付き言語は実行時にすべてのチェックを行う必要があります。

スタティック型言語は、コンパイル時にすべての型を解決します。したがって、コストは前に1回消費されます。

これは、動的型指定言語が通常より遅い主な理由です。しかし、考えなければならないことは他にもあります。多くは、コンパイラやインタプリタ、GCの実装、ディスパッチテーブルのレイアウト、ルックアップのアルゴリズムと他の最適化に依存します。

これはすべて実装に依存します。ダイナミックな型付き言語は、コンパイルされた言語よりも高速であり、これを達成するためにより多くの作業が必要です。

+0

コンパイルされた動的言語;-) – Ponkadoodle

+0

動的に型指定された言語の実装は、静的型付けされた言語の実装が非常に貧弱であることを意味します。 – niagr

1

動的に型指定された言語は実際には遅くないので、あなたの質問はちょっとです。多くの例が実際にはあるかもしれませんが、他の例は速いです(速いのは "合理的にcと似ています"など)。

多くの動的言語がVM上で実行されているか、または解釈されていても、回避できる速度低下を引き起こす可能性があります。あるレベルでは、完全に動的な状況では不可能な静的言語コンパイラ(または、適切な種類の約束を何かに対して動的ではない動的なもの)で使用できる最適化があります。

しかし、例えばPythonとC++の違いについて考えているのであれば、それは本当に問題である動的対静的ではありません。

+0

最近のJavascriptのバイトコード変換プログラムの中には、C++ほど速く動作するものがあることに注意してください。 – eyelidlessness

関連する問題