blog

Dartスナップショット

snapshot は、1 つ以上の Dart オブジェクトをシリアル化したバイト列です。この表現は、これらの Dart オブジェクトが分離されたメモリヒープで表現される方法に非常に近いものです。 アプ...

Feb 19, 2020 · 3 min. read
Share this

dartのソースコードを直接実行してプログラムを実行することも可能です。

snapshot

スナップショットとは、簡単に訳すと「スナップショット」であり、1つ以上の Dart オブジェクトをシリアライズした形で表す一連のバイトです。この表現は、これらのDartオブジェクトが分離されたメモリヒープで表現される方法に非常に近いものです。

Dart VMがスナップショットを使用する主な理由は2つあります:

  • アプリケーションの初期起動時間を短縮します。コア・ライブラリとアプリケーション・スクリプトのスナップショットには通常、コア・ライブラリとアプリケーション・スクリプト用に準備されたデータが含まれています。つまり、起動時にライブラリやスクリプトを解析したりトークン化したりする必要がありません。
  • ある分離から別の分離へのオブジェクトの受け渡し

スナップショットは以下のカテゴリーに分けられます:

  • フル・スナップショット:フル・スナップショットは、初期化後の分離されたヒープの完全な表現を表します。dart VMは、これを使用して、Dartコア・ライブラリ全体、およびdart:convert、dart:io、dart:isolateなどの他のライブラリを迅速に起動し、初期化します。
  • スクリプト・スナップショット: スクリプトを分離にロードした後、スクリプトの実行を開始する前に、スクリプト分離ヒープ内のアプリケーション・スクリプトの完全な表現を表すスクリプト・スナップショット。Dart VM がアプリケーションを素早く起動し、初期化するために使用します。例えば、dart2js を起動するスクリプトは dart2js アプリケーションの事前に作成されたスクリプト・スナップショットを使用します。
  • オブジェクト・スナップショット: オブジェクトのスナップショット。Dart VMでは、ある分離オブジェクトから別の分離オブジェクトへのメッセージの受け渡しは、別の分離オブジェクトに送信する必要があるDartオブジェクトのスナップショットを作成することで実現されます。

スナップショットの生成方法

Dart VM を使用すると、.dart を .snapshot に変換できます。以下は最も基本的な式です:

  • これは最終的なコンパイルが依存するライブラリのアドレスに対応し、通常はカレント・ルート・ディレクトリの .package ファイルにあります。もしよく知らないのであれば、以前の記事の2.2章読んでください。

  • 対応するパラメータは、ファイル名を含む出力ファイルのパスです。ファイルは通常.snapshotで終わります。ソースコードでよく使われるのはflutter_tools.snapshotやdart.snapshotなどです。

  • 通常はdartのメイン関数です。前の投稿ではpub.dartと記載されています。

import 'package:pub/src/command_runner.dart';
void main(List<String> arguments) {
 PubCommandRunner().run(arguments);
}

上記のコアパラメータに加えて、もう1つパラメータがあります。これはスナップショットのタイプを指定するためのもので、デフォルト値はkernel です。もう1つはapp-jit です。

kernel snapshot

カーネルスナップショット自体はカーネルAST形式のバイナリファイルで、Dart VMによって認識されるバイナリ中間生成物を指し、Javaクラスファイルと近似できます。これはアーキテクチャに依存しないため、プラットフォーム間の移行に使用できます。

引数がある場合は、スナップショットファイルの後に空白を続けます。

dart hello.snapshot

app-jit snapshot

app-gitを試してみてください:

app-aot snapshot

dart -snapshot-kind を使用してスナップショットをコンパイルすると、kernel と app-jit の両方に対してのみプロンプトが表示されます。app-aot は dart2.7 以降の dart2native でコンパイルされているからです:

dart2native <dart-file> -k aot

これは異なる方法で実行され、dartaotruntime環境を使用する必要があります:

dartaotruntime xxx.aot

しかし、1つの問題は、flutterのソースにdart2nativeが見つからないことです。

dartaotruntime xxx.aot

native

dartのコードを実行する方法は、基本的にソースコード、スナップショット、ネイティブマシンコードの3つに分けられます。前者 2 つは大まかに説明しました。ネイティブマシンコードは Dart 2.7 以降で参照されています。dart2native を使用すると、dart のソースコードからマシンコードをコンパイルできます。

test.dartを書いてみてください。

 void main(){
 print('this is test log');
 }
 

その後、dart2native を使用してコンパイルします。コンパイルされた製品は、デフォルトで .exe で終わります:

他とは異なり、test.exe を実行するために dart 環境はもはや必要ありません。直接実行できます:

Read next

UFIDA YonBuilderは、ISVのパートナーに力を与える。

情報化時代、高速開発、ソフトウェア開発競争が非常に熱いです、ISVは、技術の激流に追いつくことができる、流されないように、パートナーのサポートを求めることは非常に重要です。結局のところ、インターネットの戦いは、決して一人の戦争は、素手はパーティーを支配することができます。 最初は強力なオペレーティングシステムの必要性であり、ワインはモール戦争で、深い路地を恐れていない、偽の命題であり、適用されません。UFIDAは88年以来設立されています...

Feb 19, 2020 · 1 min read