Androidの新しい未来をDartで描く

この記事は[Shaping the Future of Android With Dart](http://cyrilmottier.com/2014/06/12/shaping-the-future-of-android-with-dart/)を、著者[Cyril Mottier](http://cyrilmottier.com/about/)の許可を得て日本語に訳したものです。

誤訳などあればコメントください。

-----------

私は先週、モダンな新興プログラミング言語について大量の議論、ツイート、ブログポスト、ニュース記事他を目にしました。この突然巻き起こった嵐が、アップルがWWDC 2014で公表した新言語Swiftによるものであることは疑いの余地がありません。この2週間の休暇の間、Swiftプログラミング言語について、構文、機能、Objective-Cとの相互運用性等について、多くの文書を読みました。また同時に、開発者の視点からAndroidがiOSと比べて時代遅れだと嘆く人達もみかけました。なぜでしょう？それはAndroidがJavaの上に成り立っているからです。

正直に言って、私も彼等の意見に同感です。私は昔から常々、GoogleはJavaをドブに捨て去り、別の言語に乗り換えるべきと主張してきました。でも実は、Appleが秘密裏にSwiftを開発し始めたのと時期を同じくして(2010年頃?)、Googleも代替するプログラミング言語の開発に従事していたと思っています。さて、そのモダンなプログラミング言語とは何？ある人は[Go](http://golang.org/)が最適だと思うでしょうが、私は[Dart](https://www.dartlang.org/)がより相応しいと考えます。休暇中にDartについて多くの記事を読み、勉強しました。Android用の言語としてGoよりもDartが多くの点で優れているように私の目には映ります。より自然で、(Javaのように)VMベースで、Googleのエコシステムにより良くフィットし、簡素さ維持しすることで非常に急峻な学習曲線を持っているからです。今こそGoogleはDartをAndroidの未来に、そして世界的な規模でDartを会社自身の未来にする時です。

###**Javaにはもう隠居部屋が**

私はJavaが大好きです。これは本当です。しかし、Javaは歳を取りました、もう引退する歳です。たとえJava 8がそのプログラミング言語の歴史の中で最大の革新だとしても、Javaは多くの足かせ、制約、問題を抱えています。このうち多くの問題は誕生時から存在し、そして後方互換性維持の為に今後も残ります。他方で、Dartはシンプルさを念頭に、ありがちで繰り返される問題点を解決すべく最初から作り上げられました。Dartはプログラミング工程の多くの課題を解決し、極めて強力で流暢にAPIの開発者を支援します。ここで、少しだけDartの基本的だがモダンな機能を紹介します。

* プリミティブ型はありません。Dartでは全てが```Object```です。```bool```(Javaの```boolean```)でさえも```Object```のひとつです。純粋なオブジェクト指向言語では全てが```Object```であるべきです。Javaのプリミティブ型は単なる実装上の枝葉末節です。
* 冗長でない構文。パブリックなコンパイル時定数を作るのにキーワード```const```が使えます。もう```public static final```と書く必要ありません。```public```や```private```キーワードも言語仕様にありません。変数、メソッド、クラスの可視性は命名規則に則ります。基本的は全てがパブリックですが、名前の先頭をアンダースコアにするとプライベートになります。
* 名前付きコンストラクタとファクトリーコンストラクタがあります。Javaではコンストラクタは```Rectangle()```のようなクラスと同じ名前のものでなければいけません。```Rectangle(int left, int top, int right, int bottom)```と```Rectangle(int left, int top, int width, int height)```の2つのコンストラクタをつ定義しようとするとコンパイル時エラーになります。これはJavaが引数群(の型)で複数のコンストラクタを区別しようとするためです。解決策の一つはファクトリクラスメソッドを定義することです。Dartはこの問題を名前付き(そして必要に応じてファクトリな)コンストラクタで解決しました。
* モダンな引数受け渡し:Dartは位置依存引数と名前指定引数をサポートします。どちらも実引数を省略可能で、デフォルト値を持つことも出来ます。
* まだまだあります。mixin、inplicit interface、isolate(簡便な並列実行モデル)

###**ソフトウェアを作るのは法律家ではなく開発者**
GoogleとOracleはAndroidでのJavaの利用について長いこと争ってきました。GoogleとOracleの公判は、おそらくコンピュータ近代史において最も重大な公判の一つとなるでしょう。2つの巨大企業の間で、私達は一時期の平和な時代に居るかのようです...冷戦かも知れませんが。言うまでもなく、競合が管理するプログラミング言語に依存し続けるという危険すぎる道をGoogleが進む必要はありません。明らかに、法的問題の脅威にさらされ続けるに値しません。

###**言語をコントロールして進化させよ**
物事を前に進めるために、Googleは彼等が使うプログラミング言語を完全にコントロールする必要があります。例えば、Java 8は長いことある種の聖杯のようでした。前々から(新機能についての)多くを聞かされてきました。そして、その多くの機能と拡張は延期されました。そして今になって、クロージャ他の何某かのモダンな機能とともにJava 8が登場です。おそらく、今後も長いことAndroidに実装されることはないでしょう...

利用する言語を自らコントロールすることで、Googleは必要なときにいつでもその言語を全てのプラットフォーム(モバイル、Web、サーバ)で継ぎ目なく維持し成長させることができます。Appleは過去、そして今もObjective-CやSwiftでうまくやってきました。たとえば、彼等は3年も前にObjective-Cにクロージャを導入しいます、単に自らObjective-Cを改良することで。最近ではARCとリテラル(訳注:@"mojimoji"等のこと?)を導入しました。Appleは言語をコントロールしています。彼等は言語を適切なタイミングで進化させています。DartのWebサイトにあるとおり、GoogleはDartで同じポジションにいます。

> DartはGoogleとその他の貢献によるオープンソースプロジェクトです。
>
> **The Dart website** - [www.dartlang.org/...](https://www.dartlang.org/) 

理論的には、上記引用は、だれでもソースコードにアクセスし、パッチや改良を提供することで言語(開発に)参加できることを意味しています。実際には、ちょうどAndroid Open Source Project(AOSP)がそうであるように、GoogleだけがDartをコントロールできます。なぜなら、このプロジェクトを管理し、前に進めるだけの十分なリソースを持っている会社はGoogleだけだからです。それでもDartがオープンソースで在り続け、他のコントリビュータの意見を聞いている限り、Googleが言語をコントロールすることを総合的に見て私個人は容認しています。

###**一つの言語で全てを統治**
DartをAndroidに導入することで、Google開発エコシステムに唯一残された隙間を埋めることが出来ます。既にWebとサーバにおいてDartでアプリケーションを開発できます。AndroidへのDartの移植が最後の積石になるでしょう。実際に全てのメジャープラットフォーム(モバイル、Web、サーバ)上で動作する唯一のプログラム言語になるでしょう。全てのソフトウェア会社が達成したい"write once, run everyware"モットーへ近づく一歩です。

最終的に、DartはGoogleが提供する開発言語をシンプルにする機会です。実際にGoogleは過去多くの言語で活動してきました。C++、Python、Java、JavaScript他。DartはGoogleのプロダクト群、サービスのSDK群をより整合して一貫したものにする、全ての言語が出会う交差点になり得ます。

###**Dartを宇宙にロケットランチ**
Dartは素晴らしく、いまや既に世に出て数年間が経過しています。残念ながら、DartはまだWeb開発における必然的なプログラミング言語と認識されるためのクリティカルマスに到達していません。これは主に、Web開発者達が乗り換えるだけの価値がある十分な進歩をもたらすと思っていない、という事実によります。DartをAndroidの標準言語にすることは、この言語を次のレベルに押し上げ、そして最終的にプログラミング言語の展望における一級市民に仕立てるための最良の方法です。

開発者に真新しい言語を使わせることは、最初は常に難しいことです。しかし、今学ぼうとしている言語が他のプラットフォームでも利用可能であると知れば、より良い動機付けになります。Androidの一開発者として、DartをAndroidで利用し、ちょっとしたWebサイトもいつでも簡単に作れるようになれば、とても幸せです。

###**結論**
DartをAndroidに推すことは、パフォーマンス、互換性や相互運用性等の種々の課題を解決するためにGoogleに多大な労力を期待することを意味します。当初はデスクトップのWebブラウザで動かす想定で設計されたDartをいかに制限のある機器でJavaの様に効率よく動かすか。いかにして新しいDartベースのアプリを大多数の機器で動くようにするか。Dart VMはAndroid 4.5(*1)以上にしか組み込めないのか。dart2dexユーティリティでアプリをDexに変換して動かすのか。どうやってJavaのAPIをDartから利用できるようにするのか。はたまたその逆は。それぞれの問の解答は困難ですが、課題を克服する賢い解決方法を見つけるのがGoogleの得意技です。もしあなたが私のようにAndroidはDartに乗り換えるべきと思うのであれば、Dartバグトラックの[issue #19266](http://dartbug.com/19266)にスターを付けることができます。Google I/Oはすぐそこまで来ています。私は6月25日のキーノートでGoogleがあかすAndroidの未来を聞くのを楽しみにしています。Googleよ、今こそ決断の時です。Javaを非推奨にしAndroidアプリのための新プログラミング言語としてDartを披露することで、新たな旅を共に始めようじゃありませんか。

-----------------

* *1 ただの推測です。私は次期Androidのバージョン番号を知りません。5.0かもしれませんが...頓着していません。単にクールで最新鋭の新機能を備えた新バージョンを期待しています。

---------------

###**訳者の感想**
この記事に90%同意です。
異論が有るのは下記です。

* 私は純粋オブジェクト指向派ではないので、Dartの魅力はそこではないだろう、とか思ってしまいます。
* I love Java. I really do.と言っていますが、著者は既に十分にJavaに幻滅していると思っています。Javaが引退する必要はなく、Dartが選択肢の一つになれば良いというのがGoogleのスタンスではないでしょか。
* 私はGoogle VS Oracleの裁判の行方を楽観視しています。
* Web開発者がDartの価値を認めていないというのが事実かどうか分かりませんし、十分な進歩をもたらしていると思っています。
* 著者はDexに変換の可能性があると言っていますが、著者も認める通りDart VMにこそメリットがあると思っています。
* Dartは当初からモバイルにおいて不意にプロセスが殺されることを想定してJavascriptより10倍高速に(再)起動するように設計されています。

GoogleはWeb至上主義者なのでChrome(WebView)内蔵VMの形でDartがAndroidに導入されると思っています。
ただし、ChromeへのDart VMを組込みむにはOilpanプロジェクトの完成を待つ必要がありそうです。
直接AndroidのAPIを叩けるDalvikと同じ位置付のDart VMの方が先にやってくるのではないでしょうか。

それにしても、Swiftの話題性はすごいですね。
話題性において、オープンなDartとiOS(とOS X)専用(今のところ)のSwiftでこれほど差を付くとは、にわかには信じられません。
Webアプリ開発者よりも、スマホアプリ開発者の方が圧倒的に多いということでしょうか。
だとすれば、確かにAndroidへの移植がDartにとっても最良のブレークスルーのチャンスなのかもしれません。

ちなみに、[issue #19266](http://dartbug.com/19266)にはスターを付けましたよ。

-----

###6/29追記
Google I/O 2014では17ものDart関連セッションがありましたが、Androidネイティブアプリ環境としてのDart VMの話は無かったようです。
全体的なトーンとしては、やはりと言うべきか、私の希望的観測に反して、HTML5でマルチスクリーンを統合する方向でしょうか。

* end-to-end appsではクライアントはJavascriptにコンパイルすることを想定しているようです。
* Chrome Dev Editorは今のところWebアプリのみが対象のようです。
* Dart EditorにRun on Mobileが追加されましたが、Javascriptにコンパイルしたものをデプロイするようです。DartのToolは軒並みJavaからDartにリライトされていますが、Java排除というよりもWebへの準備でしょうか。*1
* App EngineでDart VMが動くようになりました。DartのサーバサイドもWeb(Cloud)に向かっています。
* HTML Everywhereなんていうセッションもありました。
* Polymer関連が5セッション。Using Polymer with Dart and JavaScriptなんてセッションも。
* 他方で、残るAndroidのネイティブ環境はART(AOTコンパイラ)に移行しますが、Dart VMはJITですね。

----

###7/1追記
[Dartium Comes To Android](http://www.infoq.com/news/2014/06/dartium-android)なんて記事が。
Chrome with Dart Comes To Androidの方がやっぱり先か?
でも、中の人の発言が見つからない...

教えてもらいました、ありました。
[Dart News & Updates: Dart 1.5 makes it easier to develop for the mobile web](http://news.dartlang.org/2014/06/dart-15-makes-it-easier-to-develop-for.html)

-----

###7/2追記
*1  [Dart - "How we built Chrome Dev Editor with the Chrome platform" セッション要約 - Qiita:Bootstrapping](http://qiita.com/laco0416/items/9aef51decb2a20ba6080#1-7)
そうそう、このこと。