D言語 Language Update 2012


[D言語 Advent Calendar 2012](http://qiita.com/advent-calendar/2012/d)の最初の記事です．他の皆さんが技術的なことを書いてくれると思うので，この記事はLanguage Updateっぽいものにします．2010年Advent Calenderでそれっぽいのを書いていたので，2012年までの2年間での変更について書きます．

全部書くと死ねるので，公式のプロジェクトとサードパーティで主要なものについて書きます．目安として，現段階でのdmdの最新バージョンは2.060です．また基本的な文法に関しては，以前書いた[基礎文法最速マスター](https://gist.github.com/2470712)を参考にしてみてください．

# 公式プロジェクト

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

### D1サポートの終了

2012年を持ってD1とはおさらばになります．皆さんお疲れ様でした！これでD2に開発リソースが一本化されます．

### 64bit対応

Windows以外，全て64bitコードを吐けるようになりました．今現在，gitのHEADではWindowsの64bit対応が進められており，次のバージョンから公式にサポートされる予定です．

### CTFE

クラス，例外，ポインタなどなど，コンパイルタイムの処理で必要そうなものはほとんど対応しました．なので呼び出す関数にもよりますが，今は大抵のコードがコンパイルタイム/ランタイムの両方で動く感じになっています．

### UFCS

今まで配列だけだったUFCSが，全ての型で使えるようになりました．

```d
// void func(int x)という関数に対して，以下は同じ
func(1);
1.func();
```

これで，組み込み型とユーザ定義型にとらわれず，統一的に呼び出すことが出来るようになります．Rubyのメソッドチェーンみたく```obj.func1.func2```みたいに書いてる人も結構居ます．

これは日本人dmdコミッタである[@9rnsr](http://qiita.com/users/9rnsr)さんの成果でもあります！

### 新しい属性

@safe, @trusted, @system，@propertyなど，いくつかの重要な属性が付与出来るようになりました．後述するUDAとは違い，これらは組み込みです．

@safeは未定義動作を起こさないことを静的にチェックするための属性になります．デフォルトはチェックしない@systemになっており，@trustedは@safeと@systemの橋渡しをするような役目になります．
@propertyは，変数のように扱いたい関数に付与することで，()を省略出来るようになります．メンバ関数のみならず普通の関数にもつけられるので，UFCSと絡めて後付けでそれっぽい処理が書けます．

### UDA (User Defined Attribute)

上記の@safeなどは組み込みですが，ユーザがこれらを定義出来るように先月なりました．といっても[Walterがいきなりアナウンス](http://forum.dlang.org/thread/k7afq6$2832$1@digitalmars.com)した感じなので，将来どうなるのかはまだ俺も分かってない状態です．今現在フォーラムでも，かなりスレッドが伸びています．

### 型や属性の推論

pureやnothrowや@safeなど勝手に推論されるので，templateなどを使って定義の段階で関数の属性が決定出来ない場合でも，instantiationの時にpureなどが付加されるようになっています．

### lambda syntax

```d
(x) { return x; }
```

を

```d
x => x
```

と書けるようになりました．Rangeの引数などで活躍します．

### 予約後の変更

typedef, invariantなど，いくつかの予約後が非推奨になっています．また配列のスライス([1..10])の中で使えていた特殊変数lengthは$(opDollar)に置き換えられました．

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

dmdの変更への追従や，GCやスレッド周りの改善が主です．

### 環境依存ヘッダの追加

SolarisやFreeBSD向けのヘッダが増えています．その他epollなど含め，各環境毎のヘッダに関して色々と変更が入ってます．

### [core.simd](https://github.com/D-Programming-Language/druntime/blob/master/src/core/simd.d)

名前の通りSIMDを使うためのモジュールです．気がつけば入ってました．

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

昔実装されて名前がコーディングスタイルに従ってなかったものや，パフォーマンスがあれだったものなど，かなりの実装が多数のコントリビュートによって改善されました．
また新しく導入されるモジュールはRangeコンセプトを中心に構築されており，まとまりのあるライブラリになりつつあります．

以下新規追加されたモジュールです．

### [std.csv](https://github.com/D-Programming-Language/phobos/blob/master/std/csv.d)

名前の通りCSVを扱うモジュールです．CSVと言えば壊れているので有名ですが，どこまで壊れたCSVを扱えるのかは分かってません．

### [std.datetime](https://github.com/D-Programming-Language/phobos/blob/master/std/datetime.d)

std.date / std.dataparse / std.gregorianといった乱立していたモジュールを置き換える新しいモジュールです．今では広く使われているモジュールとなっています．

### [std.parallelism](https://github.com/D-Programming-Language/phobos/blob/master/std/parallelism.d)

Taskベースの並列処理機能を提供します．std.concurrencyのような協調処理が必要なく，単に並列化したい場合などはこちらの方が楽です．[某ダウンローダ](https://gist.github.com/2114104)でもparallelを挟んでダウンロードを並列化したりしてます．

これをベースにいくつかのアルゴリズムを並列化した[parallel_algorithm](https://github.com/dsimcha/parallel_algorithm)というのも提案されていましたが，開発者がpendingしている状態です．

### [std.regex](https://github.com/D-Programming-Language/phobos/blob/master/std/regex.d)

GSoCの成果だったFReDがPhobosに取り込まれました．Unicodeサポートに加え，コンパイルタイムに正規表現をパースして高速な処理エンジンを生成する機能もついています．

### [std.net.curl](https://github.com/D-Programming-Language/phobos/blob/master/std/net/curl.d)

現状HTTPライブラリがないPhobosですが，curlのラッパーが入りました．curlが環境に入っていれば，これらを使ってHTTPやFTPを喋ることが出来ます．
俺も[ArangoDBドライバ](https://github.com/repeatedly/reed)では今現在これを使っています．細かな操作ができないのがネックですが，ｻｸｯと使えるので便利です．

## Deimos

これは皆がよく使うCラッパーを公式として統一的なフォーマットで，リポジトリを用意しようというものです．[D-Programming-Deimos](https://github.com/D-Programming-Deimos)のアカウントに多数のリポジトリがあります．これからもきっと増えて行くでしょう

# サードパーティ

## その他のコンパイラ

[gdc](https://github.com/D-Programming-GDC/GDC)と[ldc](https://github.com/ldc-developers/ldc)ともに元気で，すぐに最新版に追従しています．gdcに関しては，gccに入れようという話や，gdcを使ってiPhoneやAndroidでD言語を使おうとしている人もおり，それなりにユーザがついているようです．

## [vibe.d](http://vibed.org/)

颯爽と現れたWebアプリケーションフレームワークです．Fiberとイベント駆動を駆使して書かれており，IOCPを使っているのでちゃんとWindowsでも動きます．コンパイルタイムテンプレートエンジンに始まり，MongoDBやRedisのアダプタがついていたりと，かなり頑張っているプロジェクトです．

これに関しては16日に[@kyubuns](http://qiita.com/users/kyubuns)が書いてくれる予定です．

## [mustache](https://github.com/repeatedly/mustache4d)

俺のプロジェクトですが，mustacheというテンプレートエンジンのD言語実装です．D言語にテンプレートエンジンがなかったので書いたんですが，ちょくちょく使われているようです

## [Thrift](http://thrift.apache.org/)

これもGSoCの成果ですが，Apache Thriftと呼ばれる多言語間通信のためのプロジェクトに，[D言語が追加されました](http://svn.apache.org/viewvc/thrift/trunk/lib/d/)．AndreiがFacebookのThriftスペシャリストをつれて来てメンターにしたという，かなりの力作です．
多言語間でのシリアライゼーションだと，俺が開発している[msgpack-d](https://github.com/msgpack/msgpack-d)やstd.jsonもありますが，ThriftはIDLという定義ファイルが必要になりRPCがメインなのが，主に違う所です．

## [ctpg](https://github.com/youkei/ctpg)

コンパイルタイムパーサジェネレータです．これに関しては作者の[@youxkei](http://qiita.com/users/youxkei)が書いてくれる予定です．実はD言語にはこの手のライブラリがいくつかあって，Andrei先生も興味を持っていたりします．

## [DPaste](http://dpaste.dzfl.pl/)

これはD言語に特化したオンライン実行環境です．dmd/gdc/ldcという主要コンパイラが使えるのに加え，gitのHEADも試せるという，かなり有り難いサイトになっています．

# 今後

## マクロ

macroという予約語がずっと入ってます．D言語のASTを弄れるようになると思うのですが，1回Walterのプレゼンに出てきただけで，実際どうなるのかはWalterの頭の中にあります．実際UDAで色々やろうとすると，この手の機能が必要になると思われます(現在のUDAではpureや@safeを多分再実装出来ない)．

## Precise GC

ついにWalter and Andreiがやる気になりました．一応druntimeの開発はコツコツと進んでいます．ですが，D言語のような言語の場合，真面目に速度も考慮してやるならコンパイラの助けが必須なはずなので，ここはWalterに掛かっていると思われます．

## 新モジュール

UUIDを生成する[std.uuid](https://github.com/D-Programming-Language/phobos/blob/master/std/uuid.d)，sha1などのダイジェストを扱う[std.digest](https://github.com/D-Programming-Language/phobos/tree/master/std/digest)は次のバージョンからPhobosで提供されます．

今後レビュー対象になっているのは，std.benchmarkが最有力です．その他std.containerで必須となるstd.allocatorや，std.log，新しいstd.jsonみたいなのが名前として上がっていますが，再設計が必要なものもあり，まだあやふやです．

## DConf 2013

[The D Programming Language Conference 2013](http://www.kickstarter.com/projects/2083649206/the-d-programming-language-conference-2013-0)

D言語カンファレンスが2013年に開催されます．興味のある方は是非参加しましょう！俺はkickstarterの段階でearly birdチケットを買っているので，参加予定です．

## 来年

ちょっと良い物を皆さんに届けられるかもしれません．

# まとめ

ということで，駆け足ですが簡単にまとめてみました．githubに移行してからは開発の速度も上がっており，特にバグフィックスや機能改善に関してはかなりの量が行われています(changelogを見ると実感出来ます)．
また，ここ最近はD2に対する破壊的変更はほとんど行われれておらず，そういう変更はD3へ，というのがコミュニティの動きになっています．しかしまだまだD2で改善すべき所はあるので，そこはきっちりやりたい所です．

次，2日目は[@youxkei](http://qiita.com/users/youxkei)です！