Dartは、 Lars BakとKasper Lundによって設計され、 Googleによって開発されたプログラミング言語です。[ 7 ] Webアプリやモバイルアプリだけでなく、サーバーアプリケーションやデスクトップアプリケーションの開発にも使用できます。
Dart は、 Cスタイルの構文を持つオブジェクト指向、クラスベース、ガベージコレクション言語です。[ 8 ]マシン コード、JavaScript、またはWebAssemblyにコンパイルできます。インターフェース、ミックスイン、抽象クラス、具象ジェネリクス、型推論をサポートしています。[ 4 ] Dart の最新バージョンは3.12.2です。[ 3 ] ![]()
Dart は、2011 年 10 月 10 ~ 12 日にデンマークのオーフスで開催された GOTO カンファレンスで発表されました。[ 9 ] Lars Bakと Kasper Lund がプロジェクトを立ち上げました。[ 10 ] Dart 1.0 は 2013 年 11 月 14 日にリリースされました。[ 11 ]
Dart は当初、賛否両論の評価を受けた。ChromeにDart VM を組み込む計画があったため、ウェブを断片化するとして Dart イニシアチブを批判する声もあった。これらの計画は、2015 年の Dart 1.9 リリースで撤回された。焦点は Dart コードを JavaScript にコンパイルすることに移った。[ 12 ]
Dart 2.0は、型システムを含む言語の変更を伴って2018年8月にリリースされました。[ 13 ]
2019 年 11 月、Dart 2.6 で新しい拡張機能が導入されましたdart2native。これにより、ネイティブコンパイルが Linux、macOS、および Windows デスクトップ プラットフォームに拡張されました。[ 14 ]以前は、開発者は Android または iOS デバイスのみを使用して新しいツールを作成することができました。この拡張機能を使用すると、開発者はプログラムを自己完結型の実行可能ファイルにデプロイできます。これらの自己完結型の実行可能ファイルを実行するために Dart SDK をインストールする必要はありません。[15] FlutterツールキットはDartを統合しているため、バックエンド サポートなどの小規模なサービスでコンパイルできます。[ 16 ] [ 17 ]
Dart 3.0 は 2023 年 5 月にリリースされました[ 18 ]。型システムに変更が加えられ、健全な null 安全性が要求されるようになりました。このリリースには、レコード、パターン[ 19 ]、クラス修飾子[ 20 ]などの新機能が含まれています。
Dartはバージョン3.4以降、WebAssemblyにコンパイルできます。 [ 21 ]
Dart は 2021 年 4 月 9 日に言語仕様の第 5 版をリリースしました。[ 22 ]これは Dart 2.10 までのすべての構文を網羅しています。第 6 版のドラフトには 2.13 までのすべての構文が含まれています。[ 23 ]仕様の承認された提案と潜在的な機能のドラフトは、 GitHub の Dart 言語リポジトリで見つけることができます。[ 24 ]
ECMA International はDart を標準化するために技術委員会 TC52 [ 25 ]を設立しました。ECMA は、2014 年 7 月の第 107 回総会でDart 言語仕様の初版を ECMA-408 [ 26 ]として承認しました。 [ 27 ]その後の版は、2014 年 12 月[ 28 ] 、 2015 年 6 月、および 2015 年 12 月に承認されました。[ 26 ]
Dartソフトウェア開発キット(SDK) には、スタンドアロンの Dart ランタイムが付属しています。これにより、Dart コードをコマンドラインインターフェイス環境で実行できます。SDK には、Dart アプリケーションをコンパイルおよびパッケージ化するためのツールが含まれています。[ 29 ] Dart には、カスタム Web サーバーなどの完全に動作するシステム アプリケーションを作成できる完全な標準ライブラリが付属しています。 [ 30 ]
開発者は、Dartアプリを次の6つの方法でデプロイできます。
Dart 3 は、JavaScript アプリまたは WebAssembly アプリとして Web にデプロイできます。Dart は、2024 年5 月現在、 WebAssembly へのコンパイルをサポートしています。 。
主流のウェブブラウザで動作させるために、Dart はソースからソースへのJavaScriptコンパイラに依存しています。これにより、Dart アプリケーションはすべての主要なブラウザと互換性があります。Dart はコンパイルされた JavaScript 出力を最適化して、コストのかかるチェックや操作を回避します。その結果、プレーンな JavaScript で手書きされた同等のコードよりも高速に実行できる JavaScript コードが生成されます。[ 32 ]
最初の Dart から JavaScript へのコンパイラは でしたdartc。これは Dart 2.0 で非推奨になりました。
2番目の Dart から JavaScript へのコンパイラは frog でした。[ 33 ] Dart で書かれており、2013 年に導入され、2020 年に非推奨になりました。これは、 Very Good Venturesのバックエンド システム構築用のオープンソース Dart フレームワークである Dart Frog と混同しないでください。[ 34 ]
3 つ目の Dart から JavaScript へのコンパイラは ですdart2js。 Dart 2.0 で導入された Dart ベースの は、以前のコンパイラから進化しました。 Dart 言語の仕様と意味論を完全に実装することを目的としていました。開発者はこのコンパイラを本番ビルドに使用します。 は、ミニファイされた JavaScriptdart2jsにコンパイルされます。
4 番目の Dart から JavaScript へのコンパイラは ですdartdevc。[ 36 ]開発者はこのコンパイラを開発ビルドに使用できます。これは人間が読める JavaScript にコンパイルします。2013 年 3 月 28 日、 Dart チームはブログで、dart2jsコンパイラを使用して JavaScript にコンパイルされた Dart コードに関するアップデートを投稿し、[ 37 ] DeltaBlue ベンチマークではChrome の V8 JavaScript エンジンで手書きの JavaScript よりも高速に実行されるようになったと述べています。[ 38 ]
Dart 2.18 より前は、 と の両方dart2jsをdartdevcコマンドラインから呼び出すことができました。 Dart 2.18 では、これらの関数が Dart SDK に統合されました。これにより、直接コマンドラインから呼び出すことはできなくなりましたが、2 つのコンパイラはそのまま残りました。 コマンド はコンパイラwebdev serveを呼び出しますdartdevc。webdev buildコマンド は コンパイラを呼び出しますdart2js。
Dart SDKは、2つの方法でJavaScriptにコンパイルされます。
コードをデバッグするには、コマンドを実行して、人間が読みやすいコードを含むより大きなJavaScriptファイルをコンパイルします。Dartで生成されたJavaScriptは、 Chromewebdev serveでのみデバッグ可能です。
$ cd <dart_app_directory> $ webdevserve [--debug] [-o <target.js>] 本番環境用のアプリを作成するには、以下のコマンドを実行して、webdev buildミニファイされたJavaScriptファイルをコンパイルします。
$ cd <dart_app_directory> $ webdev build [-o <target.js>] Dart 3.22 のリリースで、Google は Dart コードをWebAssemblyにコンパイルするサポートを発表しました。[ 21 ] Wasmを完全にサポートするには、 WasmGC [ 39 ]機能を Wasm 標準に採用する必要があります。Chrome 119 [ 40 ]はWasmGC をサポートしています。Firefox [ 41 ] 120 以降は WasmGC をサポートできますが、現在のバグにより互換性が妨げられています。[ 42 ] Safari [ 43 ]とMicrosoft Edgeは WasmGC サポートを統合しています。
Dartは、コマンドラインツールとしてmacOS、Windows、Linux向けのネイティブマシンコードにコンパイルできます。また、Flutterフレームワークを使用して、Web、iOS、Android、macOS、Windows、Linux向けのユーザーインターフェースを備えたアプリをコンパイルすることもできます。
自己完結型実行ファイルには、指定された Dart コードファイルからコンパイルされたネイティブマシンコード、その依存関係、および小さな Dart ランタイムが含まれます。ランタイムは型チェックとガベージコレクションを処理します。コンパイラは、開発者がコンパイルしたアーキテクチャに固有の出力を生成します。このファイルは、他のネイティブ実行ファイルと同様に配布できます。
$ dart compile exe "source.dart" -o "target_app"生成: <target_app> $ ./target_app 事前にコンパイルすると、[ 44 ] Dart コードはパフォーマンスが高くプラットフォーム固有のモジュールを生成します。これには、アプリが必要とするすべての依存ライブラリとパッケージが含まれます。これによりコンパイル時間が長くなります。コンパイラは、コンパイルされたアーキテクチャに固有のアプリを出力します。
$ dart compile aot-snapshot "source.dart" <target_app.aot> が生成されました$ dartaotruntime "target_app.aot"Dartコードは、ジャストインタイムコンパイルによって、高速にコンパイルされる高性能なモジュールを生成します。このモジュールを実行するには、SDKに付属のDart VMが必要です。コンパイラは、アプリの初回実行時に、解析済みのすべてのクラスとコンパイル済みコードをメモリにロードします。これにより、以降のアプリ実行が高速化されます。コンパイラは、コンパイルされたアーキテクチャに特化したアプリを出力します。
$ dart compile jit-snapshot "source.dart" <source.dart> を jit-snapshot ファイル <target_app.jit> にコンパイルしています。Hello world! $ dart run "target_app.jit" Hello world!Dartコードはカーネルモジュールとしてコンパイルされると、Dart中間表現(Dart IR)と呼ばれるマシン非依存のフォーマットを生成します。Dart IRバイトコードフォーマットは、Dart VMを搭載したあらゆるアーキテクチャで動作します。そのため、このフォーマットは移植性が高く、コンパイルも高速ですが、他のコンパイル出力に比べてパフォーマンスは劣ります。
$ dart compile kernel "source.dart" <source.dart> をカーネルファイル <target_app.dill> にコンパイルしています。$ dart run "target_app.dill"並行処理を実現するために、Dart はメモリを共有せずメッセージ パッシングを使用する独立したワーカーを使用します[ 45 ] 。これはErlangプロセスに似ています(アクター モデルも参照)。すべての Dart プログラムは、少なくとも 1 つのアイソレート (メイン アイソレート) を使用します。Dart 2 以降、Dart Web プラットフォームはアイソレートをサポートしなくなり、開発者には代わりにWeb Workers を使用することを推奨しています[ 46 ]。
Dart 2.12 以降、Dart は健全なnull 安全性を導入しました。[ 47 ]これは、明示的な許可がない限り、変数が null 値を返さないことを保証するものです。null 安全性により、開発者は、よくあるがデバッグが難しいエラーである null ポインタ例外を発生させることを防ぐことができます。Dart 3.0 以降、すべてのコードは健全な null 安全性に従う必要があります。
Dart VM の中核部分であるスナップショットファイルは、オブジェクトやその他のランタイムデータを保存します。[ 45 ]
2011年11月18日、GoogleはmacOS、Windows、Linuxベースのオペレーティングシステム向けに、 EclipseコンポーネントをベースにしたオープンソースプログラムであるDart Editorをリリースしました。[ 49 ]このエディタは、構文ハイライト、コード補完、JavaScriptコンパイル、WebおよびサーバーDartアプリケーションの実行、デバッグをサポートしています。
2012年8月13日、GoogleはDart開発用のEclipseプラグインのリリースを発表した。[ 50 ]
2015 年 4 月 18 日、Google は、 JetBrains の統合開発環境(IDE)を優先して Dart エディタを廃止しました。 [ 51 ] Android Studio、IntelliJ IDEA、PyCharm、PhpStorm、WebStorm はDart プラグインをサポートしています。[ 52 ]このプラグインは、構文ハイライト、コード補完、分析、リファクタリング、デバッグなど、多くの機能をサポートしています。他のエディタには、 Sublime Text、[ 54 ] Atom、[ 55 ] Emacs、[ 56 ] Vim [ 57 ]およびVisual Studio Code [ 58 ]など、Dart 用のプラグインが含まれています。[ 53 ]
2013年、Chromiumチームは、再利用可能なGUIウィジェットライブラリを備えたオープンソースのChromeアプリベースの開発環境(コードネームSpark)の開発に着手した。[ 59 ]このプロジェクトは後にChrome Dev Editorと改名された。[ 60 ] Dartで構築されたこの開発環境には、Polymerを搭載したSparkが含まれていた。[ 61 ]
2015年6月、GoogleはCDEプロジェクトをフリーソフトウェアプロジェクトとしてGitHubに移管し、CDEへの積極的な投資を停止しました。[ 62 ] Chrome Dev Editorプロジェクトは2021年4月24日にアーカイブされました。[ 63 ]

Dart をより簡単に使い始める方法を提供するために、Dart チームは2015 年初頭にDartPadを作成しました。このオンライン IDE を使用すると、開発者は Dartアプリケーション プログラミング インターフェイス(API)を試したり、Dart コードを実行したりできます。構文ハイライト、コード分析、コード補完、ドキュメント、HTML および CSS 編集機能を提供します。[ 64 ]
Dart DevTools は Dart で書かれた[ 65 ]コードのデバッグとパフォーマンス向上ツールのスイートです。
Google はネイティブ アプリ開発用にFlutter を導入しました。 Dart、C、C++、Skiaを使用して構築されたFlutter は、オープンソースのマルチプラットフォーム アプリ UI フレームワークです。 Flutter 2.0 より前は、開発者はAndroid、iOS、Web のみをターゲットにすることができました。 Flutter 2.0 では、macOS、Linux、Windows のサポートがベータ機能としてリリースされました。[ 66 ] Flutter 2.10 ではWindowsのプロダクション サポートがリリースされ[ 67 ]、Flutter 3 ではすべてのデスクトップ プラットフォームのプロダクション サポートがリリースされました。[ 68 ]フレームワーク、ウィジェット、ツールが提供されます。このフレームワークにより、開発者はモバイル、デスクトップ、Web アプリを構築およびデプロイする方法を得ることができます。[ 69 ] Flutter はFirebase [ 70 ]と連携し、パッケージと呼ばれるアドオンを介してフレームワークを拡張することをサポートしています。これらはパッケージ リポジトリ pub.dev で見つけることができます。[ 71 ] JetBrains も Flutter プラグインをサポートしています。[ 72 ]
「Hello, World!」の例:
void main () { print ( 'Hello, World!' ); }void main () { for ( int i = 1 ; i <= 10 ; i ++ ) { print ( i ); } }n番目のフィボナッチ数を計算する関数:
void main () { int i = 20 ; print ( 'fibonacci( $ i ) = ${ fibonacci ( i ) } ' ); }/// n番目のフィボナッチ数を計算します。int fibonacci ( int n ) { return n < 2 ? n : ( fibonacci ( n - 1 ) + fibonacci ( n - 2 )); }シンプルなクラス:
// sqrt 関数にアクセスするために、math ライブラリをインポートします。// `math` という名前でインポートされるため、アクセスするには `math.` をプレフィックスとして使用する必要があります。import 'dart:math' as math ;// Point のクラスを作成します。class Point {// final 変数は、一度代入されると変更できません。// 2 つのインスタンス変数を宣言します。final num x , y ;// インスタンス変数を設定するための構文糖衣を備えたコンストラクタ。// コンストラクタには 2 つの必須パラメータがあります。Point ( this . x , this . y );// 初期化リストを持つ名前付きコンストラクタ。Point.origin () : x = 0 , y = 0 ;// メソッド。num distanceTo ( Point other ) { num dx = x - other . x ; num dy = y - other . y ; return math . sqrt ( dx * dx + dy * dy ); } // 「ゲッター」の例。// final 変数と同じように動作しますが、アクセスするたびに計算されます。num get magnitude => math . sqrt ( x * x + y * y );// 演算子オーバーロードの例Point operator + ( Point other ) => Point ( x + other . x , y + other . y ); // Dart 2+ で Point などのクラスをインスタンス化する場合、new は// オプションの単語です}// すべての Dart プログラムは main() で始まります。void main () { // ポイントオブジェクトをインスタンス化します。Point p1 = Point ( 10 , 10 ); print ( p1 . magnitude ); Point p2 = Point . origin (); num distance = p1 . distanceTo ( p2 ); print ( distance ); }Dart はALGOL言語ファミリーに属します。[ 74 ]そのメンバーには、C、Java、C#、JavaScript などがあります。
メソッドカスケード構文はSmalltalkから採用されました。[ 75 ]この構文は、同じオブジェクトに対して複数のメソッドを順番に呼び出すためのショートカットを提供します。
DartのmixinはStrongtalk [ 76 ] [ 77 ]とRubyの影響を受けている。
Dart は、アプリケーションを構造化する際に、並行性とセキュリティの単位としてアイソレートを使用します。[ 78 ]アイソレートの概念は、 Erlang で実装されているアクター モデルに基づいています。[ 79 ]
2004年の論文で、Gilad Bracha(Dartチームのメンバー)とDavid Ungarは、制御された安全なリフレクションを実行するためのMirror APIを初めて提案した。[ 80 ]この概念はSelfで初めて実装された。
{{citation}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)