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

Dart
Dart
Dartのロゴ
パラダイム マルチパラダイムプログラミング、オブジェクト指向プログラミング関数型プログラミング命令型プログラミングリフレクション ウィキデータを編集
登場時期 2011年10月10日 (12年前) (2011-10-10)
開発者 Google ウィキデータを編集
最新リリース 3.3.3 / 2024年3月27日[1]
型付け ver. 1.x:(動的または静的
ver. 2.x: 型推論強い静的型付け)
主な処理系 Dart VM、dart2native、dart2js、Flutter
影響を受けた言語 Strongtalk、JavaJavaScriptSmalltalkErlangC Sharp ウィキデータを編集
プラットフォーム クロスプラットフォーム ウィキデータを編集
ライセンス BSDライセンス ウィキデータを編集
ウェブサイト dart.dev ウィキデータを編集
拡張子 dart ウィキデータを編集
テンプレートを表示

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

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

歴史 編集

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

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

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

用途 編集

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

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

isolate 編集

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

スナップショット 編集

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

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

ネイティブモバイルアプリ 編集

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

JavaScriptへのコンパイル 編集

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

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

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

編集

Hello worldプログラム[27]

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

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

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

単純なクラスの例

// 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);
}

関連項目 編集

脚注 編集

  1. ^ 出典URL: https://github.com/dart-lang/sdk/releases/tag/3.3.3, 題名: Release 3.3.3
  2. ^ Dart overview”. dart.dev. 2021年4月6日閲覧。
  3. ^ Dart programming language”. dart.dev. 2021年4月6日閲覧。 “A programming language optimized for building user interfaces with features such as the spread operator for expanding collections, and collection if for customizing UI for each platform”
  4. ^ A Tour of the Dart Language”. dart.dev. 2018年8月9日閲覧。
  5. ^ The Dart type system”. dart.dev. 2021年8月29日閲覧。
  6. ^ http://gotocon.com/aarhus-2011/
  7. ^ Presentation: "Opening Keynote: Dart, a new programming language for structured web programming" - GOTOカンファレンス オーフス 2011。10月10日に行われた、Dart言語の公式の公演。
  8. ^ "Future of Javascript" doc from our internal "JavaScript Summit" last week - グーグル社内に流れた電子メール
  9. ^ a b Google Operating System: Dash, Google's Alternative to JavaScript
  10. ^ Google Dart to “ultimately ... replace JavaScript”
  11. ^ TypeScriptが標準言語になっても、Dartのことは忘れてませんよとGoogle担当者がフォロー”. Publickey (2017年4月12日). 2017年4月15日閲覧。
  12. ^ Googleが「Dart 2」発表、Dartを再起動。iOS/Android用ライブラリ「Flutter」と共にWebとモバイルのクライアント開発にフォーカス”. Publickey (2018年3月5日). 2018年5月5日閲覧。
  13. ^ “Why?”, Dart lang (FAQ), http://www.dartlang.org/support/faq.html#why-dart, "We designed Dart to be easy to write development tools for, well-suited to modern app development, and capable of high-performance implementations." 
  14. ^ JavaScript as a compilation target: Making it fast”. Dartlang.org. 2016年7月2日時点のオリジナルよりアーカイブ。2013年8月18日閲覧。
  15. ^ An Introduction to the dart:io Library”. Dartlang.org. 2013年7月21日閲覧。
  16. ^ Flutter FAQ”. flutter.io. 2016年10月2日閲覧。
  17. ^ Announcing Dart 2.6 with dart2native: Compile Dart to self-contained, native executables”. 2019年12月6日閲覧。
  18. ^ The Essence of Google Dart: Building Applications, Snapshots, Isolates” (英語). InfoQ. 2021年8月29日閲覧。
  19. ^ Moore, Kevin (2018年2月23日). “Dart2 Breaking Change: Removing web support for dart:mirrors and dart:isolate”. Google Groups. 2021年9月16日閲覧。
  20. ^ The Essence of Google Dart: Building Applications, Snapshots, Isolates” (英語). InfoQ. 2021年8月29日閲覧。
  21. ^ Flutter - Beautiful native apps in record time”. flutter.dev. 2021年9月19日閲覧。
  22. ^ FAQ” (英語). flutter.dev. 2021年8月29日閲覧。
  23. ^ Firebase” (英語). flutter.dev. 2021年8月29日閲覧。
  24. ^ Deployment”. angulardart.dev. 2021年9月19日閲覧。
  25. ^ Ladd, Seth (2013年3月28日). “Dart News & Updates: Why dart2js produces faster JavaScript code from Dart”. News.dartlang.org.. 2013年7月21日閲覧。
  26. ^ Dart Performance”. Dartlang.org.. 2017年1月3日時点のオリジナルよりアーカイブ。2013年7月21日閲覧。
  27. ^ Another Hello World example hosted in Github

外部リンク 編集