D言語 Language Update 2013

D言語 Advent Calendar 2013の最初の記事です．例年通り1年の間にあったD言語界隈の変更について書きます

現段階でのdmdの最新バージョンは2.064.2で，言語機能などはこれに従います．基本的な文法に関しては，以前書いた[基礎文法最速マスター](https://gist.github.com/2470712)を参考にしてみてください．

# 公式プロジェクト

## [dmd](https://github.com/D-Programming-Language/dmd)

自分が気になっている変更について，少しピックアップして書きます．型周りの改善や書きやすいシンタックスの追加など色々と改善されているので，全部追いたい方は[changelog](http://dlang.org/changelog.html)を上から読むと良いと思います！

### Windows 64bit環境のサポート

私はWindowsを使っていないので試してないのですが，64bitビルドのPhobosも同梱されていますし，チケットもresolvedになっているので，動くと思います．

### import package_nameによる一括import

D言語は今まで，あるライブラリにおいてこのモジュールをimportすれば最低限必要な感じで使える，というモジュールを提供する時に，ライブラリ側でfoo.allやfoo._という回避策が取られていました．が，ライブラリ作者がそれぞれの方法を取っていたので，ユーザが混乱するという結果になり，それを解決したのがこの機能です．

fooというライブラリに，foo/a.d，foo/b.dという2つのモジュールがあるとします．この時以下のようなfoo/package.dというファイル(package.dというのは固定です)を作ることで，ユーザ側は```import foo;```でfooライブラリが利用出来ます．

```d
module foo;

public import foo.a;
public import foo.b;
```

```d
import foo; // import foo._とかのad-hocな対応はいらない

foo_a_func();  // call foo.a's function
```

### foreachのindexがrefじゃなくなる

なぜか前までforeachで渡されるindexがrefで渡されていて，indexを使って計算しようと思っても，一度他の変数に代入する必要がありました．forなど他のループと動作を統一するための変更です．

```d
foreach (ref i, elem; arr) {
  // refをつければ昔の動作になる
}
```

### スライスはrvalue

そのまんまです．なぜか昔はスライスの結果がlvalueでした．そのため，影響がないのにref引数に渡せたりアドレスが取れたりして，なかなか怪しい挙動の元になっていました．

```d
void f(ref int[] a) {}

void main()
{
    int[] arr = [1, 2];
    f(arr[]);  // compilation error!
}
```

### 普通の関数とtemplateな関数のオーバーロード

D言語erがずっと切望していた機能ですね．

```d
import std.stdio;

auto foo(int n) { return 1; }
auto foo(T)(T t) { return 2; }

void main()
{
    writeln(foo(10));    // 1
    writeln(foo(10.0));  // 2
}
```

### templateが関数内に書ける

関数は出来ていたので，これも順当ですね．

```d
void f()
{
    template ArrayOf(T) { alias ArrayOf = T[]; }
    static assert(is(ArrayOf!int == int[]));
}
```


### UDA (User Defined Attribute)

@で指定するのに落ち着いた感じです．私が開発しているmsgpack-dも，以下のようにUDAを使うことでシリアライズするフィールドを選べるようにしています．

```d
struct Hoge
{
    string f1;
    @nonPacked int f2;
}
```

## [druntime](https://github.com/D-Programming-Language/druntime)

実はあまり大きな変更はありません．まぁコアの部分なので，バグフィックスや性能改善などが主です．

### 共有ライブラリの正式なサポートへの準備

今はrt_loadLibraryなどかなり低レベルなものしかないんですが，全ての環境でもう少しまともに共有ライブラリを扱えるように，という流れが起きています．
そのため，テストやそれらにまつわるCヘッダの追加など，色々と準備が進められています．

## [phobos](http://dlang.org/phobos/index.html)


以下新規追加・変更されたモジュールで重要そうだと思ったものです．これら以外にももちろん関数は追加されていますし，pureや@safeの追加など，様々な改善がなされています．

### [std.process](http://dlang.org/phobos/std_process.html)

以前までのstd.processは超貧弱だったのですが，新しいのはプロセスへの操作ができたり，pipe周りの機能が増えたり，シェル周りのユーティリティがついたりと，それなりに使えるようになりました．
ほぼ，一から書き直した感じです．

### [std.regex](http://dlang.org/phobos/std_regex.html)

regexでのマッチにおいて，"g"を引数で渡すという分かりづらいAPIだったのですが，matchFirstやmatchAllなどそもそも名前を分けることで分かりやすくしました．

また，コンパイルタイムに正規表現をパースしてエンジンを生成するctRegexが，ほぼランタイムと同じパターンを処理するようになりました．

### [std.uni](http://dlang.org/phobos/std_uni.html)

Unicodeを操作するためのモジュールです．気をつける必要があるのは，このモジュール自身はUTFのエンコーディングとかを扱うのではないということです．あくまで，Unicodeを操作するツール群が入っていて，これらを使ってライブラリやアプリケーションを書く，という形になります．

### [std.typecons](http://dlang.org/phobos/std_typecons.html)

後付けでinterfaceをオブジェクトにつけることが出来る，[wrap/unwrapが追加されました](http://dlang.org/changelog.html#wrap_unwrap)．サンプルコードを見た方が早いですね．

```d
import std.typecons;

interface IDrawable
{
    void drawLine(int x1, int y1, int x2, int y2);
}

class ImageDraw  // note: it does not inherit IDrawable.
{
    void drawLine(int x1, int y1, int x2, int y2) { }
}

void drawRect(IDrawable draw)
{
    draw.drawLine(  0,   0, 100,   0);
    // ...
}

void main()
{
    auto imageDraw = new ImageDraw();
    drawRect(imageDraw);  // error: can't call this, ImageDraw is not an IDrawable.

    // perform a structural cast.
    IDrawable i = wrap!IDrawable(imageDraw);
    drawRect(i);  // and now imageDraw can act as an IDrawable.
}
```

wrapするinterfaceの型は複数指定出来ます．

### [std.concurrency](http://dlang.org/phobos/std_concurrency.html)

ownerTidという，子スレッドから親スレッドにメッセージを投げるためのプロパティが追加されました．この辺は他の日に詳しく書きます．

```d
void fun() // not need Tid argument
{
    // ...
    ownerTid.send("Child");
}

void main()
{
    auto child = spawn(&fun);
    // ...
    string res = receiveOnly!string();
    assert(res == "Child");
}
```

## Deimos

細かい変更はよく追ってませんが，いくつかまたC bindingが追加されてました．

# その他のプロジェクト & イベント

## その他のコンパイラ

[gdc](https://github.com/D-Programming-GDC/GDC)と[ldc](https://github.com/ldc-developers/ldc)は相変わらず元気です．ldcはLLVMの[リリースノートでも言及されている](http://llvm.org/releases/3.3/docs/ReleaseNotes.html)ので，最近徐々にユーザが増えてる気もします．

## [code.dlang.org](http://code.dlang.org/)

D言語には今[Dub](https://github.com/rejectedsoftware/dub)というパッケージマネージャがあるのですが，それのコードリポジトリがこのドメインで管理されています．俺のmsgpackやmustachもここに登録されています．皆さんも，何かライブラリを作ったら，登録してみると良いと思います．

Dubに関しては「[D言語でビルドツールDUBを用いて便利なライブラリをより簡単に利用する](http://qiita.com/yasei_no_otoko/items/2724eebab10f5cd0a02f)」という記事も参照して見てください．

## [Visual-D](https://github.com/D-Programming-Language/visuald)

今では公式リポジトリの下に移動しています．まぁWindowsでD言語をやるならもうこれしかないのでは？という感じにシェアがありますね．

## [プログラミング言語Dの日本語書籍](http://books.shoeisha.co.jp/book/b108222.html)

[TDPL](http://erdani.com/index.php/books/tdpl/)の日本語版が翔泳社さんから「プログラミング言語D」という名前で出版されました．私と原さんが監訳として入っています．内容に関しては[私の記事で少し書いた](http://repeatedly.github.io/ja/2013/05/tdpl-japanese-edition/)ので，興味のある方は買ってみてください．

## [DConf 2013](http://dconf.org/2013/)

D言語カンファレンスがFacebookで開催されました．各コミッタ含め濃いメンバが集まって，色々と面白いプレゼンが開かれました．私自身も参加して，WalterやAndreiと話したり，他のメンバと実装の話しなど，楽しい時間を過ごせました．

来年も[DConf 2014](http://dconf.org/2014/)があるので，興味のある人は参加しましょう！

## [FacebookがD言語をプロダクションで利用開始](http://forum.dlang.org/thread/l37h5s$2gd8$1@digitalmars.com)

Andreiのチームが関わっている箇所で，D言語のコードをデプロイしたという話．元々あったC++のコードに比べ，コード行数が減り，かつパフォーマンスも上がったということで，今後新しいプロダクトや置き換えでD言語がちょくちょく使われるのではないかと思います．

ドイツではすでにD言語で分散ハッシュテーブルを作っていたり，アドシステムの裏で使っていたりという話もあるので，徐々にプロダクションでの利用例は増えて行きそうな気もしています．

# まとめ

ということで，簡単にまとめてみました．D2も機能が一段落して，操作性やシンタックス・パフォーマンスの改善，APIの整備など安定フェイズに入った感じもします．
それに加えPhobosへのモジュールの追加も随時行われているので，今後もよりプロダクションで必要になるであろう機能は追加されるのではないかと思います．

なんか思い出したら随時追加されるかもしれません．