Dart

**Dart**（ダートまたはダーツ。当初はDashと呼ばれていた）は、ウェブアプリやモバイルアプリのクライアント開発向けに設計されたプログラミング言語である。Googleによって開発された言語で、サーバーやデスクトップ向けアプリケーションの開発にも使用できる。

Dartはオブジェクト指向、クラスベース、ガベージコレクションを備えた、Cスタイルのを持つ言語である。DartはネイティブコードまたはJavaScriptにコンパイルでき、、Mixin、抽象クラス、、ジェネリクス、型推論をサポートしている。

2011年10月10日 - 12日に開催された デンマークのオーフスで開催された「GOTOカンファレンス」で公開された。この言語は、ウェブブラウザ組み込みのスクリプト言語であるJavaScriptの代替となることを目的に作られた。

## 歴史
Dart言語はJavaScript言語にある解決できない言語上の問題点を解決し、なおかつ、より優れたパフォーマンスを発揮し、大規模なプロジェクト用途にも耐え得る特徴を備え、セキュリティ面でもより優れた言語として、設計された。Googleの技術者は「」というクラウド用統合開発環境を開発している。恐らくこれが最初のDart言語のアプリケーションだと思われる。GoogleはDart言語をサポートしないウェブブラウザのために、Dart言語で作られたプログラムをECMAScript 3に必要に応じて変換するクロスコンパイラを提供すると告知している。また、型付のコードをDart言語に変換するツールも提供されることになっている。GoogleはDartの仮想マシンをChromeブラウザに統合するとしており、他のブラウザがこれに追従することを期待しているようであった。仮想マシンとクロスコンパイラは2011年の末までには利用できる予定となっていた。

しかし普及は進まず、2015年には仮想マシンのChrome統合を断念。また2017年には、DartはGoogleにおいて重要な言語であるとしながらも、競合するTypeScriptがGoogle社内の標準プログラミング言語として承認されたことが発表された。

2018年2月には**Dart 2**が発表された。Dart 2.6より、ネイティブコードにコンパイルできるdart2nativeが開発されたほか、強力な型システムなどの言語機能の強化が行われている。

2023年5月には**Dart 3**が発表された。デフォルト状態においてnull値を不許容にする仕組み (Sound null safety) が導入された。

## 用途
Dartのコードを実行する方法は4つある。

; Web
: 主要なウェブブラウザで実行できるようにするために、DartはJavaScriptへのsource-to-sourceコンパイラを利用している。プロジェクトのウェブサイトによると、Dartは「開発ツールが簡単に書け、モダンなアプリ開発によく適しており、高性能な実装が可能になるように設計された」言語である。Dartのコードをウェブブラウザで実行する場合には、コードを事前にdart2jsコンパイラを使用してJavaScriptにコンパイルする。JavaScriptとしてコンパイルしたDartのコードは、主要なすべてのブラウザと互換性があり、Dartのサポートは必要としない。コンパイル後のJavaScriptの出力を負荷の高いチェックや操作を避けるように最適化することで、場合によってはJavaScriptのイディオムを使用した等価な手書きのコードより高速に実行できることもある。
:
; スタンドアローン
: Dart SDKにはスタンドアローンのDart VMが同梱されており、DartコードをCLI環境で実行できる。Dart SDKに含まれる言語ツールは大部分がDart自体で書かれているため、スタンドアローンのDart VMはSDKの重要な部分である。これらのツールには、dart2jsコンパイラやpubと呼ばれるパッケージマネージャーが含まれる。Dartは完全な標準ライブラリを同梱しているため、たとえばカスタムのウェブサーバーなどの完全に動作するシステムアプリを書くことができる。
:
; Ahead-of-timeコンパイル
: Dartのコードは機械語（ネイティブの命令セット）にすることができる。Dartで構築されたモバイルアプリSDKのFlutterで構築されたアプリは、AOTコンパイルされたDartコードとしてアプリストアにデプロイされる。
:
; ネイティブ
: Dart 2.6では、dart2native コンパイラを使用すると、自己完結型のネイティブの実行コードにコンパイルできる。Dart2.6より前では、この機能はiOSとAndroidのモバイルデバイス上でFlutter経由でのみ公開されていた。

## isolate
並行性（concurrency）を実現するために、Dartではisolateと呼ばれる、メモリを共有せずにメッセージパッシングを使用する独立したワーカーを利用する。これはErlangのprocessに似ている（詳しくはアクターモデルを参照）。すべてのDartプログラムは少なくとも1つのisolate、main isolateを使用している。Dart 2からは、Dartウェブプラットフォームはisolateをサポートしなくなり、開発者は代わりにWeb Workerを使用することが推奨されている。

## スナップショット
スナップショットはDart VMのコアパーツである。スナップショットには、オブジェクトとその他のランタイムデータがファイルとして保存される。

; スクリプトスナップショット
: Dartプログラムはスナップショットファイルにコンパイルできる。これらのファイルには、あらかじめ解析されて実行準備がされているプログラムのコードと依存関係のすべてが含まれている。
:
; フルスナップショット
: Dartのコアライブラリはスナップショットにコンパイルできるため、ライブラリを高速に読み込める。メインのDart VMのほとんどの標準ディストリビューションにはコアライブラリのプリビルドされたスナップショットがあり、ランタイム時に読み込まれる。
:
; オブジェクトスナップショット
: Dartは非同期性の高い言語であり、並行性のためにisolateを利用している。これらのワーカーはメッセージを受け渡しするため、メッセージをシリアライズする方法が必要である。これは与えられたオブジェクトから生成されたスナップショットを使用して実現されており、その後、他のデシリアライズのために他のisolateに転送される。

## ネイティブモバイルアプリ
GoogleはAndroidとiOSのネイティブモバイルアプリ開発のためにFlutterを発表した。Flutterはモバイルアプリのフレームワーク、ウィジェット、ツールをすべて含んだSDKであり、開発者はDartで書かれたモバイルアプリのビルドとデプロイができる。FlutterはFirebaseや、他のモバイルアプリSDKと連携でき、オープンソースである。

## JavaScriptへのコンパイル
Dart SDKにはDartからJavaScriptへ変換するコンパイラが含まれる。開発中には、dartdevcが高速なリフレッシュサイクルをサポートする。最終バージョンのアプリでは、dart2jsがデプロイ可能なJavaScriptを生成する。

最初のコンパイラはDartコードからJavaScriptを生成するdartcだったが、廃止された。2番目のDartからJavaScriptへのコンパイラはFrogだった。FrogはDartで書かれていたが、言語の完全なセマンティクスは実装されなかった。3番目のDartからJavaScriptへのコンパイラはdart2jsだった。以前のコンパイラの進化形であるdart2jsはDartで記述されており、完全なDart言語仕様とセマンティクスを実装することを目的としている。

2013年3月28日、Dartチームは、dart2jsコンパイラを使用してJavaScriptにコンパイルされたDartコードに対応する更新をブログに投稿した。DeltaBlueベンチマーク用のChromeのV8 JavaScriptエンジンで、手書きのJavaScriptよりも高速に実行されるようになったと述べている。

## 例
Hello worldプログラム。

```dart
main() {
  print('Hello World!');
}
```

フィボナッチ数を計算する関数の例

```dart
int fib(int n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}
main() {
  print('fib(20) = ${fib(20)}');
}
```

単純なクラスの例

```dart
// sqrt関数を呼び出すためにmathライブラリをインポート
import 'dart:math' as math;

// Pointクラスを定義
class Point {

   // 2つのインスタンス変数を定義
  final num x, y;

  // コンストラクター関数
  Point(this.x, this.y);

  // 初期化リストを含む名前付きコンストラクター関数
  Point.origin()
      : x = 0,
        y = 0;

  //メソッド定義の例
  num distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return math.sqrt(dx * dx + dy * dy);
  }

  // 演算子のオーバーローディングの例
  Point operator +(Point other) => Point(x + other.x, y + other.y);
}

// すべてのDart言語のプログラムは main()関数から始まる
void main() {
  // point オブジェクトの生成.
  var p1 = Point(10, 10);
  var p2 = Point.origin();
  var distance = p1.distanceTo(p2);
  print(distance);
}
```


## 関連項目
*Document Object Model (DOM) &mdash; HTML文書、XML文書中の要素を表現・操作するための技法
*プログラミング言語
*スクリプト言語
*JavaScript
*Go (プログラミング言語)

## 脚注

## 外部リンク

* 
* Google Dart to “ultimately ... replace JavaScript”
* Presentation: "Opening Keynote: Dart, a new programming language for structured web programming" - GOTO Aarhus 2011 conference. Planned official presentation of the Dart language, on October 10.
* "Future of Javascript" doc from our internal "JavaScript Summit" last week - Leaked internal Google email.
* Infoq on Google Dart's feature set
* dartrefjp - Dart 日本語リファレンス
** dartrefjp - Dart 日本リファレンス ユーザーディスカッショングループ