D言語

**D言語**（ディーげんご、**D programming language**）は、プログラミング言語のひとつ。C言語をベースとしABI互換を保ちつつも、テンプレートによるジェネリックプログラミングやオブジェクト指向プログラミング、関数型プログラミングなどをサポートするマルチパラダイムプログラミング言語である。

## 概要
型推論やガベージコレクション（明示的なメモリ管理も可能である）、スライスが可能な動的（および静的）配列、連想配列など効率的なプログラミングを可能にする言語機能を備えている。単体テスト、事前・事後条件のチェックや不変条件のチェック（契約プログラミング）、debug 識別子の導入など、プログラムのデバッグ・保守に対しても重点的にサポートしている。並列処理との親和性も重視しており、明示しない限りグローバル変数がスレッド局所記憶であり、不変なデータ型（イミュータブル）がサポートされている。また、標準ライブラリであるPhobosにもメッセージパッシング等を用いた並列（および並行）処理が実装されている。

C++のようなテンプレートやメタプログラミング機構を備えているが、テンプレート構文が簡潔な形に再設計されているなどの違いがある。コンパイル時関数実行を備えていることも特徴である。

D言語はシステムプログラミング言語としての側面も持つ。分かりやすいコードが高速かつ安全に動作するという言語設計を目指しているが、一方でパフォーマンスが要求される箇所では、インラインアセンブラやポインタ演算などを利用できる。これらの機能や、危険な型変換などを用いたコードは関数の属性によって安全なコードと分離されるようになっている（関数の属性には、この他にも純粋な関数を示すものなどがある）。

## コード例
* Hello, world!

```d
import std.stdio;  // モジュールを読み込む

void main()  // プログラムのエントリーポイントは C と同じ main
{
    writeln("Hello, world!");

    // void main() 関数から抜けると適切な終了コードが返る
}
```


* 引数の和

```d
import std.stdio, std.conv : to;

void main(string[] args)  // D の配列は要素数の情報を持っている
{
    int sum;              // 値型はコンパイラにより 0 で初期化される
    foreach(arg; args[1..$])  // 変数 arg は型推論により string 型になる
    {                         // 配列のスライシングも組込みでサポートされる
        sum += to!(int)(arg);  // to はテンプレート関数
    }
    writeln(sum);
}
```


高階関数を用いて書く事も可能である。標準ライブラリに含まれるmap, reduce関数を利用する例を示す。

```d
import std.algorithm;
import std.conv;
import std.stdio;

void main(string[] args)
{
    writeln(args[1 .. $].map!(to!int).reduce!((a, b) => a + b));
}
```


## 特徴的な言語機能
### 統一関数呼び出し構文(Uniform Function Call Syntax, UFCS)
オブジェクト指向におけるメソッド呼び出しと同じ構文でフリー関数（グローバルレベルで宣言された関数）を呼び出すことができる機能。関数の左側に置かれた値が第1引数として評価され、一般に「メソッドチェイン」と呼ばれる記述を可能にする。

プログラミング言語Nimにも同様の言語機能が存在する。


```d
import std.stdio;

void main()
{
    // 以下の2つは同じ結果となる
    writeln(square(square(2))); // 16
    2.square().square().writeln(); // 16
}

// 引数を二乗して返す関数
int square(int n)
{
    return n * n;
}
```


## 歴史
* 1999年12月 - ウォルター・ブライトが考案。
* 2001年12月 - 初期バージョンがリリースされる。
* 2007年1月 - バージョン1.0リリース。
* 2007年6月 - バージョン2の開発が開始される。
* 2007年8月 - D言語の第1回国際カンファレンスhttp://d.puremagic.com/conference2007/がアメリカ合衆国のシアトルで開催された。
* 2012年12月 - バージョン1.0の最終リリース（1.076）。
* 2013年5月 - DConf2013https://dconf.org/2013/がシリコンバレーのFacebook社屋を借りて開催された。以後、場所を変えつつ年1度開催されている。
* 2015年 - 米国ワシントン州にてD言語財団設立。
* 2015年 - DMDのフロントエンド部の実装がC++からD言語に置換えられた（2.069）。
* 2017年 - DMD実装のコード共用箇所の権利問題が解決し、オープンソース（Boost Software License）になった。https://mag.osdn.jp/17/04/11/170000
* 2018年5月 - GNUコンパイラコレクションのバージョン9.1からD言語がサポートされるようになった（2.076相当）。https://mag.osdn.jp/19/05/08/163000

### D1とD2
D1は、機能的には成熟したとされ、メンテナンスモードに移行している。標準ライブラリの非力さを補うためTangoライブラリとセットで利用されることが多い。なお、D1は2012年いっぱいでのサポート停止がアナウンスされた。

当初D2は、新しい機能を積極的に取り込むための開発系バージョンとして分離された。標準ライブラリPhobosが強化され、また言語仕様の面では文字列型（string）が変更不可能な配列となり、スレッド局所変数がデフォルトとなったなど、言語機能のさまざまな変更が行われ、D1の上位互換ではない。互換性より言語やライブラリの改良を重視し、言語機能やライブラリの破壊的変更が頻繁に起きるのも特徴の一つであった。現在では、推奨されない、あるいは廃止される機能としてコンパイル時に警告が表示され、また公式ドキュメントなどで事前に告知されるようになっている。

## 開発ツール
デバッガはC言語やC++と同じobjectフォーマットを使用するためCやC++用に書かれたものが使える。GDBなど、D言語に対するサポートを含んでいるものもある。既存の開発ツールについては以下のページが詳しい。

https://wiki.dlang.org/IDEs
https://wiki.dlang.org/Editors

* Visual Dhttps://rainers.github.io/visuald/visuald/StartPage.html
: マイクロソフトの統合開発環境Visual Studio向けのプラグイン。無償利用可能なVisual Studio Shellにも対応。

## 脚注

## 関連項目
*ABA Games - D言語を使用したゲーム開発で有名
*Eclipse - プラグインを利用することでD言語の開発環境として利用できる
* - D言語開発環境としても利用可能

## 外部リンク

* D Programming Language - D言語公式ウェブサイト
* dlang.orgの日本語訳 - AIを利用したD言語公式ウェブサイトの日本語訳。
* プログラミング言語 D - D言語公式ウェブサイトの日本語訳。公式ウェブサイトは頻繁に更新されているが、こちらは長らく更新されておらず、現在の仕様とは異なる点も多いため注意が必要である。
* GDC - D Programming Language for GCC - GCC版Dコンパイラ
* LDC - LLVMを使用するDコンパイラ

### ライブラリ
* DUB registry - 公式のパッケージマネージャDUBで使用可能なパッケージの一覧

### リソース
* D Wiki - 公式Wiki
* Programming in D - 同タイトルの日本語訳
* わかったつもりになるD言語（通称わなD。D memoの2007年版）
* C/C++に疲れた人のD言語2.0 (リンク切れ)
* D言語の四方山話
* D言語入門
* D language site

### その他
* Walter Bright's Homepage