この項目では、ウォルター・ブライトによって設計されたプログラミング言語について説明しています。サン・マイクロシステムズの開発したシステム情報取得用のスクリプト言語については「DTrace」を、データベース言語については「D (データベース言語仕様)」をご覧ください。
D言語D言語のロゴ
パラダイム関数型プログラミング、命令型プログラミング、オブジェクト指向プログラミング
D言語(ディーげんご、D programming language)は、プログラミング言語のひとつ。C言語をベースとしABI互換を保ちつつも、テンプレートによるジェネリックプログラミングやオブジェクト指向プログラミング、関数型プログラミングなどをサポートするマルチパラダイムプログラミング言語である。 型推論やガベージコレクション(明示的なメモリ管理も可能である)、スライスが可能な動的(および静的)配列、連想配列など効率的なプログラミングを可能にする言語機能を備えている。単体テスト、事前・事後条件のチェックや不変条件のチェック(契約プログラミング)、debug 識別子の導入など、プログラムのデバッグ・保守に対しても重点的にサポートしている。並列処理との親和性も重視しており、明示しない限りグローバル変数がスレッド局所記憶であり、不変なデータ型(イミュータブル)がサポートされている。また、標準ライブラリであるPhobosにもメッセージパッシング等を用いた並列(および並行)処理が実装されている。 C++のようなテンプレートやメタプログラミング機構を備えているが、テンプレート構文が簡潔な形に再設計されているなどの違いがある。コンパイル時関数実行を備えていることも特徴である。 D言語はシステムプログラミング言語としての側面も持つ。分かりやすいコードが高速かつ安全に動作するという言語設計を目指しているが、一方でパフォーマンスが要求される箇所では、インラインアセンブラやポインタ演算などを利用できる。これらの機能や、危険な型変換などを用いたコードは関数の属性によって安全なコードと分離されるようになっている(関数の属性には、この他にも純粋な関数を示すものなどがある)。 高階関数を用いて書く事も可能である。標準ライブラリに含まれる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));} オブジェクト指向におけるメソッド呼び出しと同じ構文でフリー関数(グローバルレベルで宣言された関数)を呼び出すことができる機能。関数の左側に置かれた値が第1引数として評価され、一般に「メソッドチェイン」と呼ばれる記述を可能にする。 プログラミング言語Nimにも同様の言語機能が存在する。import std.stdio;void main(){ // 以下の2つは同じ結果となる writeln(square(square(2))); // 16 2.square().square().writeln(); // 16}// 引数を二乗して返す関数int square(int n){ return n * n;} D1は、機能的には成熟したとされ、メンテナンスモードに移行している。標準ライブラリの非力さを補うため ⇒Tangoライブラリとセットで利用されることが多い。なお、D1は2012年いっぱいでのサポート停止がアナウンスされた。 当初D2は、新しい機能を積極的に取り込むための開発系バージョンとして分離された。標準ライブラリPhobosが強化され、また言語仕様の面では文字列型 (string) が変更不可能な配列となり、スレッド局所変数がデフォルトとなったなど、言語機能のさまざまな変更[3]が行われ、D1の上位互換ではない。互換性より言語やライブラリの改良を重視し、言語機能やライブラリの破壊的変更が頻繁に起きるのも特徴の一つであった。現在では、推奨されない、あるいは廃止される機能としてコンパイル時に警告が表示され、また公式ドキュメントなどで事前に告知されるようになっている[4]。 デバッガはC言語やC++と同じobjectフォーマットを使用するためCやC++用に書かれたものが使える。GDBなど、D言語に対するサポートを含んでいるものもある。既存の開発ツールについては以下のページが詳しい。 https://wiki.dlang.org/IDEs
概要
コード例
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);}
特徴的な言語機能
統一関数呼び出し構文(Uniform Function Call Syntax, UFCS)
歴史
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社屋を借りて開催された。以後、場所を変えつつ年1度開催されている。
2015年 - 米国ワシントン州にてD言語財団設立。
2015年 - DMDのフロントエンド部の実装がC++からD言語に置換えられた。(2.069)
2017年 - DMD実装のコード共用箇所の権利問題が解決し、オープンソース(Boost Software License)になった。[3]
2018年5月 - GNUコンパイラコレクションのバージョン9.1からD言語がサポートされるようになった。(2.076相当)[4]
D1とD2
開発ツール
Visual D ⇒[5]
マイクロソフトの統合開発環境Visual Studio向けのプラグイン。無償利用可能なVisual Studio Shellにも対応。
脚注[脚注の使い方]^ “Change Log: List of All Versions
^ “Building assert() in Swift, Part 2: __FILE__ and __LINE__”. 2014年9月25日閲覧。
^ ⇒D 2.0 の 1.0 からの違い - プログラミング言語 D 2.0
^ Deprecated Features