Dart 入門

Dart は Google が開発したモダンなプログラミング言語で、高性能でクロスプラットフォームなアプリケーションの構築のために設計されています。

この章では、Dart の起源、設計思想、そしてフロントエンド・モバイル・サーバーサイドでの幅広い応用シーンについて学びます。


Dart の歴史と設計目標

Dart は 2011 年に誕生し、当初の目標は JavaScript に代わってブラウザのネイティブスクリプト言語になることでした。

この目標は達成されませんでしたが、Dart は 2017 年に重要な転機を迎えました——Flutter フレームワークのリリースにより、Dart は再び開発者の注目を集めるようになりました。

Dart の設計目標は非常に明確です:

設計目標説明
高性能AOT(事前コンパイル)と JIT(実行時コンパイル)に対応し、迅速な開発とネイティブコードの生成の両方を実現
強い型付け型推論に対応し、型の安全性と開発効率を両立
クロスプラットフォーム1つのコードを ARM、x64 のマシンコードまたは JavaScript にコンパイル可能
学びやすいJava、JavaScript、C# などの主流言語から構文を取り入れ、学習コストを低減
Null 安全性Null Safety 機構を内蔵し、言語レベルでヌルポインタ例外を防止

Dart 2.0 は 2018 年にリリースされ、言語が成熟段階に入ったことを示しました。Dart 3.0 は 2023 年にリリースされ、型システムやパターンマッチングなどの機能がさらに強化されました。


Dart の応用シーン

Dart の応用シーンは非常に広く、モバイルからサーバーサイドまでのフルスタック開発のニーズをカバーしています。

モバイル開発(Flutter)

これは現在の Dart の最も中心的な応用シーンです。

Flutter フレームワークを通じて、Dart は iOS と Android の両プラットフォーム向けのネイティブアプリを構築でき、1つのコードが両方で動作します。

Web 開発

Dart は JavaScript にコンパイルでき、Web フロントエンドアプリケーションの構築に使用できます。

AngularDart は Google がメンテナンスする Dart 版の Angular フレームワークで、大規模な Web プロジェクトに適しています。

サーバーサイド開発

dart:io ライブラリや Shelf などのフレームワークを通じて、Dart は高性能なサーバーサイドアプリケーションも作成できます。

Google 内部では複数のサーバーサイドプロジェクトが Dart で書かれています。

コマンドラインツール

Dart はスタンドアロンの実行可能ファイルにコンパイルでき、クロスプラットフォームな CLI ツールの作成に非常に適しています。

応用シーンコンパイルターゲット代表的なフレームワーク/ツール
モバイルARM マシンコードFlutter
Web フロントエンドJavaScriptAngularDart
サーバーサイドマシンコード / JITShelf、Dart Frog
コマンドラインマシンコードdart compile exe

Dart と JavaScript の比較

Dart と JavaScript はどちらもオブジェクト指向言語ですが、Dart は言語設計がより厳密です。

以下では、いくつかの観点から両者の違いを比較します:

比較観点DartJavaScript
型システム強い型付け、型推論に対応弱い型付け、動的型付け
Null 安全性Null Safety を内蔵なし(TypeScript か手動チェックが必要)
エントリーポイント関数main() 関数が必須スクリプトを直接実行
クラスと継承クラスベースの OOP、単一継承プロトタイプチェーンに基づく
コンパイル方式AOT + JIT のデュアルモードJIT が中心
並行処理モデルIsolate(メッセージパッシング)Worker スレッド / イベントループ
パッケージ管理pub.dev(統一された公式リポジトリ)npm(コミュニティリポジトリ)

JavaScript の基礎があれば、Dart の学習は非常に簡単です——両者の非同期構文(async/await)はほぼ完全に同じです。

ただし、Dart の型システムと Null 安全機構は、大規模プロジェクトでより安心感をもたらします。

実例

同じ機能を2つの言語で書いた場合の比較:

// JavaScript バージョン
function greet(name) {
  if (name === null || name === undefined) {
    return 'Hello, stranger!';
  }
  return `Hello, ${name}!`;
}

console.log(greet('サンプル'));
console.log(greet(null));
// Dart バージョン——Null 安全により型がより明確
String greet(String? name) {
  // name は null の可能性があるため、明示的な処理が必要
  if (name == null) {
    return 'Hello, stranger!';
  }
  return 'Hello, $name!';
}

void main() {
  print(greet('サンプル'));
  print(greet(null));
}
Hello, サンプル!
Hello, stranger!

Dart と Flutter の関係

多くの人が Dart に初めて触れるきっかけは Flutter です。

実際には、Flutter は Dart の「キラーアプリケーション」ですが、Dart 自体は独立した汎用プログラミング言語です。

Flutter が Dart を選んだ理由は以下の通りです:

  • JIT コンパイルホットリロードに対応し、コード修正後サブ秒単位で効果を確認でき、開発効率を大幅に向上
  • AOT コンパイルネイティブなマシンコードを生成し、アプリの起動が速く動作がスムーズで、JavaScript Bridge によるパフォーマンス低下がない
  • Dart の宣言的 UIFlutter の Widget ツリー構造と自然に調和
  • 統一された技術スタック:Google が言語とフレームワークを同時にメンテナンスしており、バージョン互換性が良い

Flutter を学ぶ前に、まず Dart の基礎を身につけることをお勧めします。言語の特性を理解すれば、Flutter の学習曲線はかなり緩やかになります。本チュートリアルはその目的のために用意されています。


Dart バージョン発展の略史

バージョンリリース時期主な特徴
Dart 1.02013 年初の安定版、基本言語機能
Dart 2.02018 年強い型システム、new/const がオプションに
Dart 2.122021 年Null Safety を導入
Dart 3.02023 年パターンマッチング、Records、クラス修飾子

本チュートリアルは Dart 3.x バージョンに基づいて作成されており、すべてのコード例は Dart 3.0 以降のバージョンで検証済みです。

その他の拡張