東 悟大(Godai Azuma)         @godai_0519         id:godai_0519闇鍋プログラミング勉強会 2012/03/31(土)
自己紹介• 本名: 東 悟大                 なんの捻りもない• Twitter: @godai_0519      質素なアイコン• Hatena: godai_0519• 所属: 国立東京工業高等専門学校(いわゆる高専)  ...
話すこととか•   Dartってなに?•   基本的なこと•   特徴•   ライブラリとか    – io    – dart:isolate• dartrefjp
Dartってなに?• Googleが2011年10月10日の「GOTOカンファレ  ンス」で公開した新しいWeb系言語。• 2012年3月31日現在、未だ開発中。(最新0.08)• Java・JavaScriptの影響を強く受けた考え方。• J...
Dartってなに?• 現在のWebアプリケーション開発 – スクリプト言語で開発したWebアプリケーションは、   デバッグ作業が非常に難しい。 – 作者以外がコードの維持することは困難。 – サーバーサイドで同一の言語を使用できない。   (...
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            – <int>[1, 2, 4, 8, 16]                    – const<int>[1, 2, 4, 8, 16...
リテラル• 文字列リテラル(1)   "Hello, Dart!"     // Hello, Dart!   Hello, Dart!     // Hello, Dart!   "Its Dart!"      // Its Dart!  ...
リテラル• 文字列リテラル(2)     – String Interpolation(文字列補間)        • $変数名 → 変数値        • ${式} → 式の結果 main() {  final int n = 256;  ...
型じゃあどんな型があるの?• int    : 整数型(...-3,-2,-1,0,1,2,3...)• double : 浮動小数点数型(3.1415926535... etc.)• String : 文字列型("a","abcdefghi"...
型• 5つのスーパーインターフェースの実装関係
関数• 戻り値の型 関数名(引数リスト){ 処理 } – 処理内にreturnで値を返す – return文がないとき、暗黙的にreturn null;が追加される  int square(int x) {    return x * x;  ...
クラス• コンストラクタでメンバを簡単に初期化• 演算子オーバーロード可能 class Point {   num x, y;   Point( [ num this.x, num this.y ] ); // ctor   Point ope...
クラス• 定数コンストラクタ• ファクトリーコンストラクタclass Point {  final num x, y;  const Point(this.x, this.y);                       // 定数コンストラ...
静的変数• トップレベル変数・static• ライブラリやクラス全体に関連付け – 特定のインスタンスだけでない• 明示的な型指定がない →Dynamic(var)• コンパイル時定数で初期化• 遅延初期化 – 静的変数が読まれて初めて初期化される
Dartの特徴
Optional typing• Dartの型付けは自由! – varを使って動的型付 – 型名を使って静的型付これにより、デバッグ作業が難しい問題と、大規模開発をしにくい問題を回避!
Optional typing変数宣言で型を指定するのは自由!• 静的型付 int      x = 256; String str = "Hello, Dart!";• 動的型付 var    x = 256; var   str = "He...
Optional typing関数宣言で型を指定するのは自由!• 静的型付   int square(int x) => x * x;   int twice(int x) => x + x;                  引数の型も• 動...
Optional typingジェネリックスの<>も自由!• 静的型付  List<int> prime = <int>[2, 3, 5, 7, 11, 13, 17];  Map<String,int> windows = <int>{"XP...
Dartの型チェック• プロダクションモード – 型チェックはwarningを発生させるだけ – 実行に影響の有るエラー検出 →例外発生 – 実行・パフォーマンス優先• チェックモード – 型チェックはコンパイル時と実行時に。 – 実行に影響の...
スナップショット• 特定の状態とコードをすべて記録・保存して  おくことが出来る• →起動の大きなスピードアップが見込める• 54000行のWebアプリでの実行テスト – スナップショット無しで640msで起動 – スナップショット有りで60m...
他の言語との違い• トップレベルでの関数定義が「推奨」 • 名前の衝突はプレフィックスを使って回避できる • ただし静的メンバのみのクラスも作成可能• 初期化されていない変数はnullである保証• クロージャに渡された変数の値は渡された時点のも...
メンバのカプセル化            フィールドに                       getter/setterで                                区別できない            直接アクセス  ...
ライブラリ•   (built-in)        •   html•   dart:core         •   io•   dart:coreimpl     •   json•   dart:isolate      •   uri...
io• ファイルI/O – File – Directory• HTTPアクセス – Socket – ServerSocket – HttpClient – HttpServer
ioよくサンプルにされる、使い古されたファイルコピーmain() { final String workingDir = new Directory.current().path;                                ...
io• HttpServer  – listen     • 動作ホスト・ポートを指定  – onRequest     • リクエストが来たときのハンドラーを指定  – onError     • エラー発生時に呼び出されるハンドラーを指定
io• HttpClient  – ホスト名やUriからHttpClientConnectionを生成• HttpClientConnection  – onError  – onRequest     • リクエスト送信時のハンドラーを指定 ...
void server() {  HttpServer service = new HttpServer();  service.listen("127.0.0.1", 8080);  service.onRequest = (HttpRequ...
io• ゆうとさん(@yutopp)はDartのHttpClientを  利用してこんなのを書きました。• いかにしておっぱい画像をダウンロードするか~  2012 Dart編 – http://yutopp.hateblo.jp/entry/...
Isolate• Dartのコードは全てIsolateで実行される ←ここ重要• 全てのIsolateは、シングルスレッド – Isolateを新たに起動し、マルチスレッド化可能 – 複数のIsolate間でsend/receive出来るのは単...
Isolate• トップレベルに ReceivePort get port();• ReceivePort  – いくつかのSendPortを持つ  – toSendPortよりSendPortを得られる  – 配信したSendPortから送信...
Isolatefunction() {  // call受け取り宣言  port.receive((msg, SendPort replyTo) {    for(int i=0; i<1000; ++i) {                 ...
Isolate• spawnFunction(void topLevelFunction())  – トップレベルに存在する関数からIsolateを生成する• spawnUri(String uri)  – URIより実行可能なコードのisol...
dartrefjp• Dartの日本語レファレンスサイト  – http://sites.google.com/site/dartrefjp/  – 英語公式の情報を日本語で提供• dartrefjp Google Group(現在14人)  ...
まとめ(?)
参考ページなど• Dart: Structured web apps | DartLang.org   – http://www.dartlang.org/   – http://news.dartlang.org/• dartrefjp   ...
ご清聴、ありがとうございました。
そして質疑応答
Upcoming SlideShare
Loading in …5
×

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

6,226 views

Published on

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,226
On SlideShare
0
From Embeds
0
Number of Embeds
2,902
Actions
Shares
0
Downloads
13
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

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

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

×