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 環境はもはや必要ありません。直接実行できます: