メインコンテンツにスキップ

Dart の概要

Dart product logo Dart product logo

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

言語は、その テクニカルエンベロープ — 言語の機能と強みを形成する開発中に下された選択 — によって定義されます。Dart は、クライアント開発に特に適したテクニカルエンベロープのために設計されており、開発(サブ秒のステートフルホットリロード)と、幅広いコンパイルターゲット(Web、モバイル、デスクトップ)にわたる高品質な本番環境体験の両方を優先しています。

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

Dart: 言語

#

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

Dart には、組み込みの サウンドヌルセーフティ があります。これは、許可しない限り値がヌルにならないことを意味します。サウンドヌルセーフティにより、Dart は静的コード分析を通じて、実行時のヌル例外から保護できます。多くの他のヌルセーフ言語とは異なり、Dart が変数がヌル可能でないと判断した場合、その変数は決してヌルになりません。デバッガで実行中のコードを検査すると、ヌル不可能であることが実行時にも保持されていることがわかります。したがって、サウンド ヌルセーフティなのです。

以下のコードサンプルは、ライブラリ、非同期呼び出し、ヌル可能およびヌル不可能型、アロー構文、ジェネレータ、ストリーム、ゲッタなど、いくつかの 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)
  • 固定サイズのデータを効率的に処理するリスト(例: unsigned 8 バイト整数)および SIMD 数値型 (dart:typed_data)
  • Web アプリケーション以外のアプリケーション向けのファイル、ソケット、HTTP、その他の I/O サポート (dart:io)
  • C スタイルのインターフェースを提供する他のコードとの相互運用性のための外部関数インターフェース (dart:ffi)
  • アイソレート を使用した並行プログラミング — メモリを共有せず、メッセージのみで通信する、スレッドに似た独立したワーカー (dart:isolate)
  • ブラウザや Document Object Model (DOM) と対話する必要がある Web ベースのアプリケーション向けの HTML 要素やその他のリソース (dart:js_interop および package:web)

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

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

Dart コアライブラリを使用した動作例のシリーズを確認するには、コアライブラリのドキュメント を参照してください。追加の API を見つけるには、よく使用されるパッケージのページ を参照してください。

Dart: プラットフォーム

#

Dart のコンパイラ技術により、さまざまな方法でコードを実行できます。

  • ネイティブプラットフォーム: モバイルおよびデスクトップデバイスをターゲットとするアプリの場合、Dart には Just-In-Time (JIT) コンパイルを備えた Dart VM と、マシンコードを生成するための Ahead-Of-Time (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 を強化する)、および豊富なデバッグサポートを備えた Just-In-Time (JIT) コンパイラを提供します。

アプリが本番環境にデプロイできる状態になったとき — アプリストアに公開する場合でも、本番バックエンドにデプロイする場合でも — Dart の Ahead-Of-Time (AOT) コンパイラは、ネイティブ ARM または x64 マシンコードにコンパイルできます。AOT コンパイルされたアプリは、一貫した短い起動時間で起動します。

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

詳細情報

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

#

Dart Web は、JavaScript を介して Web プラットフォームで Dart コードを実行できるようにします。Dart Web では、Dart コードを 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 を学習するための選択肢はたくさんあります。以下にいくつかのおすすめを紹介します。