Dart

Dart（ダートまたはダーツ。当初はDashと呼ばれていた）は、ウェブアプリやモバイルアプリのクライアント開発向けに設計されたプログラミング言語である。Googleによって開発された言語で、サーバーやデスクトップ向けアプリケーションの開発にも使用できる。 Dartはオブジェクト指向、クラスベース、ガベージコレクションを備えた、Cスタイルの構文（英語版）を持つ言語である。DartはネイティブコードまたはJavaScriptにコンパイルでき、インターフェイス（英語版）、Mixin、抽象クラス、reification（英語版）、ジェネリクス、型推論をサポートしている。 2011年10月10日 - 12日に開催された デンマークのオーフスで開催された「GOTOカンファレンス」で公開された。この言語は、ウェブブラウザ組み込みのスクリプト言語であるJavaScriptの代替となることを目的に作られた。 Dart言語はJavaScript言語にある解決できない言語上の問題点を解決し、なおかつ、より優れたパフォーマンスを発揮し、大規模なプロジェクト用途にも耐え得る特徴を備え、セキュリティ面でもより優れた言語として、設計された。Googleの技術者は「Brightly」というクラウド用統合開発環境を開発している。恐らくこれが最初のDart言語のアプリケーションだと思われる。GoogleはDart言語をサポートしないウェブブラウザのために、Dart言語で作られたプログラムをECMAScript 3に必要に応じて変換するクロスコンパイラを提供すると告知している。また、型付のClosureコードを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のコードは機械語（ネイティブの命令セット）にAOT-コンパイル（英語版）することができる。Dartで構築されたモバイルアプリSDKのFlutterで構築されたアプリは、AOTコンパイルされたDartコードとしてアプリストアにデプロイされる。 ネイティブ Dart 2.6では、dart2native コンパイラを使用すると、自己完結型のネイティブの実行コードにコンパイルできる。Dart2.6より前では、この機能はiOSとAndroidのモバイルデバイス上でFlutter経由でのみ公開されていた。 並行性（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と連携でき、オープンソースである。 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プログラム。 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); } Document Object Model (DOM) — HTML文書、XML文書中の要素を表現・操作するための技法 プログラミング言語 スクリプト言語 JavaScript Go (プログラミング言語) [脚注の使い方] ^ 出典URL: https://github.com/dart-lang/sdk/releases/tag/3.5.3, 題名: Release 3.5.3 ^ “Dart overview”. dart.dev. 2021年4月6日閲覧。 ^ “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” ^ “A Tour of the Dart Language”. dart.dev. 2018年8月9日閲覧。 ^ “The Dart type system”. dart.dev. 2021年8月29日閲覧。 ^ http://gotocon.com/aarhus-2011/ ^ Presentation: "Opening Keynote: Dart, a new programming language for structured web programming" - GOTOカンファレンス オーフス 2011。10月10日に行われた、Dart言語の公式の公演。 ^ "Future of Javascript" doc from our internal "JavaScript Summit" last week - グーグル社内に流れた電子メール ^ a b Google Operating System: Dash, Google's Alternative to JavaScript ^ Google Dart to “ultimately ... replace JavaScript” ^ “TypeScriptが標準言語になっても、Dartのことは忘れてませんよとGoogle担当者がフォロー”. Publickey (2017年4月12日). 2017年4月15日閲覧。 ^ “Googleが「Dart 2」発表、Dartを再起動。iOS/Android用ライブラリ「Flutter」と共にWebとモバイルのクライアント開発にフォーカス”. Publickey (2018年3月5日). 2018年5月5日閲覧。 ^ “"Null"完全制御のプログラミング言語「Dart 3」がリリース”. マイナビ (2023年5月12日). 2024年5月11日閲覧。 ^ “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."  ^ “JavaScript as a compilation target: Making it fast”. Dartlang.org. 2016年7月2日時点のオリジナルよりアーカイブ。2013年8月18日閲覧。 ^ “An Introduction to the dart:io Library”. Dartlang.org. 2013年7月21日閲覧。 ^ “Flutter FAQ”. flutter.io. 2016年10月2日閲覧。 ^ “Announcing Dart 2.6 with dart2native: Compile Dart to self-contained, native executables”. 2019年12月6日閲覧。 ^ “The Essence of Google Dart: Building Applications, Snapshots, Isolates” (英語). InfoQ. 2021年8月29日閲覧。 ^ Moore, Kevin (February 23, 2018). “Dart2 Breaking Change: Removing web support for dart:mirrors and dart:isolate”. Google Groups. 2021年9月16日閲覧。 ^ “The Essence of Google Dart: Building Applications, Snapshots, Isolates” (英語). InfoQ. 2021年8月29日閲覧。 ^ “Flutter - Beautiful native apps in record time”. flutter.dev. 2021年9月19日閲覧。 ^ “FAQ” (英語). flutter.dev. 2021年8月29日閲覧。 ^ “Firebase” (英語). flutter.dev. 2021年8月29日閲覧。 ^ “Deployment”. angulardart.dev. 2021年9月19日閲覧。 ^ Ladd, Seth (2013年3月28日). “Dart News & Updates: Why dart2js produces faster JavaScript code from Dart”. News.dartlang.org.. 2013年7月21日閲覧。 ^ “Dart Performance”. Dartlang.org.. 2017年1月3日時点のオリジナルよりアーカイブ。2013年7月21日閲覧。 ^ Another Hello World example hosted in Github ウィキメディア・コモンズには、Dartに関するメディアがあります。 日本語版ウィキブックスに本記事に関連した解説書・教科書があります。 Dart 公式ウェブサイト（英語） 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 日本リファレンス ユーザーディスカッショングループ