読者です 読者をやめる 読者になる 読者になる

Dart事始

Dart

どこまで真剣なのかよく分からないDartであるが、Dartのアップデートブログはけっこう頻繁に更新されており、Dart VMを組み込んだChromiumがリリースされたという話を聞いて、少しは触ってみようという気になった。

SDKをダウンロードする

DartのSDKダウンロードページから自分のPlatformにあったSDKを取得する。

dart-modeを設定する

Google Codeかgithubからdart-mode.elを取得して、.emacsにdart-modeの設定を追加した。

;; Dart
(require 'dart-mode)
(add-to-list 'auto-mode-alist '("\\.dart$" . dart-mode))

ソースコードを取得する

SDKに含まれているdart, frogcがあればとりあえず試してみる分には十分だが、ソースコードには有用なサンプルも含まれているので、手元に置いておくことにする。

Dartのレポジトリ自体はsvnのようだが、gclientなるChromiumのビルドに使っているツールで取得するのが流儀らしく、先にgclient(depot_tools)を取得する。

下記のようにdepot_toolsのレポジトリからチェックアウトし、チェックアウトしたディレクトリにパスを通しておく。

$ svn co http://src.chromium.org/svn/trunk/tools/depot_tools
$ cd depot_tools
$ export PATH=`pwd`:$PATH

任意のディレクトリで、以下のコマンドを実行。

$ gclient config http://dart.googlecode.com/svn/trunk/deps/all.deps
$ gclient sync

Standalone VMをビルドする

ここまではMacで試していたのだが、64bitのLinux(Debian)でダウンロードしたSDKを実行すると、

dart-sdk/bin/dart: error while loading shared libraries: libcrypto.so.0.9.8: wrong ELF class: ELFCLASS64

のようなエラーが出ることに気がついた。これは配布されているdartのlinuxバイナリが32bit環境向けにビルドされているためであろう。

該当の32bit版の共有ライブラリをどこかからダウンロードしてくれば動くのかもしれないが、ここは自分でDart VMをビルドすることにチャレンジしてみる。

ソースコードを全部取得するとけっこう時間がかかるのと、何やらエラーが発生したような表示が出るのが気になったので、Standalone VMのソースコード取得手順で進める。

$ gclient config http://dart.googlecode.com/svn/trunk/deps/standalone.deps
$ gclient sync

ソースを取得したら、下記のようにbuild.pyを実行。64bit環境でビルドする時には--arch=x64がポイント。--mode=releaseでリリース用のビルド設定を追加した。--modeを省略するとデバッグ版のVMがビルドされる。

$ cd dart/runtime
$ ../tools/build.py --arch=x64 --mode=release

ビルドしたバイナリは out/Release_x64 に出力される。

最初のサーバーサイドプログラム

サンプルを眺めていたら、TCPソケットサーバーやHTTPベースのチャットアプリケーションの例などがあったので、Dartでもサーバーサイドプログラミングができることを知った。

試しにエコーサーバーを書いてみる。

#import("dart:io");

class EchoServer {
  final int _bufferSize = 1024;
  ServerSocket _serverSocket;
  Socket _receiveSocket;
  Socket _sendSocket;
  InputStream _inputStream;
  OutputStream _outputStream;
  List _receiveBuffer;

  EchoServer() {
    _receiveBuffer = new List(_bufferSize);
  }

  void run() {
    _serverSocket = new ServerSocket("127.0.0.1", 8123, 5);
    _serverSocket.connectionHandler = onConnect;
  }

  void onConnect(Socket connection) {
    _receiveSocket = connection;
    _inputStream = _receiveSocket.inputStream;
    _inputStream.dataHandler = receiveBytes;
    _outputStream = _receiveSocket.outputStream;
  }

  void receiveBytes() {
    int numBytes = _inputStream.readInto(_receiveBuffer, 0, _bufferSize);
    if (numBytes == 0) {
      return;
    }

    String msg = new String.fromCharCodes(_receiveBuffer.getRange(0, numBytes)).trim();
    if (msg == "quit") {
      _receiveSocket.close();
      _serverSocket.close();
    } else {
      _outputStream.writeFrom(_receiveBuffer, 0, numBytes);
    }
  }
}

void main() => new EchoServer().run();

構文やライブラリの使い方が分からない場合は

構文もライブラリの使い方も全然わからなくてきつい。

そんな時は、Dart Synonymに、よくあるコード断片のJavaScriptとDartの対応例があるのでここを読んで頑張る。

また、APIリファレンスも役に立つ。