D言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
D言語
en:File:D programming language logo.png
パラダイム マルチパラダイム
登場時期 2001年
設計者 ウォルター・ブライト, アンドレイ・アレキサンドレスク
最新リリース 2.066.1 / 2014年10月15日
型付け 強い静的型付け
主な処理系 DMD(公式実装), GDC(GCC), LDC(LLVM)
影響を受けた言語 C言語, C++, C#, Java, Ruby, Eiffel, Python, 関数型言語
影響を与えた言語 Vala, Swift[1]
ウェブサイト dlang.org

D言語(ディーげんご、D programming language)は、プログラミング言語のひとつ。

ウォルター・ブライトおよびアンドレイ・アレキサンドレスクによって開発された、テンプレートによるジェネリックプログラミングオブジェクト指向プログラミング、関数型プログラミングなどをサポートするマルチパラダイムプログラミング言語である。

概要[編集]

C++に似ているが、より簡潔で強力なテンプレートメタプログラミング機構を備えている。 また型推論ガベージコレクション(プログラマによる明示的なメモリ管理も可能である)、組み込みの動的配列連想配列など効率的なプログラミングを可能にする機能を備えている。分かりやすいコードが高速かつ安全に動作するという言語設計を目指しているが、一方で非常にパフォーマンスが要求される箇所では、インラインアセンブラポインタ演算などを利用できる。これらの機能や、危険な型変換などを用いたコードは関数の属性によって安全なコードと分離されるようになっている(関数の属性には、この他にも純粋な関数を示すものなどがある)。単体テスト、事前・事後条件のチェックや不変条件のチェック(契約プログラミング)、debug 識別子の導入など、プログラムのデバッグ・保守に対しても重点的にサポートしている。 並列処理との親和性も重視しており、明示しない限りグローバル変数がスレッド局所記憶であり、不変なデータ型(イミュータブル)がサポートされている。また、標準ライブラリであるPhobosにもメッセージパッシングを用いた並列処理(および並行処理)が実装されている。

  • C言語ファミリーとの比較
  • 静的型付けの強化
    • 型のプロパティへのアクセス(init, min/max, sizeofなど)
    • 複素数、虚数、列挙型、function型、delegate型
    • 機能強化された配列(動的サイズ変更、スライシング、連想配列、組み込みの文字列)
    • 配列演算
    • 強力な foreach文[8]
    • 参照型のクラス (Objectから派生)
    • 多くのリテラル(関数リテラル、delegateリテラル、連想配列リテラル、構造体リテラルなど)
    • 値型の高機能な構造体[9] (コンストラクタ、アラインメントの変更)
    • 変数や配列のアクセス制御(immutable、const、enum 記号定数)
  • テンプレート、メタプログラミングのための機能
    • 改良されたテンプレート構文、テンプレートミックスイン、可変個引数、タプル
    • 関数テンプレートの戻り値推論
    • 暗黙の型推論
    • 型の別名定義、typedef(2.057より非推奨)
    • 参照でのリターン
    • 委譲 (opDispatch、Alias This)
    • Traits(型特性、関数特性、クラス特性など。)
    • ユーザー定義の属性
  • 並列化
  • その他
  • 関数の強化
  • 強力なコンパイル時処理
    • 文字列をコードとして生成する文字列ミックスイン
    • 任意のファイルをコンパイル時に読み込み、文字列リテラルとして参照
    • 関数のコンパイル時実行
  • 開発支援のための言語標準の機能

コード例[編集]

  • Hello, world!
import std.stdio;  // モジュールを読み込む
 
void main()  // プログラムのエントリーポイントは C と同じ main
{
    writeln("Hello, world!");
 
    // void main() 関数から抜けると適切な終了コードが返る
}
  • 引数の和
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関数を利用する例を示す。

import std.algorithm;
import std.conv;
import std.stdio;
 
void main(string[] args)
{
    writeln(args[1 .. $].map!(to!int).reduce!((a, b) => a + b));
}
  • レンジ(Range)

レンジは、D言語の標準ライブラリであるPhobosにおけるイテレータのインタフェースである。上記の例にある高階関数を始め、Phobosの多くのモジュールはレンジの操作をベースにしている。配列や文字列もレンジとして扱える他、言語仕様自体に取り込まれているためforeach文が利用できる。

import std.range, std.stdio;
 
void main()
{
	// 1 <= i < 11 の整数をそれぞれ2乗して表示
	foreach (i; iota(1, 11).map!(i => i ^^ 2))
	{
		writeln(i);
	}
 
	// フィボナッチ数列を作成
	auto fibonacci = recurrence!((a, n) => a[n - 1] + a[n - 2])(0, 1);
 
	static assert(isInfinite!(typeof(fibonacci))); // 無限レンジであることが静的に判別できる
 
	writeln(fibonacci.take(8)); // [0, 1, 1, 2, 3, 5, 8, 13] フィボナッチ数列の最初の8個
	writeln(fibonacci.drop(19).front); // 20個目のフィボナッチ数を表示
}

歴史[編集]

  • 1999年12月にウォルター・ブライトが考案。
  • 2001年12月に初期バージョンがリリースされる。
  • 2007年1月にバージョン1.0リリース。
  • 2007年6月にバージョン2の開発が開始される。
  • 2007年8月にD言語の第1回国際カンファレンス[1]がアメリカ合衆国のシアトルで開催された。
  • 2012年12月にバージョン1.0の最終リリース(1.076)。
  • 2013年5月にDConf2013[2]がシリコンバレーの Facebook 社屋を借りて開催された。
  • 2014年5月にDConf2014[3]が同じ場所で開催された。

D1とD2[編集]

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

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

開発ツール[編集]

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

  • Visual D[4](Windows専用)

Microsoft社の統合開発環境 Visual Studio 向けのプラグイン。無償利用可能な Visual Studio Shell にも対応。

関連項目[編集]

外部リンク[編集]

ライブラリ[編集]

  • DUB registry - 公式のパッケージマネージャDUBで使用可能なパッケージの一覧

リソース[編集]

その他[編集]

参考文献[編集]

  1. ^ Building assert() in Swift, Part 2: __FILE__ and __LINE__”. 2014年9月25日閲覧。
  2. ^ ABI - プログラミング言語 D 2.0
  3. ^ Cとのインターフェイス - プログラミング言語 D 2.0
  4. ^ C++とのインターフェイス - プログラミング言語 D 2.0
  5. ^ インラインアセンブラ - プログラミング言語 D 2.0
  6. ^ 文 - プログラミング言語 D 2.0#Goto 文
  7. ^ Cプリプロセッサ vs D - プログラミング言語 D 2.0
  8. ^ 文 - プログラミング言語 D 2.0 # Foreach 文
  9. ^ 構造体, 共用体 - プログラミング言語 D 2.0
  10. ^ ガベージコレクション - プログラミング言語 D 2.0
  11. ^ 埋め込みドキュメント - プログラミング言語 D 2.0
  12. ^ D 2.0 の 1.0 からの違い - プログラミング言語 D 2.0
  13. ^ Deprecated Features