7

私は Dart のスナップショットについて読んでいますが、それらは Smalltalk のイメージと頻繁に比較されます。しかし、私には、Java バイトコードのように聞こえます。

例えば:

「Dart スナップショットは、コードの解析から生成されたトークン ストリームの単なるバイナリ シリアル化です。スナップショットは「実行中のプログラムのスナップショット」ではなく、トークンがマシン コードに変換される前に生成されます。そのため、プログラムの状態はありません。スナップショットでキャプチャされました。」

さらに、クロスプラットフォームです。

「スナップショット形式自体はクロスプラットフォームであり、32 ビット、64 ビット マシンなどの間で動作することを意味します。この形式は、ポインターの修正などの余分な作業を最小限に抑えることに重点を置いて、メモリにすばやく読み込むように作成されています。 "

どこか間違っていますか?

ソース:
ダーツのスナップショットの概念とは?
http://www.infoq.com/articles/google-dart

4

3 に答える 3

11

スナップショットには、ロードされたスクリプトを表す VM データ構造が、Smalltalk イメージと同様のシリアル化された形式で含まれています。スナップショットに何が含まれているかをよりよく理解するには、スクリプトを読み取るときに Dart VM が作成するものを確認する必要があります。

  • クラスまたはトップレベルのメソッドや変数など、すべてのトップレベルの構造を参照するライブラリ オブジェクト。
  • すべてのメソッドとフィールドを記述するすべてのオブジェクトを含むクラス オブジェクト。
  • 読み込まれたすべてのソース コードを表すスクリプト オブジェクトと Tokenstream オブジェクト。
  • ソース コードで使用されているすべての識別子と文字列定数の文字列オブジェクト。

このオブジェクト グラフは、アーキテクチャに依存しない形式を使用してスナップショットを生成するときに、ファイルにシリアル化されます。これにより、Dart VM は 32 ビットまたは 64 ビット マシンでこのスナップショット ファイルを逆シリアル化し、一連のファイルから元のスクリプトを読み取るよりもはるかに迅速に必要なすべての内部 VM データ構造を再作成できます (John の回答を参照)。

ジョンの答えを少し明確にするために。Dart VM は、スナップショットの生成時にすべてのソース コードを解析するわけではありません。クラス、メソッド、およびフィールドの定義を抽出できるようにするには、ソースの最上位を解析するだけでよく、これらはシリアル化されたグラフで表されます。特に、メソッド本体は解析されず、スクリプト言語の慣習として、制御が特定のメソッドに到達したときにのみエラーが報告されます。

Ladicek が指摘するように、Java バイトコードの目的はまったく異なります。バイトコードがロードされたら、JVM で VM データ構造のスナップショットを作成して、同様の効果を得ることができます。

つまり、スナップショットには、スクリプトの実行を開始するために必要な、Dart VM ヒープに割り当てられたすべてのデータ構造の効率的な表現が含まれています。

-イヴァン

于 2013-01-30T01:35:53.653 に答える
8

Dart スナップショットは、事前に解析されたすべてのソース ファイルの単なるロールアップです。Dart スナップショットは、Java バイトコード ファイルとは異なります。Java バイトコード ファイルは JVMマシン コードで構成され、コンパイル、リンク、およびアセンブリ (JVM マシン コードへの) フェーズの成果物です。

Dart スナップショットは、Dart プログラムのバイナリ ファイルであり、抽象構文ツリーに解析され、1 つのファイルにまとめられたインポート/パーツ ソース ファイルの依存関係です。Dart スナップショットを実行すると、次の理由により、起動時間が短縮されます。

  1. ディスクまたはネットワーク外からロードする必要があるファイルは 1 つだけです。対照的に、スナップショット以外の Dart プログラムをフェッチする必要があり、次にインポートされたファイルをフェッチする必要があります。後続の各ソース ファイル要求を行う前に、以前に取得したソース ファイルを解析して、それがさらに多くのソース ファイルを参照しているかどうかを確認する必要があります。Dart プログラムが、それぞれ 10 個のソース ファイルで構成される 10 個のライブラリをインポートしたとします。これは、110 の I/O 要求と解析が次々に行われることを意味します。
  2. 解析は事前に行われています。構文的に正しく、Dart VM でコンパイルできることがすでにわかっています。

HTH、ジョン

于 2013-01-27T15:39:32.240 に答える