目次

Dart の概要

Dart product logo

Dart は、あらゆるプラットフォームで高速アプリを開発するための、クライアントに最適化された言語です。その目標は、マルチプラットフォーム開発のための最も生産的なプログラミング言語と、アプリフレームワークのための柔軟な実行ランタイムプラットフォームを提供することです。

言語は、その開発中に言語の機能と強みを形成する選択である技術的包絡によって定義されます。Dart は、クライアント開発に特に適した技術的包絡を想定して設計されており、開発(1 秒未満のステートフルホットリロード)と、さまざまなコンパイルターゲット(Web、モバイル、デスクトップ)での高品質な本番エクスペリエンスの両方を優先しています。

Dart はFlutterの基礎も形成しています。Dart は、Flutter アプリを動かす言語とランタイムを提供しますが、Dart はコードのフォーマット、分析、テストなどの多くのコア開発者タスクもサポートしています。

Dart: 言語

#

Dart 言語は型安全です。静的型チェックを使用して、変数の値が常に変数の静的型と一致することを確認します。これは、サウンドタイピングと呼ばれることもあります。型は必須ですが、型推論のため型注釈はオプションです。Dart の型システムは柔軟性もあり、実験中や特に動的なコードでは、ランタイムチェックと組み合わせてdynamic型を使用できます。

Dart には組み込みの健全な Null 安全性があります。これは、許可しない限り、値が null になることはないという意味です。健全な Null 安全性により、Dart は静的コード分析を通じてランタイムでの null 例外から保護できます。他の多くの null 安全言語とは異なり、Dart が変数を non-nullable であると判断した場合、その変数が null になることはありません。デバッガーで実行中のコードを調べると、non-null 性がランタイムで保持されていることがわかります。これが健全な Null 安全性です。

次のコードサンプルは、ライブラリ、非同期呼び出し、nullable 型と non-nullable 型、アロー構文、ジェネレーター、ストリーム、ゲッターなど、いくつかの Dart 言語機能を示しています。言語の詳細については、Dart 言語ツアーを参照してください。

import 'dart:math' show Random;

void main() async {
  print('Compute π using the Monte Carlo method.');
  await for (final estimate in computePi().take(100)) {
    print('π ≅ $estimate');
  }
}

/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch = 100000}) async* {
  var total = 0; // Inferred to be of type int
  var count = 0;
  while (true) {
    final points = generateRandom().take(batch);
    final inside = points.where((p) => p.isInsideUnitCircle);

    total += batch;
    count += inside.length;
    final ratio = count / total;

    // Area of a circle is A = π⋅r², therefore π = A/r².
    // So, when given random points with x ∈ <0,1>,
    // y ∈ <0,1>, the ratio of those inside a unit circle
    // should approach π / 4. Therefore, the value of π
    // should be:
    yield ratio * 4;
  }
}

Iterable<Point> generateRandom([int? seed]) sync* {
  final random = Random(seed);
  while (true) {
    yield Point(random.nextDouble(), random.nextDouble());
  }
}

class Point {
  final double x;
  final double y;

  const Point(this.x, this.y);

  bool get isInsideUnitCircle => x * x + y * y <= 1;
}

Dart: ライブラリ

#

Dart には、多くの日常的なプログラミングタスクに不可欠な豊富なコアライブラリセットがあります。

  • すべての Dart プログラムの組み込み型、コレクション、その他のコア機能 (dart:core)
  • キュー、リンクされたリスト、ハッシュマップ、二分木などのより豊富なコレクション型 (dart:collection)
  • JSON や UTF-8 を含む、さまざまなデータ表現間の変換のためのエンコーダーとデコーダー (dart:convert)
  • 数学定数と関数、および乱数生成 (dart:math)
  • FutureStreamなどのクラスを使用した非同期プログラミングのサポート (dart:async)
  • 固定サイズのデータ (たとえば、符号なし 8 バイト整数) および SIMD 数値型を効率的に処理するリスト (dart:typed_data)
  • 非 Web アプリケーション向けのファイル、ソケット、HTTP、その他の I/O サポート (dart:io)
  • C スタイルのインターフェイスを提供する他のコードとの相互運用性のための外部関数インターフェイス (dart:ffi)
  • スレッドに似ているがメモリを共有せず、メッセージのみを介して通信する独立したワーカーであるアイソレートを使用した並行プログラミング (dart:isolate)
  • ブラウザーや Document Object Model (DOM) と対話する必要がある Web ベースのアプリケーション向けの HTML 要素およびその他のリソース (dart:html)

コアライブラリに加えて、多くの API が包括的なパッケージセットを通じて提供されます。Dart チームは、次のような多くの便利な追加パッケージを公開しています。

さらに、サードパーティのパブリッシャーやより広範なコミュニティが、次のような機能のサポートを含む何千ものパッケージを公開しています。

Dart コアライブラリを紹介する一連の動作例については、コアライブラリのドキュメントをお読みください。追加の API を見つけるには、よく使われるパッケージのページを確認してください。

Dart: プラットフォーム

#

Dart のコンパイラテクノロジーを使用すると、コードをさまざまな方法で実行できます。

  • ネイティブプラットフォーム: モバイルおよびデスクトップデバイスをターゲットとするアプリの場合、Dart にはジャストインタイム (JIT) コンパイルを備えた Dart VM と、マシンコードを生成するための事前コンパイル (AOT) コンパイラの両方が含まれています。

  • Web プラットフォーム: Web をターゲットとするアプリの場合、Dart は開発または本番目的でコンパイルできます。その Web コンパイラは、Dart を JavaScript または WebAssembly に変換します。

An illustration of the targets supported by Dart

Flutter フレームワークは、Dart プラットフォームを基盤とする一般的なマルチプラットフォーム UI ツールキットであり、iOS、Android、macOS、Windows、Linux、および Web で実行される UI エクスペリエンスを構築するためのツールと UI ライブラリを提供します。

Dart Native (マシンコード JIT および AOT)

#

開発中は、反復のために高速な開発サイクルが不可欠です。Dart VM は、インクリメンタル再コンパイル(ホットリロードを有効にする)、ライブメトリック収集(DevToolsを強化)、および豊富なデバッグサポートを備えたジャストインタイムコンパイラ(JIT)を提供します。

アプリが本番環境にデプロイする準備ができた場合 (アプリストアに公開する場合でも、本番バックエンドにデプロイする場合でも)、Dart の事前コンパイル (AOT) コンパイラは、ネイティブ ARM または x64 マシンコードにコンパイルできます。AOT コンパイルされたアプリは、一貫性のある短い起動時間で起動します。

AOT コンパイルされたコードは、健全な Dart 型システムを適用し、高速なオブジェクト割り当てと世代別ガベージコレクターを使用してメモリを管理する効率的な Dart ランタイム内で実行されます。

詳細

Dart Web (JavaScript 開発 & 本番および WebAssembly)

#

Dart Web を使用すると、JavaScript を利用した Web プラットフォーム上で Dart コードを実行できます。Dart Web を使用すると、Dart コードを JavaScript コードにコンパイルし、その JavaScript コードがブラウザーで実行されます。たとえば、Chrome内のV8などです。または、Dart コードを WebAssembly にコンパイルすることもできます。

Dart Web には 3 つのコンパイルモードが含まれています

  • 高速な開発サイクルを可能にするインクリメンタル JavaScript 開発コンパイラ。
  • Dart コードを高速でコンパクトなデプロイ可能な JavaScript にコンパイルする最適化された JavaScript 本番コンパイラ。これらの効率は、デッドコード削除などの手法から生まれます。
  • Dart コードを非常に高速なデプロイ可能な WebAssembly GC コードにコンパイルする最適化された WebAssembly (WasmGC) 本番コンパイラ。

詳細

Dart ランタイム

#

どのプラットフォームを使用するか、どのようにコードをコンパイルするかにかかわらず、コードを実行するには Dart ランタイムが必要です。このランタイムは、次の重要なタスクを担当します。

  • メモリの管理: Dart はマネージドメモリモデルを使用しており、未使用のメモリはガベージコレクター(GC)によって再利用されます。

  • Dart 型システムの強制: Dart の型チェックのほとんどは静的(コンパイル時)ですが、一部の型チェックは動的(ランタイム)です。たとえば、Dart ランタイムは、型チェックおよびキャスト演算子によって動的なチェックを強制します。

  • アイソレートの管理: Dart ランタイムは、メインアイソレート(通常コードが実行される場所)と、アプリが作成するその他のアイソレートを制御します。

ネイティブプラットフォームでは、Dart ランタイムは自己完結型実行ファイル内に自動的に含まれており、dart run コマンドによって提供される Dart VM の一部です。

Dart の学習

#

Dart を学ぶための選択肢はたくさんあります。以下に、推奨するものをいくつか示します。