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 フロントエンド | JavaScript | AngularDart |
| サーバーサイド | マシンコード / JIT | Shelf、Dart Frog |
| コマンドライン | マシンコード | dart compile exe |
Dart と JavaScript の比較
Dart と JavaScript はどちらもオブジェクト指向言語ですが、Dart は言語設計がより厳密です。
以下では、いくつかの観点から両者の違いを比較します:
| 比較観点 | Dart | JavaScript |
|---|---|---|
| 型システム | 強い型付け、型推論に対応 | 弱い型付け、動的型付け |
| Null 安全性 | Null Safety を内蔵 | なし(TypeScript か手動チェックが必要) |
| エントリーポイント関数 | main() 関数が必須 | スクリプトを直接実行 |
| クラスと継承 | クラスベースの OOP、単一継承 | プロトタイプチェーンに基づく |
| コンパイル方式 | AOT + JIT のデュアルモード | JIT が中心 |
| 並行処理モデル | Isolate(メッセージパッシング) | Worker スレッド / イベントループ |
| パッケージ管理 | pub.dev(統一された公式リポジトリ) | npm(コミュニティリポジトリ) |
JavaScript の基礎があれば、Dart の学習は非常に簡単です——両者の非同期構文(async/await)はほぼ完全に同じです。
ただし、Dart の型システムと Null 安全機構は、大規模プロジェクトでより安心感をもたらします。
実例
同じ機能を2つの言語で書いた場合の比較:
function greet(name) {
if (name === null || name === undefined) {
return 'Hello, stranger!';
}
return `Hello, ${name}!`;
}
console.log(greet('サンプル'));
console.log(greet(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.0 | 2013 年 | 初の安定版、基本言語機能 |
| Dart 2.0 | 2018 年 | 強い型システム、new/const がオプションに |
| Dart 2.12 | 2021 年 | Null Safety を導入 |
| Dart 3.0 | 2023 年 | パターンマッチング、Records、クラス修飾子 |
本チュートリアルは Dart 3.x バージョンに基づいて作成されており、すべてのコード例は Dart 3.0 以降のバージョンで検証済みです。
その他の拡張