44
悟大(Godai Azuma) @godai_0519 id:godai_0519 闇鍋勉強会 2012/03/31()

2012-03-31 闇鍋の中に投げ込むDartの矢

Embed Size (px)

Citation preview

Page 1: 2012-03-31 闇鍋の中に投げ込むDartの矢

東 悟大(Godai Azuma)

@godai_0519

id:godai_0519闇鍋プログラミング勉強会 2012/03/31(土)

Page 2: 2012-03-31 闇鍋の中に投げ込むDartの矢

自己紹介

• 本名: 東 悟大• Twitter: @godai_0519• Hatena: godai_0519

• 所属: 国立東京工業高等専門学校(いわゆる高専)情報工学科(仮)配属 1年→情報工学科2年

• 年齢: 16歳

• 主な言語: C++,Dart-lang,C#,Java etc*

• C++好き(というか一番まともに書ける言語かもしれない)Boostとかも使ってたり

なんの捻りもない質素なアイコン

Page 3: 2012-03-31 闇鍋の中に投げ込むDartの矢

話すこととか

• Dartってなに?

• 基本的なこと

• 特徴

• ライブラリとか– io

– dart:isolate

• dartrefjp

Page 4: 2012-03-31 闇鍋の中に投げ込むDartの矢

Dartってなに?

• Googleが2011年10月10日の「GOTOカンファレ

ンス」で公開した新しいWeb系言語。

• 2012年3月31日現在、未だ開発中。(最新0.08)

• Java・JavaScriptの影響を強く受けた考え方。

• JavaScriptの解決できない言語上の問題点を解

決し、置き換えを目指す。

JavaScriptに有る解決できない言語上の問題点とは?

Page 5: 2012-03-31 闇鍋の中に投げ込むDartの矢

Dartってなに?

• 現在のWebアプリケーション開発

–スクリプト言語で開発したWebアプリケーションは、

デバッグ作業が非常に難しい。

–作者以外がコードの維持することは困難。

–サーバーサイドで同一の言語を使用できない。(Node.jsやGoogle Web Toolkitなどを除く)

– JavaScriptが性能の面で充分でない。

–大規模開発に向いていない。

Page 6: 2012-03-31 闇鍋の中に投げ込むDartの矢

Dartってなに?

• 設計目標

– Webのための「構造的で柔軟」な言語

– Javaのような「馴染みやすい」言語

–高パフォーマンスと高速な実行速度

–携帯からタブレット、ラップトップを含む幅広い環境で実行できる言語

–主要なブラウザ全てで実行できる言語

Page 7: 2012-03-31 闇鍋の中に投げ込むDartの矢

あれ?FirefoxやSafariが対応して

くれないと使えないんじゃね?

Page 8: 2012-03-31 闇鍋の中に投げ込むDartの矢

実行環境

• JavaScriptにクロスコンパイル

– dartc (Java製)

– frog (Dart製)

• Dart VM

– Dartium

• Dartboard

–簡単なDartコードをビルド

Page 9: 2012-03-31 闇鍋の中に投げ込むDartの矢

なんとなく解ったところで、簡単な事項を

さらっと見て行きましょう

Page 10: 2012-03-31 闇鍋の中に投げ込むDartの矢

Hello World

• Hello Worldはトップレベルのmainから

• 実行結果

main() {print('Hello, Dart!');

}

Hello, Dart!

Page 11: 2012-03-31 闇鍋の中に投げ込むDartの矢

リテラル

• nullリテラル– null

• 真偽値リテラル– true– false

• 数値リテラル– 255– 0xff– 0xFF– 25500e-2– 255.00

• リストリテラル– <int>[1, 2, 4, 8, 16]– const<int>[1, 2, 4, 8, 16]

• マップリテラル– <int>

{ "Hello" : 1,"Dart" : 2,"!!" : 3 }

– const<int>{ "Hello" : 1,

"Dart" : 2,"!!" : 3 }

Page 12: 2012-03-31 闇鍋の中に投げ込むDartの矢

リテラル

• 文字列リテラル(1)

"Hello, Dart!" // Hello, Dart!

'Hello, Dart!' // Hello, Dart!

"It's Dart!" // It's Dart!

'''複 // 複¥n数¥n行

行'''

'文字列¥n' //文字列¥n

@'文字列¥n' //文字列¥¥n

Page 13: 2012-03-31 闇鍋の中に投げ込むDartの矢

リテラル

• 文字列リテラル(2)

– String Interpolation(文字列補間)

• $変数名→変数値

• ${式} →式の結果

main() {final int n = 256;

print('n = $n'); // n = 256print('n/8 = ${n/8}'); // n/8 = 32

}

Page 14: 2012-03-31 闇鍋の中に投げ込むDartの矢

じゃあどんな型があるの?• int : 整数型(...-3,-2,-1,0,1,2,3...)• double : 浮動小数点数型(3.1415926535... etc.)• String : 文字列型("a","abcdefghi" etc.)• bool : 論理型( true , false )• List : リスト• Set : 集合• Queue : キュー• Map : 辞書• *

実はこれ全部、coreライブラリのインターフェースなんです。

Page 15: 2012-03-31 闇鍋の中に投げ込むDartの矢

• 5つのスーパーインターフェースの実装関係

Page 16: 2012-03-31 闇鍋の中に投げ込むDartの矢

関数

• 戻り値の型関数名(引数リスト){ 処理 }– 処理内にreturnで値を返す

– return文がないとき、暗黙的にreturn null;が追加される

• 戻り値の型関数名(引数リスト) => 式;

– 式の結果を戻り値として返す

int square(int x) {return x * x;

}

int square(int x) => x * x;

Page 17: 2012-03-31 闇鍋の中に投げ込むDartの矢

クラス

• コンストラクタでメンバを簡単に初期化

• 演算子オーバーロード可能

class Point {num x, y;Point( [ num this.x, num this.y ] ); // ctorPoint operator+(Point other)=> new Point(this.x + other.x, this.y + other.y);

}

~~~Point point1 = new Point(5, 19); // point1.x == 5, point1.y == 19Point point2 = new Point(3, 31); // point2.x == 3, point2.y == 31Point point3 = point1 + point2; // point3.x == 8, point3.y == 50

Page 18: 2012-03-31 闇鍋の中に投げ込むDartの矢

クラス

• 定数コンストラクタ

• ファクトリーコンストラクタ

class Point {final num x, y;const Point(this.x, this.y); // 定数コンストラクタfactory Point.createOrigin() => const Point(0, 0); // ファクトリーctor

}

~~~Point point1 = const Point(5, 19); // point.x == 5, point.y == 19Point point2 = new Point.createOrigin(); // point.x == 0, point.y == 0

Page 19: 2012-03-31 闇鍋の中に投げ込むDartの矢

静的変数

• トップレベル変数・static

• ライブラリやクラス全体に関連付け

–特定のインスタンスだけでない

• 明示的な型指定がない→Dynamic(var)

• コンパイル時定数で初期化

• 遅延初期化

–静的変数が読まれて初めて初期化される

Page 20: 2012-03-31 闇鍋の中に投げ込むDartの矢

Dartの特徴

Page 21: 2012-03-31 闇鍋の中に投げ込むDartの矢

• Dartの型付けは自由!

– varを使って動的型付

–型名を使って静的型付

これにより、

デバッグ作業が難しい問題と、

大規模開発をしにくい問題を回避!

Optional typing

Page 22: 2012-03-31 闇鍋の中に投げ込むDartの矢

変数宣言で型を指定するのは自由!

• 静的型付

• 動的型付

int x = 256;String str = "Hello, Dart!";

var x = 256;var str = "Hello, Dart!";

Optional typing

Page 23: 2012-03-31 闇鍋の中に投げ込むDartの矢

関数宣言で型を指定するのは自由!

• 静的型付

• 動的型付

int square(int x) => x * x;int twice(int x) => x + x;

square(x) => x * x;twice(x) => x + x;

戻り値の型も省略OK

引数の型も省略OK

String型はoperator+が定義されているのでtwiceの引数にとれます

Optional typing

Page 24: 2012-03-31 闇鍋の中に投げ込むDartの矢

ジェネリックスの<>も自由!

• 静的型付

• 動的型付

List prime = [2, 3, 5, 7, 11, 13, 17];Map windows = {"XP": 2001, "7": 2009};

List<int> prime = <int>[2, 3, 5, 7, 11, 13, 17];Map<String,int> windows = <int>{"XP": 2001, "7": 2009};

ジェネリックスの<>も省略OK

リテラルの<>も省略OK

<>を省略した場合、<Dynamic>を指定したことと同義

Optional typing

Page 25: 2012-03-31 闇鍋の中に投げ込むDartの矢

Dartの型チェック

• プロダクションモード– 型チェックはwarningを発生させるだけ

– 実行に影響の有るエラー検出 →例外発生

– 実行・パフォーマンス優先

• チェックモード– 型チェックはコンパイル時と実行時に。

– 実行に影響の有るエラー検出 →動作停止

main() {

int n = "Hello, Dart!"; // ※}

Page 26: 2012-03-31 闇鍋の中に投げ込むDartの矢

スナップショット

• 特定の状態とコードをすべて記録・保存しておくことが出来る

• →起動の大きなスピードアップが見込める

• 54000行のWebアプリでの実行テスト

–スナップショット無しで640msで起動

–スナップショット有りで60msで起動

Page 27: 2012-03-31 闇鍋の中に投げ込むDartの矢

他の言語との違い

• トップレベルでの関数定義が「推奨」

• 名前の衝突はプレフィックスを使って回避できる

• ただし静的メンバのみのクラスも作成可能

• 初期化されていない変数はnullである保証

• クロージャに渡された変数の値は渡された時点のものをキャプチャする。

var callbacks = [];for (var i = 0; i < 2; i++) {callbacks.add(() => print(i));

}callbacks.forEach((c) => c());

JavaScript

22 Dart

01

Page 28: 2012-03-31 闇鍋の中に投げ込むDartの矢

暗黙的暗黙的暗黙的暗黙的に定義

暗黙的暗黙的暗黙的暗黙的に定義

class Container {String str;// String get str() => str;// void set str(String s) {// str = s;// }

}

class Container {Container(this.str);final String str;// String get str() => str;

}

メンバのカプセル化

フィールドにフィールドにフィールドにフィールドに直接アクセス直接アクセス直接アクセス直接アクセス

getter/setterで

アクセス区別できない

class Container {String str;// String get str() => str;// void set str(String s) {// str = s;// }

}

class Container {Container(this.str);final String str;// String get str() => str;

}

Page 29: 2012-03-31 闇鍋の中に投げ込むDartの矢

ライブラリ

• (built-in)

• dart:core

• dart:coreimpl

• dart:isolate

• dom– JSとちょっと違うよ!

(多分)

• html

• io

• json

• uri

• utf

Page 30: 2012-03-31 闇鍋の中に投げ込むDartの矢

io

• ファイルI/O

– File

– Directory

• HTTPアクセス

– Socket

– ServerSocket

– HttpClient

– HttpServer

Page 31: 2012-03-31 闇鍋の中に投げ込むDartの矢

よくサンプルにされる、使い古されたファイルコピー

main() {final String workingDir = new Directory.current().path;

final File inputFile = new File("${workingDir}/input.txt");final InputStream istream = inputFile.openInputStream();

final File outputFile = new File("${workingDir}/output.txt");final OutputStream ostream = outputFile.openOutputStream();

istream.pipe(ostream);ostream.onClosed = () => istream.close();

}

io

コピー先の用意

コピー元の用意

Page 32: 2012-03-31 闇鍋の中に投げ込むDartの矢

io

• HttpServer

– listen

• 動作ホスト・ポートを指定

– onRequest

• リクエストが来たときのハンドラーを指定

– onError

• エラー発生時に呼び出されるハンドラーを指定

Page 33: 2012-03-31 闇鍋の中に投げ込むDartの矢

io

• HttpClient

–ホスト名やUriからHttpClientConnectionを生成

• HttpClientConnection

– onError

– onRequest

• リクエスト送信時のハンドラーを指定

– onResponse

• レスポンスが帰ってきた時のハンドラーを指定

Page 34: 2012-03-31 闇鍋の中に投げ込むDartの矢

void server() {HttpServer service = new HttpServer();service.listen("127.0.0.1", 8080);service.onRequest = (HttpRequest req,HttpResponse res){

StringBuffer buffer = new StringBuffer();req.inputStream.onData = () => buffer.add(new String.fromCharCodes(req.inputStream.read()));req.inputStream.onClosed = () {print("Catched: ${buffer.toString()}");res.outputStream.writeString('Re: ${buffer.toString()}');res.outputStream.close();

};};

}

void client() {HttpClient client = new HttpClient();HttpClientConnection connection = client.open("POST", "127.0.0.1", 8080, "/");

connection.onRequest = (HttpClientRequest req) {req.outputStream.writeString("Hello, Dart!");req.outputStream.close();

}; connection.onResponse = (HttpClientResponse res) {

StringBuffer buffer = new StringBuffer();res.inputStream.onData = () => buffer.add(new String.fromCharCodes(res.inputStream.read()));res.inputStream.onClosed = () => print("Returned: ${buffer.toString()}");

};}

Catched: Hello, Dart!Returned: Re: Hello, Dart!

実行結果(server → client)

Page 35: 2012-03-31 闇鍋の中に投げ込むDartの矢

io

• ゆうとさん(@yutopp)はDartのHttpClientを

利用してこんなのを書きました。

• いかにしておっぱい画像をダウンロードするか~2012 Dart編

– http://yutopp.hateblo.jp/entry/2012/03/23/114047

– http://goo.gl/qKd7g

Page 36: 2012-03-31 闇鍋の中に投げ込むDartの矢

Isolate

• Dartのコードは全てIsolateで実行される←ここ重要• 全てのIsolateは、シングルスレッド

– Isolateを新たに起動し、マルチスレッド化可能– 複数のIsolate間でsend/receive出来るのは単純な型

• オブジェクトの共有は行わず、有るのは通信のみ。• Isolateは未だ発展途中

– 現時点でIsolateクラスは非推奨となり、代わりとなるAPIが提供されています。

• 考え方が複雑です。 →誰かkwsk教えてください!

Page 37: 2012-03-31 闇鍋の中に投げ込むDartの矢

Isolate

• トップレベルに ReceivePort get port();

• ReceivePort–いくつかのSendPortを持つ

– toSendPortよりSendPortを得られる

–配信したSendPortから送信されたメッセージは登録されたコールバックに渡される

• SendPort– sendで対応したReceivePortを呼び出す

– さらにcallでは返信呼び出しの指定ができる

Page 38: 2012-03-31 闇鍋の中に投げ込むDartの矢

function() {// call受け取り宣言port.receive((msg, SendPort replyTo) {for(int i=0; i<1000; ++i) {print("${msg}: $i");

}replyTo.send("Completed ${msg}-function");

});

// ここはcallを待たずして実⾏されるコードprint("Ready!");

}

実⾏結果Ready!Ready!two: 0two: 1one: 0one: 1one: 2two: 2~~~two: 998two: 999Completed two-functionone: 341one: 342~~~one: 998one: 999Completed one-function

Isolate

main() {// 関数からSendPortを作るSendPort oneSendPort = spawnFunction(function);SendPort twoSendPort = spawnFunction(function);

// SendPortからcallし、replyはprintで受け取るoneSendPort.call("one").then(print);twoSendPort.call("two").then(print);

}

Page 39: 2012-03-31 闇鍋の中に投げ込むDartの矢

Isolate

• spawnFunction(void topLevelFunction())

– トップレベルに存在する関数からIsolateを生成する

• spawnUri(String uri)

– URIより実行可能なコードのisolateを生成する

Page 40: 2012-03-31 闇鍋の中に投げ込むDartの矢

dartrefjp

• Dartの日本語レファレンスサイト– http://sites.google.com/site/dartrefjp/

– 英語公式の情報を日本語で提供

• dartrefjp Google Group(現在14人)– Dartに関する各種日本語の情報共有や意見交換

• DartJP / facebook group(現在18人)– 気軽に参加できるDartの日本語グループ

• 協力者求むっ!

Page 41: 2012-03-31 闇鍋の中に投げ込むDartの矢

まとめ(?)

Page 42: 2012-03-31 闇鍋の中に投げ込むDartの矢

参考ページなど

• Dart: Structured web apps | DartLang.org– http://www.dartlang.org/– http://news.dartlang.org/

• dartrefjp– http://sites.google.com/site/dartrefjp/

• What is Dart? - O'Reilly Media– http://shop.oreilly.com/product/0636920025887.do

• 本の虫– http://cpplover.blogspot.jp/

• InfoQ: Google Dartのエッセンス(ry– http://www.infoq.com/jp/articles/google-dart

Page 43: 2012-03-31 闇鍋の中に投げ込むDartの矢

ご清聴、ありがとうございました。

Page 44: 2012-03-31 闇鍋の中に投げ込むDartの矢

そして質疑応答