web-dev-qa-db-ja.com

動的言語は常に解釈されますか?

ほとんど(すべてではないにしても)の動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。私が間違っていたら訂正してください。コンパイル段階を経る動的言語の例はありますか?動的言語はインタプリタ言語と同じですか?

19
Joshua Partogi

ほとんど(すべてではないにしても)の動的言語[Python、PHP、Perl、Ruby]を見ると、それらはすべて解釈されます。

違います。 Pythonソースをコンパイルできます。これは存在証明の1つです。

静的に型付けされた言語用のインタープリターと動的に型付けされた言語用のコンパイラーがあります。 2つの概念は直交しています。

補足:一般に、言語とは、意味論を表現するための一連の構文構造を持つ言語です。 Pythonをホワイトボードに書いても、Pythonと呼ばれます!インタプリタまたはコンパイラになることができるのはimplementationです。静的型または動的型(両方のハイブリッドの一種)は言語のプロパティですが、解釈またはコンパイルによってプログラムを実行することは実装のプロパティです。

34
xmm0

一般的なLISPは動的に(そして強く)型付けされており、通常は compiled です。

この動的性は実行時に実現されるため、シンボルが特定の種類の値のみを保持することをコンパイラーに保証するためにソースコードで使用できるいくつかのディレクティブがあります。これにより、コンパイラーは生成コードを最適化し、パフォーマンスを向上させることができます。

15

C#4.0は動的型(遅延バインディング)をサポートし、コンパイルされます。

13
Matt H

node.jsは、GoogleのV8 JavaScriptエンジンに基づいています。 V8はランタイムコンパイルを行います。その事実を考えると、V8は驚くほど高速です。 http://shootout.alioth.debian.org をチェックして、V8と上記の解釈済み言語のいずれかを比較してください。

4
LLeo

いいえ-動的言語をコンパイルすることは確かに可能です。

alwaysで設計された動的言語もいくつかあります(例:Clojure)。

ただし、問題は関連する重要な点に触れています。動的言語はコンパイルできますが、動的言語を静的型付け言語と同じくらい効率的なコードにコンパイルできないことがよくあります。これは、静的にコンパイルされた言語では不要なランタイムチェックを必要とする動的言語の固有の機能があるためです。

この例:オブジェクトのランタイムパッチを許可する言語(Rubyなど)では、オブジェクトのメソッドを呼び出すたびに、オブジェクトを検査する必要があります(ハッシュテーブルルックアップなど)。これがコンパイルされている場合でも、コンパイラーは実行時にメソッド検索を行うコードを生成する必要があります。このメソッドの検索は、インタプリタが実行する必要があることとある程度異なります。

これにより、Javaなどの言語でのメソッド呼び出しと比較すると、オーバーヘッドが大幅に増加します。正しいメソッドは、コンパイラによってクラス定義から静的に決定され、ネイティブコードの単純な関数呼び出しに削減されます。

静的言語でコンパイルされた言語よりも動的言語のパフォーマンスが平均的に遅くなるのは、他の何よりもこの影響だと思います。 欠陥のあるベンチマーク からわかるように、動的言語(Perl、Python、Ruby、PHPなど)ランキングの一番下。

3
mikera

むかしむかし、BASICが解釈されました。また、BASICの一部のバリアントには動的型付けがありました。また、それらのコンパイラも入手できます。

(これは100Kフロッピードライブの時代にさかのぼり、恐竜はまだ地球を歩き回り、疑いのないソフトウェア開発者を朝食に食べました。)

2
quickly_now

異なるSmalltalk実装はこれを異なる方法で処理しますが、それらのいくつかは、高性能VMで実行されるバイトコードにコンパイルされます。

2
Randy Coulman

実際、いわゆる「解釈された」言語のほとんどは、ジャストインタイムのコンパイルを通過させ、それを高速に実行できるようにします。そして、それらのいくつかは、実行する前にバイトコードにコンパイルする必要があります。

相関関係はありますが、実際には動的と解釈は完全に2つの異なるアイデアです。動的なタイピングを感じる人が仕事を簡単かつ高速にできるという理由で、コードの実行速度が少し遅くても移植性があることを気にしません。

2
user658991

Chrome、IE9、Firefox 3.1以降はすべてJavaScriptをネイティブバイナリにコンパイルし、JavaScriptは動的に型指定されます。

動的言語が歴史的に解釈される傾向にある理由は、動的型付けと解釈(より具体的には、コンパイルの欠如)の両方が、スクリプト言語とスクリプトタスク全般に役立つ機能である傾向があるためだと思います。

これらの言語で記述されたプログラムの種類については、パフォーマンスもそれほど問題ではありませんでした(そうではなかった)ので、動的型付けと解釈のオーバーヘッドは、言語の場合ほど大きな問題ではありませんでしたその価値のパフォーマンス。

1
Rei Miyasaka

Pythonは通常、コンパイルされています。確かにバイトコードにコンパイルされ、その後解釈されます。

Perlも同様に機能します。

一般的なLISPは、通常、ネイティブコードまたはバイトコードのいずれかにコンパイルされます。これは実装間で異なります(さまざまな最適化設定に応じて、実装内でもある程度異なります)。

1
Vatine