東 悟大(Godai Azuma)
@godai_0519
id:godai_0519闇鍋プログラミング勉強会 2012/03/31(土)
自己紹介
• 本名: 東 悟大• Twitter: @godai_0519• Hatena: godai_0519
• 所属: 国立東京工業高等専門学校(いわゆる高専)情報工学科(仮)配属 1年→情報工学科2年
• 年齢: 16歳
• 主な言語: C++,Dart-lang,C#,Java etc*
• C++好き(というか一番まともに書ける言語かもしれない)Boostとかも使ってたり
なんの捻りもない質素なアイコン
話すこととか
• Dartってなに?
• 基本的なこと
• 特徴
• ライブラリとか– io
– dart:isolate
• dartrefjp
Dartってなに?
• Googleが2011年10月10日の「GOTOカンファレ
ンス」で公開した新しいWeb系言語。
• 2012年3月31日現在、未だ開発中。(最新0.08)
• Java・JavaScriptの影響を強く受けた考え方。
• JavaScriptの解決できない言語上の問題点を解
決し、置き換えを目指す。
JavaScriptに有る解決できない言語上の問題点とは?
Dartってなに?
• 現在のWebアプリケーション開発
–スクリプト言語で開発したWebアプリケーションは、
デバッグ作業が非常に難しい。
–作者以外がコードの維持することは困難。
–サーバーサイドで同一の言語を使用できない。(Node.jsやGoogle Web Toolkitなどを除く)
– JavaScriptが性能の面で充分でない。
–大規模開発に向いていない。
Dartってなに?
• 設計目標
– Webのための「構造的で柔軟」な言語
– Javaのような「馴染みやすい」言語
–高パフォーマンスと高速な実行速度
–携帯からタブレット、ラップトップを含む幅広い環境で実行できる言語
–主要なブラウザ全てで実行できる言語
あれ?FirefoxやSafariが対応して
くれないと使えないんじゃね?
実行環境
• JavaScriptにクロスコンパイル
– dartc (Java製)
– frog (Dart製)
• Dart VM
– Dartium
• Dartboard
–簡単なDartコードをビルド
なんとなく解ったところで、簡単な事項を
さらっと見て行きましょう
Hello World
• Hello Worldはトップレベルのmainから
• 実行結果
main() {print('Hello, Dart!');
}
Hello, 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 }
リテラル
• 文字列リテラル(1)
"Hello, Dart!" // Hello, Dart!
'Hello, Dart!' // Hello, Dart!
"It's Dart!" // It's Dart!
'''複 // 複¥n数¥n行
数
行'''
'文字列¥n' //文字列¥n
@'文字列¥n' //文字列¥¥n
リテラル
• 文字列リテラル(2)
– String Interpolation(文字列補間)
• $変数名→変数値
• ${式} →式の結果
main() {final int n = 256;
print('n = $n'); // n = 256print('n/8 = ${n/8}'); // n/8 = 32
}
型
じゃあどんな型があるの?• int : 整数型(...-3,-2,-1,0,1,2,3...)• double : 浮動小数点数型(3.1415926535... etc.)• String : 文字列型("a","abcdefghi" etc.)• bool : 論理型( true , false )• List : リスト• Set : 集合• Queue : キュー• Map : 辞書• *
実はこれ全部、coreライブラリのインターフェースなんです。
型
• 5つのスーパーインターフェースの実装関係
関数
• 戻り値の型関数名(引数リスト){ 処理 }– 処理内にreturnで値を返す
– return文がないとき、暗黙的にreturn null;が追加される
• 戻り値の型関数名(引数リスト) => 式;
– 式の結果を戻り値として返す
int square(int x) {return x * x;
}
int square(int x) => x * x;
クラス
• コンストラクタでメンバを簡単に初期化
• 演算子オーバーロード可能
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
クラス
• 定数コンストラクタ
• ファクトリーコンストラクタ
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
静的変数
• トップレベル変数・static
• ライブラリやクラス全体に関連付け
–特定のインスタンスだけでない
• 明示的な型指定がない→Dynamic(var)
• コンパイル時定数で初期化
• 遅延初期化
–静的変数が読まれて初めて初期化される
Dartの特徴
• Dartの型付けは自由!
– varを使って動的型付
–型名を使って静的型付
これにより、
デバッグ作業が難しい問題と、
大規模開発をしにくい問題を回避!
Optional typing
変数宣言で型を指定するのは自由!
• 静的型付
• 動的型付
int x = 256;String str = "Hello, Dart!";
var x = 256;var str = "Hello, Dart!";
Optional typing
関数宣言で型を指定するのは自由!
• 静的型付
• 動的型付
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
ジェネリックスの<>も自由!
• 静的型付
• 動的型付
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
Dartの型チェック
• プロダクションモード– 型チェックはwarningを発生させるだけ
– 実行に影響の有るエラー検出 →例外発生
– 実行・パフォーマンス優先
• チェックモード– 型チェックはコンパイル時と実行時に。
– 実行に影響の有るエラー検出 →動作停止
main() {
int n = "Hello, Dart!"; // ※}
スナップショット
• 特定の状態とコードをすべて記録・保存しておくことが出来る
• →起動の大きなスピードアップが見込める
• 54000行のWebアプリでの実行テスト
–スナップショット無しで640msで起動
–スナップショット有りで60msで起動
他の言語との違い
• トップレベルでの関数定義が「推奨」
• 名前の衝突はプレフィックスを使って回避できる
• ただし静的メンバのみのクラスも作成可能
• 初期化されていない変数はnullである保証
• クロージャに渡された変数の値は渡された時点のものをキャプチャする。
var callbacks = [];for (var i = 0; i < 2; i++) {callbacks.add(() => print(i));
}callbacks.forEach((c) => c());
JavaScript
22 Dart
01
暗黙的暗黙的暗黙的暗黙的に定義
暗黙的暗黙的暗黙的暗黙的に定義
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;
}
ライブラリ
• (built-in)
• dart:core
• dart:coreimpl
• dart:isolate
• dom– JSとちょっと違うよ!
(多分)
• html
• io
• json
• uri
• utf
io
• ファイルI/O
– File
– Directory
• HTTPアクセス
– Socket
– ServerSocket
– HttpClient
– HttpServer
よくサンプルにされる、使い古されたファイルコピー
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
コピー先の用意
コピー元の用意
io
• HttpServer
– listen
• 動作ホスト・ポートを指定
– onRequest
• リクエストが来たときのハンドラーを指定
– onError
• エラー発生時に呼び出されるハンドラーを指定
io
• HttpClient
–ホスト名やUriからHttpClientConnectionを生成
• HttpClientConnection
– onError
– onRequest
• リクエスト送信時のハンドラーを指定
– onResponse
• レスポンスが帰ってきた時のハンドラーを指定
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)
io
• ゆうとさん(@yutopp)はDartのHttpClientを
利用してこんなのを書きました。
• いかにしておっぱい画像をダウンロードするか~2012 Dart編
– http://yutopp.hateblo.jp/entry/2012/03/23/114047
– http://goo.gl/qKd7g
Isolate
• Dartのコードは全てIsolateで実行される←ここ重要• 全てのIsolateは、シングルスレッド
– Isolateを新たに起動し、マルチスレッド化可能– 複数のIsolate間でsend/receive出来るのは単純な型
• オブジェクトの共有は行わず、有るのは通信のみ。• Isolateは未だ発展途中
– 現時点でIsolateクラスは非推奨となり、代わりとなるAPIが提供されています。
• 考え方が複雑です。 →誰かkwsk教えてください!
Isolate
• トップレベルに ReceivePort get port();
• ReceivePort–いくつかのSendPortを持つ
– toSendPortよりSendPortを得られる
–配信したSendPortから送信されたメッセージは登録されたコールバックに渡される
• SendPort– sendで対応したReceivePortを呼び出す
– さらにcallでは返信呼び出しの指定ができる
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);
}
Isolate
• spawnFunction(void topLevelFunction())
– トップレベルに存在する関数からIsolateを生成する
• spawnUri(String uri)
– URIより実行可能なコードのisolateを生成する
dartrefjp
• Dartの日本語レファレンスサイト– http://sites.google.com/site/dartrefjp/
– 英語公式の情報を日本語で提供
• dartrefjp Google Group(現在14人)– Dartに関する各種日本語の情報共有や意見交換
• DartJP / facebook group(現在18人)– 気軽に参加できる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
ご清聴、ありがとうございました。
そして質疑応答