D語言

**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[]的別名，不過別名定義必須與舊版本相容。

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

### 範例 2

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

### 範例 3

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

### 範例 4

本例顯示出一部分 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 語言教學 （頁面存檔備份，存於網際網路檔案館）