D語言是由Digital Mars公司開發的編程語言,起因是為了改進C++。它與C二進制兼容(不完全),可編譯為本地碼,有GC也可手動管理內存,語法上借鑒多種語言,模板則在C++的基礎上做了相當大的擴充。D 語言既有 C 語言的強大威力,又有 Python 和 Ruby 的開發效率。它是一種集垃圾回收、手工內存操作、契約式設計、高級模板技術、內嵌匯編、內置單元測試、Mixin 風格多繼承、類 Java 包管理機制、內置同步機制、內建基本運行時信息的系統級編程語言。
中文名D語言
外文名D Programming Language
開發商Digital Mars公司
D語言詳細介紹D 語言是一種通用的系統和應用編程語言。它是比 C++ 更高級的語言,同時還保持了生成高效代碼以及直接訪問操作系統API和硬件的能力。[2]D 很適合于編寫從中等規模到那些由團隊合作完成、數百萬行代碼規模的各種程序。D 易于學習,為編程者提供了很多便利,并且適用各種野心勃勃的編譯器優化技術。
D 不是腳本語言,也不是一種解釋型語言。它不需要虛擬機、宗教、或者高于一切的哲學。它是給實際的編程者使用的實際的語言,它幫助編程者快速、可靠的完成易于維護、易于理解的代碼。[2]
D 是數十年來實現多種語言編譯器的經驗的積累,是用那些語言構造大型工程的嘗試的積累。D 從那些語言(主要是 C++ )那里獲得了靈感,并使用經驗和現實世界中的實用性來馴服它。
自從 C 語言被發明以來,軟件工業走過了一段很長的路。許多新的概念被加入了 C++ 中,但同時維護了同 C 的向后兼容性,包括兼容了原始設計中的所有的弱點。有很多修正這些弱點的嘗試,但是兼容性是最大的困擾。同時,C 和 C++ 都在不斷引入新的特性。這些新特性必須被小心的加入到現有的結構中,以免重寫舊的代碼。最終的結果十分復雜—— C 標準將近 500 頁,C++ 標準大概有 750 頁!C++ 實現起來既困難又代價高昂,造成的結果就是各種實現之間都有差別,因此很難寫出完全可以移植的 C++ 代碼。
C++ 程序員傾向于使用語言中的孤島來編程,也就是說,他們傾向于十分精通語言中的某個特性而避免使用其他特性。盡管代碼通常在編譯器之間是可移植的,但在程序員之間移植就不那么容易了。C++ 的一個長處是它支持很多根本上不同的編程風格——但從長遠來看,互相重復和互相沖突的風格會給開發帶來妨礙。
C++ 在標準庫而不是語言核心中實現了可改變大小的數組和字符串拼接等。不在語言核心中實現這些功能造成了幾種不太理想的結果。
是否能把 C++ 的能力釋放、重新設計并重鑄到一門簡單、正交并實用的語言中呢? 這種語言是否能做到易于正確實現,并使編譯器有能力有效地生成高度優化的代碼呢現代編譯器技術已經取得了很大的進步,有些原來用作原始編譯技術的補充的語言特性已經可以被忽略了(一個這樣例子是 C 語言中的‘register’關鍵字,一個更為微妙的例子是 C 中的宏預處理程序)。我們可以依賴現代編譯器的優化技術而不是使用語言特性(如同原始的編譯器所做的那樣)來獲得可以接受的代碼質量。[3]
D的主要目標粗看上去 D 就像 C 和 C++ 。這樣一來學習以及將代碼移植到 D 就很容易。從 C/C++ 轉向 D 應該很自然。程序員不必從頭學起使用 D 并不意味著程序員會如 Java 或者 Smalltalk 那樣被嚴格的限制在某一個運行時 vm (虛擬機)上。D 沒有虛擬機,編譯器直接生成可連接的目標文件。D 如同 C 那樣被直接連接到操作系統。通常那些你熟悉的工具如 make 同樣適用于 D 的開發。
D 適合于?
D 不適合于?
D 語言允許定義類和接口。像 Java 一樣,D 語言的繼承模型是單類繼承和多接口繼承。所有的類都有一個根類 Object。D 語言的類和接口都是引用類型,而結構是值類型,且不允許繼承。[4]
運算符重載類可以通過重載現有的運算符擴展類型系統來支持新類型。例如創建一個 bignumber class ,然后重載 +、-、* 和 / 運算符,這樣大數類就可以使用普通的代數運算語法了。
模塊化編程D 語言的每一個源文件都被定義為一個模塊(module),源文件之間的依賴即體現了模塊之間的依賴。同一目錄下的多個模塊可以組成一個包(package)。基于模塊的代碼讓項目的邏輯變得更加清晰,也為項目的快速構建和編譯提供了支持。[4]
聲明 vs 定義
C++ 的函數和類通常需要聲明兩次——聲明位于 .h 頭文件中,定義位于 .c 源文件中。這個過程易于出錯而且冗長繁瑣。顯然,應該只需要程序員寫一次,而由編譯器提取出聲明信息并將它導入到符號表中。這正是 D 所做的。
示例:
class ABC?{ return7; }????static int z = 7; } int q;
再需要單獨定義成員函數、靜態成員、外部聲明之類的,也不需要像這樣煩法intABC::func() { return7; } int ABC::z = 7; extern int q;
注記:當然,在 C++ 中,瑣碎的函數如 { return 7; } 也可以直寫在聲明處,但是復的函數就不行了(uframer:雖然從語法上說依然是可以的,但會違反 C++ 接口和實現分離的原則。)。另外,如果有前向引用的話,就必須保證已經聲明了被引用的那個函數一個原型。下面的代碼在 C++ 中是不合法的:
class Foo {???? int foo(Bar *c) { return c->bar; } }; class Bar {?? public:???? int bar() { return 3; } };
但是等價的 D 代碼就可以正常工作:
classFoo {???? int foo(Bar c) { return c.bar; } } class Bar {???? int bar() { return 3; } }
D 函數是否被在線化取決于優化程序的設置。
D 模板提供了一種提供范型編程和偏特化能力的簡潔的方法。
關聯數組關聯數組是索引可以為任意類型的組,不像普數組那樣必須使用整數作為索引。本質上,關聯數組就是散列表。關聯數組使構建快速、高效、無錯的符號變得容易了。
真正的 typedef
C 和 C++ 的 typedef 實際上是類型別名 ,因為它不會引入新的類型。D 實現了真正的 typedef typedef int handle; 實實在在地創造了一個新類型 handle。D 同樣會對 typedef 引入的類型進行類型檢查,并且 typedef 也與函數重載的決策。例如:int foo(int i); int foo(handle h);
Bit 類型
機器上最基本的數據類型是位,因此 D 直接支持 bit 數據類型。它在創建位數組時最有用: bit[] foo;
函數如你所愿,D 提供常規的對函數的支持,包括全局函數、重載函數函數在線化、成員函數、虛函數、函數指針等等。另外,D 還支持:
函數可以嵌套在其他函數內。這對于代碼分解、局部性以及函數閉包技術都具有很高的價值。
匿名函數可以直接嵌入到表達式中。
嵌套函數和類成員函數可以被稱為閉包(也被稱為委托),它們可使范型編程更為容易并保證類型安全。
這幾個修飾符不只能使函數更為易于理解,還能避免使用指針而不會影響代碼的功能,另外這也會提高編譯器幫助程序員找到編碼問題的可能性。 這些修飾符使 D 能夠直接同更多的外部 API 對接。也就無需使“接口定義語言(IDL)之類的東西了。
數組C數組有幾個可以被糾正的缺點數組本身并不帶有數組結構的信息,它們必須另外存儲和傳遞一個經典的例子就是傳遞給 main(int argc, char *argv[]) 函數的 argc 和 argv 參數(在 D 中,main 被聲明為 mai(char[][] args) 。
數組不是一等公民。當一個數組被傳遞給函數時,他被轉換為指針,盡管那個原型令人迷惑地聲它是個數組。當生類型轉換時,所有的數組類型信息也就丟失了。 C 數組的大小不可改變。這意味著即使最簡單的聚集如堆棧都必須用一個復雜的類構造。C 數組沒有邊界檢查,因為它們根本不知道數組邊界是多少。 數組聲明中的 [] 位于標志符之后。這使得聲明如一個指向數組的指針這樣的東西都需要復雜難懂語法:int (*array)[3]; 在 D 中,數組的 [] 位于左側:int[3] *array;? // 聲明了一個指向含有 3 個 int 的數組的指針 long[] func(int x); // 聲明了一個返回含有 long 數據的數組 ,顯然這更易于解D。
數組有四種變體:指針、靜態數組、動態數組和關聯數組。
字符串在 C 和 C++ 中,對字符串的操作是如此的頻繁,而又如此的笨拙,以至于最好還是由語言本身來支持它比較好?,F代語言都處理字符串連接、復制等等操作,D 語言也提供了這些支持。字符串是直接由經過改進的數組來處理的。
資源管理垃圾收集D 的內存分配完全采用垃圾收集。經驗告訴我們,C++ 中的很多復雜特征都是用于處理內存釋放的。有了垃圾收集,語言就變得簡單多了。
有一種看法認為垃圾收集是給那些懶惰、初級的程序員準備的。我還記得那些對 C++ 的評論,畢竟,沒有什么 C++能做而 C 不能做的,或者這對匯編來說也一樣。采用垃圾收集可以避免 C 和 C++ 中必需的乏味的、易于出錯的內存分配和追蹤代碼。這不只意味著更少的開發時間和更低的維護費用,還意味著程序運行得更快!當然,可以在 C++ 中使用垃圾收集程序,我已經在我自己的項目中使用它了。C++ 對垃圾收集程序并不友好,這也造成了 C++ 中垃圾收集的低效。很多運行時庫的代碼都不能同來垃圾收集程序一同工作。
盡管 D 是一種采用垃圾收集的語言,還是可以重寫某個類的 new 和 delete 操作以采用一個定制的分配器。
RAII 是一種管理資源分配和釋放的現代軟件開發技術。D 以一種可控的、可預測的方式支持 RAII ,它是獨立于垃圾收集程序的回收周期的。
性能輕量級聚集
D 支持簡單的 C 風格的結構,既保證了對 C 數據結構的兼容性,也是因為有時采用類有殺雞用牛刀之嫌。
內聯匯編
設備驅動程序、高性能系統程序、嵌入式系統和某些特殊的代碼需要使用匯編語言完成任務。盡管 D 的實現不一定要實現內聯匯編,它也仍被定義為語言的一部分。他可以滿足絕大多數使用匯編語言的需要,這樣就不需要單獨的匯編程序或者使用 DLL 了。許多的 D 實現同時也實現那些類似于 C 的支持 I/O 端口操作、直接訪問浮點硬件等內部功能的內函數。
可靠性現代的語言應該竭盡所能地幫助程序員避免出錯。語言提供的幫助有多種形式:從易于使用更為健壯的技術,有編譯器指出明顯出錯的代碼,到運行時檢查。
契約契約式編程(由 B. Meyer 發明)是一種用于保證程序正確性的革命性的技術。D 版本的 DBC 包括函數先驗條件、函數后驗條件、雷不變量和斷言契約
單元測試可以給一個類加入單元測試,這樣測試程序就能在程序啟動時自動運行。這樣就能夠在每次構建時都驗證類是否實現了他所應完成的功能。單元測試構成了源代碼的一部分。創建單元測試成為了類開發過程中的自然的一部分,而不是將完成的代碼直接拋給測試小組單元測試可以使用其它語言完成,但是其結果看起來有一種七拼八湊的感覺,而且你采用的那種語言很可能并不兼容個概念。單元測試是 D 的一個主要特征。
對于庫函數來說,單元測試已經被證明是十分有效的。它既可以保證函數工作正常,也可以演示如何使用這些函數??紤]大量的可以從網上下載的 C++ 庫和應用程序代碼。其中有“幾個”是帶有驗證測試的?更不要奢望單元測試了?少于 1% ?通常的做法是,如果它們能通過編譯,我們就假定它是正確的。而且我們不知道變異過程給出的警告到底是真正的錯誤還是瞎嘮叨。
契約式編程和單元測試使 D 為編寫可信賴、健壯的系統程序的最好的語言。單元測試還是我們能夠粗略但快速地估計你從未經手的 D 代碼片斷的質量——如果沒有單元測試和契約式編程,每人會干這種事。
調試特征和語句現在調試成為了語言語法的一部分了??梢栽诰幾g時決定是否使用這些代碼,再也不用使用宏或者預處理命令了。調試語法提供了一種持續的、可移植的、易于理解的識別調試代碼的方法,使程序員既能夠生成帶有調試代碼的二進制版本,也能夠生成沒有調試代碼的二進制版本。
異常處理D 采用了更為高級的 try-catch-finally 模型而不是原來的 try-catch 模型。沒有必要只是為了利用析構函數實現 finally 語義而構造一個傀儡對象。
同步因為多線程編程已經越來越成為主流,所以 D 提供了構建多線程程序的原語同步既可以作用在方法上,也可以作用在對象上。synchronized int func() { . } 同步方法一次只允許一個線程執行,同步語句將在語句塊周圍插入一個互斥體,控制對象或全局的訪問。
對健壯性技術的支持D 保留了 C 的運算符和它們的優先級、求值的規則和類型提升規則。這就避免了由于同 C 的語義不同而造成的微妙的難以發現的 bug 的出現。
不只擁有同 C 類型對應的類型,它還提供了直接訪問 C 函數的能力。完全沒有必要編寫封裝函數和參數變換器,也沒有必要逐一地復制聚集類型的成員。
使對 C API 或者現有的 C 庫代碼的接口成為可能。D 支持結構、聯合、枚舉、指針和所有的 C99 類型。D 還擁有設置結構成員對齊方式的能力,這樣就可以保證同外部導入的數據格式的兼容。
D 的異常處理機制將在應用程序中利用底層操作系統提供的異常處理方式。
D 生成標準的目標文件格式,這樣就能夠使用標準的匯編程序、鏈接器、調試器、性能分析工具、可執行程序壓縮程序和其他的分析程序,還能夠同其他語言編寫的代碼相鏈接。
項目管理D 對從同一份源碼生成多個版本的程序提供了內建的支持。它替代了 C 預處理程序的 #if/#endif 技術。
隨著代碼不停的演進,一些舊的庫代碼會被更新、更好的版本代替。同時舊的版本必須可用以支持舊的客戶代碼,舊的版本可以被標記為廢棄的??梢酝ㄟ^編譯器的一個選項來判斷使用廢棄版本代碼的版本是否是合法的,這樣一來負責維護的程序員就可以更為輕松的判斷哪里是依賴于已經被廢棄的特征的。
D 編譯器不會為可疑的代碼生成警告。代碼要么可以被編譯器接受,要么不能被編譯器接受。這樣就不會引起有關哪些警告確實是錯誤而那些不是的爭論,也就沒有如何處理它們的爭論了。對編譯器警告的需求本身就是不好的語言設計的表現。
參考資料本文發布于:2023-06-04 17:40:13,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/92/199003.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:D語言(Digital Mars開發的編程語言).doc
本文 PDF 下載地址:D語言(Digital Mars開發的編程語言).pdf
| 留言與評論(共有 0 條評論) |