初心者にこそオススメしたい言語Dart

きっと皆様はじめまして:smirk:
まもなくプログラミング(学習)歴2年になります、ycrackといいます。以後よろしゅう:wink:

DartにはFlutterが話題になった頃から触り始めましたが、少し前まで `[ Dart Flutter 違い | 検索 ]` な状態だったので、拙いのはお許しを…:bow: ~~(Qiita自体慣れてないのもある)~~

# TL;DR
Dartはいいぞ:thumbsup:

- Fast (はやい)
- Simple (わかりやすい)
- Multiple (真のクロスプラットフォーム／他の言語のいいとこ取り)
- Beautiful (FlutterでキレイなUI)
- Promising (大統一言語になれるポテンシャル)

:star2:"**JavaっぽいJS**":star2:

# Dartを触ることになった経緯
:thinking:「プログラミングやるにはGitHub使えたほうがいいよね」
:triumph:「おっ[DroidKaigi2018のApp](https://github.com/DroidKaigi/conference-app-2018)に`welcome-contribute`とか`easy`とか付いてるissueがあるやん、やってみよ」
:hushed:「unofficialだけど[Flutter版(?)](https://github.com/konifar/droidkaigi2018-flutter)もあるのか」

→ Flutterを調べ始める → Dartを知ることになる

# Flutterって？
おそらくこのAdvent Calendar読んでる人はいらないかもだけど、一応。
多分Dartより先に耳に入るのはこっちだと思うので、こっちを先に。

## Flutterの概要
Flutterとは、クロスプラットフォームのアプリを作るフレームワークの一つです。
プログラミングには**Dartという言語**を使います。
なので、インストールするとDartも自動的に入ります。

## Flutterの特徴
### Fast development (素早い開発)
- ホットリロードが使えるので、ミリ秒レベルで確認できる

要は毎回重くて煩わしいbuildは、開発段階ではやらなくていいよ、って事らしい。
// でもUIとLogicが揃わないと動かないよね… :thinking:

### Expressive and flexible UI (表現力豊かで柔軟なUI)
- Material DesignとCupertino(iOS風デザイン)が標準で組み込まれている

UIのテーマとして成り立ってる、Material DesignやiOS Human Interfaceの完成度は当然高く、ライブラリを標準で使えるのは、UIの構築を非常に簡単にする上に、完成度の向上にも寄与している、と思います。:blush:

クロスプラットフォーム + ネイティブなフレームワークとして、Xamarin Nativeなんかと比較されたりする(のかな？)みたいですが、Xamarin NativeがそれぞれのOSに合わせたUIになるのに対し、Flutterでは**Materialで構築するとiOSでもMaterialになります**。

UXを考える上で、**全く同じUIに揃えられる**というのは凄まじいメリットになると思います。

また、FlutterのUIは**全てをWidget**として構築します。あのButtonも、あのAnimationも、あのPositionも、全てWidgetです。「WidgetのPropertyにWidgetが入る」というように**ネストが深くなりがち**です。この辺の好き嫌いは結構分かれそう。私はIDEで読みやすくなるので好きですけど。

### Native Performance
- 出力がネイティブなのでオーバーヘッドが小さい

Android向けはNDKで、iOS向けはLLVMでネイティブにAOTコンパイルされるので、ネイティブのパフォーマンスが得られる、らしいです。Debugモードではホットリロードを実現するためにVMを使っているんだそうで、少し動作が遅くなるとのこと。
// VMはどうやって動かしてるんだろう…？:thinking:

# Dartって？
Flutterの説明をしたところで、そもそもの疑問「Dartとはどんな言語や？」というところを。

## Dartの歴史
元はGoogleが2011年に発表した、~~あの忌々しい~~JavaScriptの代替を狙って作られた「Dash」という言語でした。DartVMのChromeへの統合を目論んだものの、Dart自体がなかなか普及せず、2015年にはVMの統合を正式に断念し、JavaScriptへのトラインスパイルへと舵を切ります。しかしその後、2017年にはMicrosoftが開発するTypeScriptがGoogle社内標準言語として承認され、Angularもこれを採用するなど、本来期待されていたWeb世界でもかなり逆風に晒される状況に置かれていました。

それが一変したのがDart2の発表と、その5日後のFlutterの発表です。
「言語を再起動する」と宣言し、型システムの強化や`new`,`const`の非必須化など、言語機能を大幅に強化した上で、**シングルコードでクロスプラットフォームを実現する**アプリフレームワークとしてFlutterを発表したのです。去る11月30日にはFlutterが正式版(v1.0.0)となり、言語だけでなくフレームワークも安定したものへと急激に成長を遂げています。

## DartとFlutterの関係
Flutterがあまりにも注目されているので「Dart = Flutter用言語」だと初期は思ってしまっていたのですが、あくまで「Flutterはフレームワーク」「Dartは言語」です。Flutterでアプリを作るのにDartを使うだけです。
~~パッケージのカタログサイトとか一緒だけど~~

## Dart for ...？
現段階では、

- モバイル向け「Flutter」
- ウェブ向け「Dart for the web」（またの名を「AngularDart」）
- コマンドラインorサーバー向け「Server-side Dart」

の3つがラインナップされています。
Node.jsでも強調されているメリットですが、フロントエンドからサーバーサイドまで、同じ言語で書くことが出来そうです。

しかし、Dartはそれだけには収まらないようです。

## Dartのこれから
12月4日、Googleがロンドンで開催した「Flutter Live '18」。そこでは今後も大きなポテンシャルがあることを示してくれました。FlutterをモバイルアプリだけではなくデスクトップやWebにも対応する*"Portable UI Toolkit"*とするというのです。

- 「[Flare](https://www.2dimensions.com/about-flare)」Powered by 2Dimensions : 2Dアニメーション作成ツール
- 「[Flutter Desktop Embedding](https://github.com/google/flutter-desktop-embedding)」 : デスクトップ向け
- 「[Hummingbird](https://github.com/dart-lang/hummingbird)」 : Flutter製アプリをWebアプリに変換

などが発表され、Flutterの再定義と更なる対応プラットフォームの広範化の方針が示されました。

# 初心者にこそオススメしたい言語Dart
~~タイトル回収。~~

現状のFlutterでもそうですが、今後予定されている「Flutter Desktop Embedding」や「Hummingbird」も、全て**シングルコードから生成される**というのです。そうです、これこそ**真のクロスプラットフォーム**じゃないですか。

FlutterはUIのためのものですが、Dart言語を使うのはこれだけではありません。AngularDartやServer-side Dartが居ます。そして生成物はWebならHTML/CSS/JS、それ以外ならネイティブと、各プラットフォームに最適なものになります。同一言語だけでなく、シングルコードからこれだけの生成物が得られるのは他に類を見ないと思います。

ntaooさんのお言葉を借りると、
> シングルコードベースでの大統一開発環境になろうという構想が現実味を帯びてきた
> [Flutter 1.0 安定版が発表された (Flutter Live キーノート 概要レポート) - ntaoo blog](https://ntaoo.hatenablog.com/entry/2018/12/05/091924)

のです。記事中ではこの頭に「クライアントサイドの」と付いているのですが、iOS向けバイナリがLLVMでコンパイルされることを考えると、Dartがクライアントサイドに限らず大統一言語になり得るポテンシャルを持っているのではないか？と思えてしまうのです。

そしてもっと基本的なメリットとして、学習コストの低さがあります。
元々JavaScriptの代替として誕生したこともあり、モダンなJavaScript(ES2015以降)に触れている人であれば、かなりすんなりと馴染めると思います。
あくまで個人的な所感なのですが、一言で言えば**「JavaっぽいJS」**です。JSのような軽さと、Javaのような補完がガシガシ効く気持ちよさが共存しています。それぞれの煩わしい所はかなり削られていて、欠点としては「定数のinitializeが面倒だな」と思ったぐらいで、文法は結構シンプルです。

importも、ファイルを直接指定するJSスタイルと、packageを指定するJavaスタイルの中間のような、`import 'package:<package>/<library>.dart' as hoge;`という感じです。

書き方がナウい方の「モダン」ではなく、これからの・先進的なという「モダン」な言語じゃないかと思います。

Dartをエントリー言語にすれば、Dart以外に目を向ける際にも、少しの変化で対応できると思います。

あなたの初めてを、これからの言語*Dart*にしませんか。