**D語言**是一种程式語言，具备多範型，例如物件導向、指令式。由沃尔特·布莱特和安德烈·亞歷山德雷斯庫所開發，起源自C++，深受C++的影響，然而其不是C++的变种，而是重新设计来自C++的部分特性，并受到其它程式語言觀念的影響，如Java、C#以及Eiffel。2007年1月2日釋出1.0穩定版本。2007年1月17日釋出2.0版本。

Walter Bright本身是Symantec C++編譯器的作者，另一名作者Andrei Alexandrescu是Facebook的研究科学家，他与一个团队用D语言重写一些Facebook的重要操作。

特性
--

D的設計來自實際的C++用法的經驗教訓，而不是從理論的角度。D沿用了很多C/C++觀念，同時摒弃了一些概念，因此D並不完全相容C/C++代码。D实现了C++的功能，实现了契約式設計（design by contract）、單元測試、真正的模組性、自動化記憶體管理（垃圾回收）、頭等数组（first class array）、关联数组、动态数组、数组切片、嵌套函数（巢狀函式）、內部類別、閉包的限制形式、匿名函式、編譯時期函式執行、惰性計算以及革新的模板語法。D保有C++的性能以進行低階程式設計，並加入完整的內聯組譯器支援。C++的多重繼承改以Java 單繼承與介面混合的風格取代。D的、語句和表達式語法（英语：）幾乎和C++一樣。

內聯組譯器（inline assembler）象徵了D和Java、C#等應用程式語言的不同。內聯組譯器讓程式員輸入機器特定的組合語言碼，如同標準D代碼—通常由系統程式員使用的技術，以存取處理器的低階功能，直接以硬體下的界面執行程式，如作業系統以及驅動程式。

D內建支援文件註解，不過目前為止，只有Digital Mars實作版本有提供文件產生器。

### 程式設計範型

D支援五種主要的程式設計泛型—指令式、物件導向以及元程式設計、函数式和并发（演员模型）。

#### 指令式

指令式程式設計幾乎和C一樣。函式、資料、語句、宣告以及表達式的運作就如同C一般，且可直接存取C執行時期程式庫。

#### 物件導向

在D裡面的物件導向程式設計，是以單繼承分層結構，配合所有類別衍伸自類別物件為基礎。多重繼承可使用界面（界面很像C++的抽象類別）。

#### 元程式設計

以模板組合、編譯時期函式執行、多元組以及字串混合來支援元程式設計。

### 記憶體管理

記憶體通常以垃圾回收管理，不過當這些物件超出作用域時，可立即結束指定的物件。還是可以使用重載運算子new和delete，以及簡單的直接呼叫C的malloc函数和free函数以進行顯示的記憶體管理。垃圾回收可禁用個別的物件或事件，以健全整個程式，如果在記憶體管理上有更多的控制，則更為理想。當垃圾回收在程式中有所不足時，手冊還提供許多如何實作不同的高度最佳化記憶體管理方案的範例。

### 與其它系統的相互作用

支援C的應用程式二進制介面（ABI），以及C的基本和衍伸型態，就能直接存取現有的C代碼以及程式庫。C的標準函式庫也是D標準的一部分。除非你使用非常清楚的命名空間，它可以稍微散亂的存取，因為它散佈遍及於D模組—不過純粹的D標準函式庫也通常夠用，除非要與C代碼接合。

並未完整支援C++的ABI，儘管D可以存取寫給C ABI的C++代碼，且可存取C++COM（元件物件模型）代碼。D語法分析器了解外部（C++）呼叫約定，以連結C++物件，不過它只實作在D 2.0。

D 2.0
-----

D 2.0，D 新一代版本，D2.0与D1.0是不兼容的，类似Python2和Python3的区别。目前D2已经稳定下来。其中一部分特性包括支援強制常數正確性（const-correctness），以及有限的支援連結以 C++ 編寫的代碼。

实现
--

目前D直接編譯成原生碼以高效執行。

D语言1.x版本已稳定，不再功能变更或扩展，2.0版本是其正式版本，不完全相容舊版本的語言和編譯器。官方編譯器由Walter Bright定義語言本身。

* DMD編譯器（页面存档备份，存于）：Digital Mars D編譯器，由Walter Bright編寫的官方D編譯器。編譯器前端的授權許可为Artistic License和GNU GPL兩者；前端的原始碼連同編譯器執行碼一起發佈。編譯器的後端則是私有的。
* GDC（页面存档备份，存于）：D 1.0編譯器，以DMD編譯器前端，以及GCC後端所組成。
* LDC（页面存档备份，存于）：D 2.0編譯器，以DMD編譯器前端，以及LLVM後端所組成。LDC的官方版本已不支持D1.0，但其分支版本依然支持D1.0。

問題和爭議
-----

### 運算子重載

D運算子重載在一定程度上不如C++強大。簡單的例子是opIndex，它不允許返回引用。這使像是obj[i] = 5;的賦值不可能存在。D的解決方法是opIndexAssign運算子，它只用於這種特殊情況。此外，C++返回參考的方法允許返回型態的重載賦值運算子的用法。這在目前的D還不可能做到。D 2.0將會引入opIndexLvalue修正 - 類似運算子重載和opIndexAssign。

### 低功的結構

結構在D之中是一種樸素舊式資料的型態，不過也可像變數一樣包含方法。這對有意輕量化的建構而言相當實用，如矩陣或向量，這些不需要完整的D類別功能（以及體積）。然而，D結構沒有建構子和解構子。建構子可用靜態opCall運算子部分取代，不過它沒有適合的解構子等價物。此外，結構不允許繼承，這會是有益的設計，如詭異循環模板模式（curiously recurring template pattern）的使用。

### 標準函式庫中缺乏功能

D的標準函式庫稱作Phobos（页面存档备份，存于），且時常被認為過分簡單。tango（页面存档备份，存于）專案編寫另一個標準函式庫試圖修正這一部分，不過phobos和tango目前由於不同的物件類別實作（導致垃圾回收困難）而互不相容。存在兩種事實上的標準函式庫可能導致更大的問題，部分軟體使用phobos，而其它軟體使用tango。

### 缺乏明確的目標

D經常限於「修正並改進的C++」。這會導致過分強調功能，這起因於加入新功能只是因為他們認為有用。舉個例子，關聯陣列可簡單的以標準函式庫實現。[原創研究？]

### 未完成對共享／動態函式庫的

Unix的ELF共享函式庫使用GDC編譯器到某個程度。在Windows系統中，目前還不支援DLL。因此現階段不可能編寫插件。不像C++，經由C函式傳送的D物件將不能運作，因為這將會與垃圾回收器產生衝突。

範例
--

### 範例1

這個範例程式會輸出它自己的命令列參數。main函式是D程式的進入點，args是表示為字串陣列的命令列參數。在D語言裡的字串是一個字元陣列，以char[]表示。新版本中定義string為char[]的別名，不過別名定義必須與舊版本相容。

```
import std.stdio; // 以使用writefln()
alias char[] string; // 以相容舊的編譯器；新的編譯器中已隱含定義
int main(string[] args)
{
 foreach(i, a; args)
 writefln("args[%d] = '%s'", i, a);
 return 0;
}

```

foreach語法可迭代所有的集合，在本例中，它從args陣列生成索引（i）和值（a）的序列。索引i和值a的型態會從args陣列的型態推斷。

### 範例2

本例使用關聯陣列建立更複雜的資料結構。

```
import std.stdio; // 以使用writefln()
alias char[] string; // 以相容舊的編譯器；新的編譯器中已隱含定義

int main(string[] args)
{
 // 宣告以字串鍵和字串陣列作為資料的關聯陣列
 string[] [string] container;

 // 將人們加入到容器中，並讓他們攜帶一些項目
 container["Anya"] ~= "scarf";
 container["Dimitri"] ~= "tickets";
 container["Anya"] ~= "puppy";

 // 迭代容器中所有的人
 //Iterate over all the persons in the container
 foreach (string person, string[] items; container)
 display\_item\_count(person, items);
 return 0;//完成
}

void display\_item\_count(string person, string[] items)
{
 writefln(person, "is carrying ", items.length, "items.");
}

```

### 範例3

本例繁多的註解顯示出D語言與C++ 的不同之處，以及仍然保留的方面。

```
#!/usr/bin/dmd -run
/\* 支援sh風格的script語法！\*/
/\* D語言的Hello World
 \* 進行編譯：
 \* dmd hello.d
 \* 或進行最佳化：
 \* dmd -O -inline -release hello.d
 \* 或產生文件：
 \* dmd hello.d -D
 \*/

import std.stdio; // 參照常用的I/O例行工作。
alias char[] string; // 以相容舊的編譯器；新的編譯器中已隱含定義

int main(string[] args)
{
 // 'writefln' (寫入-格式化-行，Write-Formatted-Line)即型態安全的「printf」
 writefln("Hello World, "// 自動連結的字串文字
 "Reloaded");

 // 字串即字元的動態陣列「char[]」，別名為「string」
 // 自動的型態推斷，以及內建的foreach
 foreach(argc, argv; args)
 {
 auto cl = new CmdLin(argc, argv); // 支援OOP
 writefln(cl.argnum, cl.suffix, "arg: %s", cl.argv); // 使用者定義的類別屬性。

 delete cl; // 垃圾回收或顯示的記憶體管理——由你自己選擇
 }

 // 巢狀結構、類別和函式
 struct specs
 {
 // 所有的變數會在執行時期自動初始化為0
 int count, allocated;
 // 不過你可選擇避開陣列的初始化
 int[10000] bigarray = void;
 }

 specs argspecs(string[] args)
 // 可選用的（內建）函式契約。
 in
 {
 assert(args.length > 0); // 內建assert
 }
 out(result)
 {
 assert(result.count == CmdLin.total);
 assert(result.allocated > 0);
 }
 body
 {
 specs\* s = new specs;
 // 不需要「->」
 s.count = args.length; // 「length」屬性是元素的數量。
 s.allocated = typeof(args).sizeof; // 原生型態內建的屬性
 foreach(arg; args)
 s.allocated += arg.length \* typeof(arg[0]).sizeof;
 return \*s;
 }

 // 內建字串和普通的字串操作，例如「~」是連結。
 string argcmsg = "argc = %d";
 string allocmsg = "allocated = %d";
 writefln(argcmsg ~ ", "~ allocmsg,
 argspecs(args).count,argspecs(args).allocated);
 return 0;
}
 
/\*\*
 \* 儲存單獨命令列參數
 \*/
class CmdLin
{
 private
 {
 int \_argc;
 string \_argv;
 static uint \_totalc;
 }
 
 public:
 /\*\*
 \* 物件的建構子。
 \* 參數：
 \* argc = 參數的序列計數。
 \* argv = 參數內文。
 \*/
 this(int argc, string argv)
 {
 \_argc = argc + 1;
 \_argv = argv;
 \_totalc++;
 }

 ~this() // 物件的解構子
 {
 // 本例中不做任何事。
 }

 int argnum() // 屬性，可返回參數數目
 {
 return \_argc;
 }

 string argv() // 屬性，可返回參數內文
 {
 return \_argv;
 }

 wstring suffix() // 屬性，可返回序數後綴
 {
 wstring suffix; // 內建Unicode字串（UTF-8，UTF-16，UTF-32）
 switch(\_argc)
 {
 case 1:
 suffix = "st";
 break;
 case 2:
 suffix = "nd";
 break;
 case 3:
 suffix = "rd";
 break;
 default: // 'default' is mandatory with "-w" compile switch.
 suffix = "th";
 }
 return suffix;
 }

 /\*\*
 \* 靜態屬性，如同在C++ 或Java中，
 \* 適用於類別物件，而不是實體。
 \* 返回：己加入的命令列參數總數。
 \*/
 static typeof(\_totalc) total()
 {
 return \_totalc;
 }

 // 類別不變量，任何方法在執行之後，這些必須為真。
 invariant ()
 {
 assert(\_argc > 0);
 assert(\_totalc >= \_argc);
 }
}

```

### 範例4

本例顯示出一部分D語言強大的編譯時期特性。

```
/\*
 \* D語言裡的模板比C++ 的要更加強大。
 \* 在此可以看到使用static if（D的編譯時期條件建構）簡單的建構出階乘模板。
 \*/
template Factorial(ulong n)
{
 static if( n <= 1 )
 const Factorial = 1;
 else
 const Factorial = n \* Factorial!(n-1);
}

/\*
 \* 這裡有一個正規的函式，可完成同樣的計算。
 \* 注意它們有多麼的相似。
 \*/
ulong factorial(ulong n)
{
 if( n <= 1 )
 return 1;
 else
 return n \* factorial(n-1);
}

/\*
 \* 終於，我們可以計算我們的階乘。注意，我們不需要去
 \* 明確的指定我們的常數的型態：編譯器有足夠的智能為
 \* 我們填充空白，因為它早已知道賦值中右手邊的型態。
 \*/
const fact\_7 = Factorial!(7);

/\*
 \* 這是編譯時期函式評估的範例：普通函式可用於常數、
 \* 編譯時期表達式，假若它們滿足一定的條件。
 \*/
const fact\_9 = factorial(9);

/\*在此我們可以看到多麼強大的D我們使用 
 \* std.metastrings.Format模板完成型態安全的printf 
 \* 資料格式化，並使用message pragma顯示計算結果。
 \*/
import std.metastrings;
pragma(msg, Format!("7! = %s", fact\_7));
pragma(msg, Format!("9! = %s", fact\_9));

/\*
 \* 完成任務後，我們可以強制停止編譯。這樣的程式需是
 \* 從未實際編譯成可執行檔！
 \*/
static assert(false, "My work here is done.");

```

參考資料
----

1. ↑ . D Programming Language 1.0. Digital Mars.  [1 December 2011]. （原始内容存档于2019-03-11）.
2. ↑ .  [2023年6月25日].
3. ↑  Metz, Cade.. Wired.com（英语：）. 《连线》杂志. 2014年7月7日  [2014年7月27日]. （原始内容存档于2014年7月26日）. Today, Alexandrescu is a research scientist at Facebook, where he and a team of coders are using D to refashion small parts of the company’s massive operation.
4. ↑ .  [28 August 2012]. （原始内容存档于2013-08-24）.

外部連結
----

|  |  |
| --- | --- |
|  | 維基教科書中的相關電子：**Programming:D** |

* Digital Mars: D程式語言（页面存档备份，存于）（官方網站）
* 开放式目录计划中和D相关的内容
* DSource，D語言的開放原始碼社群。（页面存档备份，存于）
* Dprogramming.com，視窗化程式庫DFL的首頁。（页面存档备份，存于）
* Wiki4D，「D語言的維基頁」（页面存档备份，存于）
* gdc（页面存档备份，存于），GCC的D語言前端
* 電腦語言評測遊戲
* D文件的維基頁
* D語言特性列表（页面存档备份，存于）
* Walter Bright介紹D語言的影片（页面存档备份，存于）
* Ddbg - Win32 D除錯器
* DWin - D語言庫
* DLogo - D語言按鈕，廣告欄（页面存档备份，存于）
* SciTE4D - D語言編輯器\*D語言中國社區，　D語言入門，D語言GUI介紹等（页面存档备份，存于）
* D語言中文討論區
* D Programming Language簡介
* D語言教學 （页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
C语言 |
| --- |
|  |
| 
* 《C程序设计语言》（K&R C）
* 历史
* ANSI C
* C99
* C11
* C18
* 嵌入式C语言
* MISRA C

 |
|  |
| 特性 | 
* Functions
* 头文件
* 字符串
* 语法
* 预处理器
* 数据类型
* 指针

 |
|  |
| 函式庫 | 
* glibc
* C標準函式庫
* C POSIX library
* Dietlibc
* uClibc
* Newlib
* EGLIBC
* Bionic
* klibc
* musl

 |
|  |
| 編譯器 | 
* Clang
* GCC
* MSVC
* Intel C++
* Borland Turbo C
* LCC
* Pelles C
* PCC
* TCC
* C++/CLI
* C++/CX
* Watcom C/C++ 编译器

 |
|  |
| C與其他的程式語言 | 
* C与C++
	+ 兼容性
	+ 運算子
* Pascal与C的比较（英语：）
* C to Java byte-code compiler

 |
|  |
| 派生的程式語言 | 
* C++
* C#
* Objective-C
* D語言
* Alef（英语：）
* Limbo
* Go
* Vala

 |
|  |
| 
* C/C++的整合開發環境
* 分类 **分类**

 |

 |



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 按范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：）
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* CFML（英语：）
* REBOL
	+ Red（英语：）
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh/ash
	+ csh/tcsh
	+ ksh
	+ bash
	+ zsh
	+ rc（英语：）
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
* TypeScript
* Node.js/Deno
* CoffeeScript/LiveScript（英语：）
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* GLSL
* HLSL
* BrookGPU（英语：）
* OpenCL
* CUDA
* Futhark
* Vulkan

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
| 其它 | 
* 汇编语言
* APT（英语：）
* GPSS（英语：）
* dc
* make
* PostScript
* XSLT
* WebAssembly

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |