7

Dart はコンパイル言語またはインタープリター言語と見なされますか? 同じ質問が JavaScript にも当てはまります。

質問の理由:

私はダーツの創設者とのインタビューを見ていて、7:10 で Lars Bak が次のように述べています。

「[...] JavaScript プログラムでは、実際のプログラムを実行する前に実際に JavaScript を実行します。Dart では、main の最初の命令が実行される前に何も実行しません」.

JavaScript はコンパイルされた言語であり、Dart はインタープリター言語であると彼が言っているように聞こえました。本当ですか?

Dart VM はコンパイラではありませんか?

4

3 に答える 3

14

「解釈された」言語と「コンパイルされた」言語の定義に依存します。それでも、それは常に実装に依存します。

Lars が言いたかったのは、JavaScript はコードを実行することによってクラス構造 (およびその他のグローバル状態) を構築するということです。Dart では、グローバルな状態は言語の構文によって記述されるため、解析のみが必要です (その場合でも、そのほとんどは最初にスキップできます)。結果として、Dart プログラムは JavaScript プログラムよりも速く「実際の」コードを実行し始めることができます。

JavaScript にコンパイルされたプログラムは JavaScript メカニズムを使用してクラスを構築する必要があるため、これは明らかに Dart VM にのみ当てはまります。

編集(詳細):

たとえば、次の非常に単純なクラスを見てみましょうA

ダーツで:

class A {
  final x;
  A(this.x);
  foo(y) => y + x;
}

JavaScript の場合:

function A(x) { this.x = x; }
A.prototype.foo = function(y) { return y + this.x; }

Dart VM が起動すると、プログラムを介して起動します。classキーワードを認識し、クラス名 ( A) を読み取り、クラスの最後まで単純にスキップできます (開き括弧と閉じ括弧を数え、それらが文字列に含まれていないことを確認します)。が実際にインスタンス化さAれるまで、 の内容は気にしません。A実際には、実際にはクラスを調べてすべてのメンバーを見つけますが、必要になるまでメソッドの内容を読み取りません。いずれにせよ、これは非常に高速な処理ステップで行われます。

JavaScript では事態はさらに複雑になります。高速な VM は関数の実際の本体をスキップできますがA(Dart と同様)、A.prototype.foo = ...コードを実行してプロトタイプ オブジェクトを作成する必要があることがわかります。つまり、関数オブジェクト ( A) を割り当て、そのプロトタイプ プロパティを検索し、このオブジェクトを新しい関数オブジェクトで変更 (新しいプロパティを追加) する必要があります。つまり、クラスがあることを確認するには、コードを実行する必要があります。

于 2013-07-12T05:37:21.970 に答える
6

virtual machine主な実装におけるプログラミング言語としての Dart は、その言語で書かれたプログラムのランタイムである (VM)として表すことができます。

(JIT) ランタイム環境エンジンとして現在virtual machine実装されています。"just-in-time"

これは、そのプログラムを意味しますnot interpretedが、compiled. しかし、このコンパイル プロセス (source codeに変換machine instructions) はstretched in time不明な期間です。

これにより、仮想マシンはdefer performing certain operations indefinitelyまたはに移動できますnever performing them

現在のプログラム実行で使用されるbig and complex programaを持つ非常にあると仮定します。lot of classesmay be never beshort lifetime session

JIT コンパイルでは、未使用のすべてのクラスをコンパイルするのではなく、それを special に解析するだけtokensです。これらのトークンは後で使用され ( ) 、構築on demandのために変換されます。intermadiate languagemachine code

このプロセスはtransparent for user of program. プログラムの正しい動作に必要なソース コードのみを (マシン コードに) コンパイルします。

一部のソース コードは、何のコンパイルもできませんsave a lot of time

結論:

Dart 言語が仮想マシンとしてプライマリ状態で使用されている場合、それはcompiled to machine code.

于 2013-07-12T07:44:42.620 に答える
-1

Dart は JavaScript にコンパイルされます。JavaScript はインタープリター言語です。通常、「コンパイル済み」言語とは、プラットフォーム固有のマシン コードにコンパイルされ、CPU 上で実行され、インタープリターの実行を必要としない言語を理解するものですが、これは JS や Dart には当てはまりません。したがって、JS と Dart の両方が解釈されると言えます。

于 2013-07-11T19:44:44.930 に答える