Dartは、
Googleによって開発された
プログラミング言語であり、当初は「Dash」という名前で呼ばれていました。主にウェブアプリケーションや
モバイルアプリケーションのクライアント開発を目的として設計されましたが、サーバーやデスクトップアプリケーションの開発にも活用できる汎用性の高さが特徴です。
言語の特徴
Dartはオブジェクト指向言語であり、クラスベースの構造を持ち、ガベージコレクションによる自動メモリ管理を備えています。構文は
C言語に似ており、多くの開発者にとって馴染みやすいでしょう。また、インターフェイス、Mixin、抽象クラス、ジェネリクス、型推論など、現代的なプログラミングに必要な機能をサポートしています。
Dartの大きな特徴の一つは、ネイティブコードまたは
JavaScriptへのコンパイルが可能なことです。これにより、幅広いプラットフォームで実行できる柔軟性を実現しています。
歴史
Dartは、
JavaScriptの課題を解決し、より高いパフォーマンスと大規模プロジェクトに対応できる言語を目指して開発されました。2011年にデンマークで開催されたGOTOカンファレンスで初めて公開されました。
当初は、
JavaScriptに代わるウェブブラウザの
スクリプト言語として期待されていましたが、普及は進まず、一時はChromeへの仮想マシン統合も断念されました。しかし、
2018年に発表されたDart 2以降、強力な
型システムやネイティブコードコンパイル機能が追加され、言語としての進化を続けています。2023年にはDart 3が発表され、デフォルトでnull値を許容しない「Sound null safety」が導入されました。
用途
Dartのコードは、主に以下の4つの方法で実行できます。
1.
Web: Dartコードは
JavaScriptにコンパイルされ、主要なウェブブラウザ上で実行されます。`dart2js`
コンパイラを使用し、
JavaScriptコードに変換されます。このコンパイルにより、Dartコードはブラウザの互換性を保ちつつ、
JavaScriptで同等のコードを書くよりも高速に実行される場合があります。
2.
スタンドアローン: Dart SDKにはスタンドアローンのDart VMが含まれており、コマンドラインインターフェース(CLI)環境でDartコードを実行できます。SDK自体もDartで書かれており、パッケージマネージャーの`pub`や
コンパイラなどのツールも利用可能です。
3.
Ahead-of-timeコンパイル (AOT): Dartコードは、
機械語(ネイティブの命令セット)にAOTコンパイルできます。これは、モバイルアプリ開発フレームワークのFlutterで作成されたアプリが、AOTコンパイルされたDartコードとしてデプロイされる例が代表的です。
4.
ネイティブ: Dart 2.6からは、`dart2native`
コンパイラを使用して、自己完結型のネイティブ実行コードを生成できるようになりました。以前は、この機能はFlutter経由でのみ利用可能でした。
並行性
Dartは並行処理のために、メモリを共有しない独立したワーカーである「isolate」を使用します。これはErlangのプロセスに似ています。すべてのDartプログラムは少なくとも1つのメインisolateを持ちます。Dart 2からは、ウェブプラットフォームでのisolateのサポートが終了し、代わりにWeb Workerの使用が推奨されています。
スナップショット
Dart VMのコア要素であるスナップショットは、オブジェクトやランタイムデータをファイルとして保存する機能です。
- - スクリプトスナップショット: Dartプログラムはスナップショットファイルにコンパイルでき、事前に解析・実行準備されたコードと依存関係が含まれます。
- - フルスナップショット: Dartのコアライブラリはスナップショットとして保存でき、高速に読み込めます。Dart VMの標準配布版にはコアライブラリのプリビルドスナップショットが含まれています。
- - オブジェクトスナップショット: Dartでは、isolate間でのメッセージ受け渡しのためにオブジェクトのスナップショットをシリアライズ・デシリアライズします。
ネイティブモバイルアプリ
Googleは、AndroidとiOS向けのネイティブモバイルアプリ開発のためにFlutterを発表しました。Flutterは、Dartで書かれたモバイルアプリのビルドとデプロイを可能にするフレームワーク、ウィジェット、ツールを含むSDKです。Flutterは、Firebaseや他のモバイルアプリSDKと連携し、オープンソースで利用できます。
JavaScriptへのコンパイル
Dart SDKには、Dartから
JavaScriptへの
コンパイラが含まれています。開発中は、高速リフレッシュサイクルをサポートする`dartdevc`が使用されます。最終版のアプリでは、`dart2js`がデプロイ可能な
JavaScriptを生成します。
初期の
コンパイラは`dartc`でしたが、後に`Frog`に置き換えられました。現在の
コンパイラ`dart2js`はDartで書かれており、完全なDart言語仕様とセマンティクスを実装しています。
例
以下は、Dartのコード例です。
dart
void main() {
print('Hello, World!');
}
dart
int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
void main() {
print(fibonacci(10)); // Output: 55
}
dart
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print('My name is $name and I am $age years old.');
}
}
void main() {
var person = Person('Alice', 30);
person.introduce(); // Output: My name is Alice and I am 30 years old.
}
関連項目
外部リンク
Dartは、現代的な
プログラミング言語のニーズに応えるため、進化を続けています。その多用途性とパフォーマンスの高さから、今後も様々な分野での活躍が期待されます。