D 語言曾經興盛過,也隨着信息技術發展而頹廢過,但最終咱們很高興的看到它又帶着強烈的自信開始復甦,但願經過本文讓現代計算機科學工做者進一步瞭解這門具備獨特魅力的編程語言。 |
引言html
D 語言是一門語法至關優雅的編譯型語言,自 1999 年發佈至今已發展了 20 年,它既擁有 Java 那樣強大的表現力,又具備 C++ 至關的性能,原本是一門將來至關明朗的語言,可是當年由於 2.x 版本破壞性升級致使社區大量核心開發者將其放棄。
2010 年,伴隨着 Andrei Alexandrescu 新書《The D Programming Language》的出版,D 語言又變得活躍起來,D 語言 2.0 的特性變得穩定,運行庫與標準庫的分離,解決了 D 語言 1.0 時期標準庫之爭的問題。
2011 年,D 語言的開發遷移到了 Github,在有了更好的代碼管理和 bug 跟蹤方式以後,參與到 D 語言編譯器、運行庫和標準庫開發的人員也有了明顯的增長。次年,D 語言 1.0 版本中止更新,開發者全力投入到 2.0 的開發。
2014 年,D 語言編譯器前端代碼的許可協議變動爲更加寬鬆的 Boost 許可。在 2017 年,編譯器全部代碼最終都使用了 Boost 許可。在解決編譯器源碼許可問題以後,D 語言在開源社區中變得更加開放,並順利合併進入了 GCC 9.x。
直到 2015 年,D 語言社區進一步恢復活力,基於包管理的構建方式開始成熟,大量的開發庫開始涌現並應用到實際項目中。目前,已註冊項目庫達 1 千 6 百多個。
從新燃起但願的 D 語言在版本發佈的規劃上很是穩健,直至今日來講每兩個月均可以保證一個大版本的發佈。平均每一個版本的開發者數量都有超過 50 個核心貢獻者,最近的 2.087.0 更是達到了 62 位核心開發者的貢獻。
編程語言的戰爭異常慘烈,本文但願經過介紹,讓開發者從新來了解一下 D 語言,認識到 D 語言實際上是一門能力強大的語言,而且它能夠用於不一樣的場景,生態也在不斷髮展完善中。前端
第一部分:D 語言主要特色linux
D 語言是在吸收 C++ 遇到的各類教訓基礎上設計出來的,擁有與之相似的編程風格,許多概念與 C 或 C++ 都是相通的。不過,D 語言也有本身的一些特色,如支持閉包、匿名函數、編譯時函數執行、支持垃圾回收等。具體來說,D 語言擁有如下幾個主要特色:laravel
面向對象編程git
D 語言容許定義類和接口。像 Java 同樣,D 語言的繼承模型是單類繼承和多接口繼承。全部的類都有一個根類 Object。D 語言的類和接口都是引用類型,而結構是值類型,且不容許繼承。github
函數式編程算法
D 語言像 C++ 同樣,容許在類或結構外單獨定義函數。它還提供了各類不可變數據類型、匿名函數和閉包、UFCS(統一函數調用語法)等特性來更好地支持函數式編程。spring
泛型編程數據庫
D 語言容許定義模型類型,也支持直接定義模板類和模板函數。模板容許嵌套定義,模板方法甚至容許遞歸調用。經過模板約束能夠實現模板類型重載。模板參數支持不定個數類型。除此之外,模板參數類型還支持自動推導。編程
元編程
D 語言裏的純函數不會對全局變量產生任何影響,所以能夠在編譯時直接調用。藉助 static if、static foreach、mixin 等語句,能夠編寫在編譯時執行的代碼,動態生成代碼,知足快速定製應用功能的需求。
安全內存
默認支持基於垃圾回收的內存管理方式,從而讓編程變得更簡單,內存變得安全,程序變得更穩定。除此以外,也能夠根據須要對關鍵的內存資源選擇手動管理方式。藉助 scope 語句,能夠很好地控制內存資源申請和釋放點。D 語言內部有一套核心的類型定義和實現,它是 D 語言的一個子集,也被稱做 SafeD,用於保護內存的安全。
模塊化編程
D 語言的每個源文件都被定義爲一個模塊(module),源文件之間的依賴即體現了模塊之間的依賴。同一目錄下的多個模塊能夠組成一個包(package)。基於模塊的代碼讓項目的邏輯變得更加清晰,也爲項目的快速構建和編譯提供了支持。
其餘語言交互
D語言的ABI與C語言徹底兼容,所以它也具備很好的與其餘語言交互的能力,如與 C、C++ 和 Objective-C 等語言進行交互編程。D 語言甚至支持直接嵌入彙編語言,部分性能關鍵的代碼能夠直接使用匯編語言來實現。D 語言的 BetterC 特性是 D 語言的一個子集,能徹底去除 GC 依賴,並以更好 C 語言的方式來代替 C 語言編程,它能勝任 C 語言作的絕大部分工做。在 Windows 平臺下,可使用 COM 接口實現與其餘語言的交互。
基於包的應用構建
這個不屬於 D 語言自己特性,可是在 D 語言的開發生態裏,這是一種很很是重要和便捷的 D 語言應用構建方式。dub 是 D 語言的應用構建工具,它能夠很好地管理應用包之間的依賴關係,快速地構建出 D 語言應用。
除了上述特色,D 語言還提供了許多其餘特性,如內建關聯數組、單元測試、內聯彙編、內嵌文檔等,這些特性讓 D 語言成爲了一門功能強大的語言。
第二部分:與其它語言的簡要對比
D 語言與 Java 相比
衆所周知 Java 對工業化架構的設計很是棒,遠超越 C++、Golang 等語言,能與 Java 相提並論的只有 C#,在研究中咱們發現 D 一樣具有工業化的特性,並且不須要那麼龐雜的虛擬機開發環境,D 的性能比起 Java 來講好的很是明顯,並且整合 C、C++ 庫的時候也很是方便,而 Java 想整合 C、C++ 就須要很是麻煩的 jni 對去接。畢竟 D 語言是名副其實的系統級開發語言,D 語言在面向對象方面並不像 Java 那樣強制每一個文件都是對象,而更像 C++ 那樣擁有一個 main() 函數做爲程序入口。
示例代碼
import std.stdio; void main() { writeln("Hello world!"); }
D 語言與 C++ 相比
說到性能,C++ 一直佔據服務端高性能的首選,可是 D 的性能與 C++ 相比幾乎打成平手,但效率能夠 3~5 倍於 C++。固然 D 與 C 語言各類庫整合一樣方便,由於 D 語言是二進制與 C、C++ 兼容的,語法更像是 C++ 的超級升級版,D 在對 hashMap 操做時性能比 C++ 還要高,並且只要是掌握 C++ 的人能夠沒有任何門檻地使用 D 語言。
示例代碼
import std.stdio; void main() { foreach(i; 1..10) { writeln(i); } }
D 語言與 PHP 相比
PHP 是服務端腳本語言佔有率最高的語言,PHP 的優點就是簡單,無需引入什麼包就可使用語言自己的全部函數,可是也就是這樣 PHP 的性能一直沒有明顯改進,雖說 PHP 7.x 的出現讓 PHP 的性能提高了 2.x 倍,可是那只是和很是慢的 PHP 5.x 相比而已,與編譯型語言相比仍是相差太多。PHP 有很是明顯的短板,好比不支持多線程、長鏈接不友好、弱類型、跨語言 RPC 協議支持不穩定、部署須要 PHP 運行環境等,而 D 語言具有 C++ 可實現的全部功能,包括內嵌彙編,開發效率上來說與 PHP 相比只是多了個強類型的概念,而 D 語言標準庫也提供 to 方法讓你很是方便地進行各類類型的轉換。
示例代碼
import std.stdio : writeln; import std.conv : to; void main() { int i = 10000; string s = "Is string "; s ~= i.to!string; // PHP 使用點鏈接兩個字符串,而 D 語言使用波浪線鏈接兩個字符串 writeln(s); // 輸出結果 Is string 10000 }
D 語言可替代 C 語言
前陣子有一篇文章比較火,有一位 i3 核心開發者在文章中說到,D 纔是真正替代 C 的首選語言,他認爲 D 二進制與 C、C++ 徹底兼容因此可直接使用這兩個語言的二進制庫,D 甚至能夠用 dpp 項目直接 #include 語法引入 *.h 文件,做者同時也說到爲何 C 的替代者不是 Rust 和 Golang,有興趣的同窗能夠自行了解原文《D as a C Replacement》。
gcc 整合 D 語言編譯支持
這是一個很是大的進步,在近期發佈的 gcc 9.1 大版本中整合了 DLang 全新的編譯器前端也就是 gdc,如今整個社區有更多開發者對 D 項目進行推動,也有更多人在使用 D 完成以前 C/C++ 的工做。
第三部分:D 語言主要應用
做爲一門支持 GC 的系統語言,D 語言已被許多公司採納和應用,其中不乏像 Facebook、eBay 這樣的大公司。D 的應用涉及了遊戲、Web 應用、GUI 應用、操做系統、編譯器、嵌入式、科學計算與教育等多個領域。
遊戲開發
Remedy 公司已成功地用 D 語言將一款 3A 遊戲 Quantum Break 移植到了 XBox One 和 Windows 10 平臺。另外,有純 D 語言實現的 3D 遊戲引擎 Dash 和 D 語言遊戲開發工具庫 gfm。
Web 框架
編程語言在 Web 服務端框架很是重要,有好用的框架可讓整個語言充滿活力,就像 Java 有一個 Spring Framework 框架,PHP 有一個 laravel 框架,Python 擁有一個 Django,而 Ruby 擁有 Rails,因此既然是構建服務端應用 DLang 也一樣擁有一個表明性的框架 Hunt Framework。
數據庫操做
數據庫操做是大部分應用項目都不可或缺的一個基本操做,操做方式主要有兩種:編寫 SQL 腳本和 ORM。
直接操做數據庫的 D 語言開庫有 ddbc / (http://code.dlang.org/packages/ddbc)hunt-database 等,支持的數據庫包括 MySQL、PostgreSQL 和 SQLite 等。其中,新版本的 hunt-database 的底層驅動庫已從綁定 C 語言的方式升級爲了直接使用 D 語言實現,減小了對第三方庫的依賴。
採用 ORM 方式的 D 語言開庫有 hibernated / hunt-entity 等。其中,hunt-entity 借鑑了 Java JPA 和 spring-data-jpa 的概念,工業化程度高,操做合理而且易於維護。
微服務相關
hunt-service 是基於 gRPC 協議的分佈式 RPC 服務器與客戶端庫,很容易使用,也很是方便與 hunt-framework 整合構建微服務架構。
neton 是基於 raft 算法的分佈式服務發現註冊應用服務。
GUI 應用
其實 D 語言的推出比較早,因此 GTK 的整合很是完整,衆所周知 gtk 官方的 vala 語言也大量借鑑了 D 的語言設計,因此 gtkd 可以很是方便的構建客戶端應用,官方也有開發者推出了新的教程站點很是棒:gtkDcoding | Simple examples of how to use GtkD to build GUI applications(https://gtkdcoding.com/)
此外,純 D 語言實現的跨平臺 GUI 庫 dlangui 也有不俗的表現,有一個 DLangIDE 就是基於它實現的。更多 GUI 庫能夠參考這裏。
系統應用
在編譯器方面,DMD 前端已實現自舉。在操做系統方面,有 PowerNex(https://github.com/xomboverlord/xomb/tree/unborn) 與 Trinix 等系統嘗試。編譯器 LDC 甚至容許在更多的系統平臺下進行應用開發,如支持基於 ARM 和 MIPS 架構的嵌入式系統、Android 系統等。
科學計算
如今使用 D 語言能夠方便的進行科學計算,mir 是其中的佼佼者,它對多維數組計算提供了優秀的支持,性能超越了許多數值計算庫,達到商業水平。
結語
簡單來講,D 語言是一門在各個領域具備優點的編程語言,同時它當前的生態也在不斷髮展,本文但願經過簡單的介紹,讓開發者從新認識 D 語言。若是你還不瞭解 D 語言,讀完本文,但願你對它產生興趣;若是你此前有據說過 D 語言,讀完本文,但願你能從新認識它;若是你對 Web 開感興趣,請持續關注本系列接下來的 Web 應用篇。