Linux中國

D 編程語言是用於開發的絕佳語言的 5 個理由

D 編程語言是一種靜態類型的通用編程語言,它具有和 C 語言類似的語法,能夠編譯為本地代碼。許多理由使得它很適合用於開源軟體開發,下面講到的是其中一些理由。

模塊化能力

在大多數情況下,當你有一個好的想法,你可以完全按照你的內心所想的方式通過代碼來實現它。然而,有的時候,你不得讓你的想法向代碼妥協,而不是通過模塊化代碼來適應想法。D 語言支持多種編程範式,包括函數式風格、命令式、面向對象、元編程、並發(演員模式),這些全都和諧共存。你可以選擇任何一種方便的編程範式來將你的想法轉換為代碼。

通過使用模板,可以生成額外的 D 代碼並在編譯的過程中把它編排進去,你可以把這些代碼描述成編譯器生成代碼的一種模式。這是一種非常有用的設計演算法,無需把它們綁定到任何特定的類型。由於模版的通用性,就很容易生成平台無關的代碼。通過將模板與條件編譯結合,跨平台的應用變得更加容易實現,也更容易接受來自使用不同操作系統的開發者的貢獻。有了這一點,一個程序員可以通過很少的代碼,利用有限的時間實現很多東西。

range 已經深度集成到了 D 語言中,相對於具體實現,它抽象出容器元素(比如數組、關聯數組和鏈表等)是如何訪問的。這個抽象使得可以在許多容器類型中設計和使用大量的演算法,而無需綁定到特定的數據結構。D 的數組切片是 range 的一個實現。最終,你可以用很少的時間寫很少的代碼,並且只需要很低的維護成本。

開發效率

大多數開源軟體的代碼貢獻者都是基於有限的時間志願工作的。 D 語言能夠極大的提高開發效率,因為你可以用更少的時間完成更多的事情。D 的模板和 range 使得程序員在開發通用代碼和可復用代碼時效率更高,但這些僅僅是 D 開發效率高的其中幾個優勢。另外一個主要的吸引力是, D 的編譯速度看起來感覺就像解釋型語言一樣,比如 Python、JavaScript、Ruby 和 PHP,它使得 D 能夠快速成型。

D 可以很容易的與舊的代碼進行對接,減少了移植的需要。它的設計目的是與 C 代碼進行自然地對接,畢竟, C 語言大量用在遺留代碼、精心編寫而測試過的代碼、庫以及低級系統調用(特別是 Linux 系統)上。C++ 代碼在 D 中也是可調用的,從而進行更大的擴展。事實上,PythonObjective-CLuaFortran 這些語言在技術層面上都是可以在 D 中使用的,有許多第三方正在努力在把 D 語言推向這些領域。這使得大量的開源庫在 D 中均可使用,這符合開源軟體開發的慣例。

可讀性和可維護性

import std.stdio; // 導入標準輸入/輸出模塊
void main()
{
    writeln("Hello, World!");
}

D 語言的 Hello, World 演示

對於熟悉 C 語言的人來說, D 代碼很容易理解。另外, D 代碼的可讀性很強,即使是複雜的代碼。這使得很容易發現錯誤。可讀性對於吸引貢獻者來說也是很重要的,這是開源軟體成長的關鍵。

在 D 中一個非常簡單但很有用的語法糖是支持使用下滑線分隔數字,這使得數字的可讀性更高。這在數學上很有用:

int count = 100_000_000;
double price = 20_220.00 + 10.00;
int number = 0x7FFF_FFFF; // 16 進位系統

ddoc 是一個內建的工具,它能夠很容易的自動根據代碼注釋生成文檔,而不需要使用額外的工具。文檔寫作、改進和更新變得更加簡單,不具挑戰性,因為它伴隨代碼同時生成。

Contract 能夠檢查代碼的實現,從而確保 D 代碼的行為能夠像期望的那樣。就像法律契約的簽訂是為了確保每一方在協議中做自己該做的事情,在 D 語言中的契約式編程,能夠確保實現的每一個函數、類等如期望的那樣產生預期的結果和行為。這樣一個特性對於錯誤檢查非常實用,特別是在開源軟體中,當多個人合作一個項目的時候。契約是大項目的救星。D 語言強大的契約式編程特性是內建的,而不是後期添加的。契約不僅使得使用 D 語言更加方便,也減少了正確寫作和維護困難的頭痛。

方便

協同開發是具有挑戰性的,因為代碼經常發生變化,並且有許多移動部分。D 語言通過支持在本地範圍內導入模塊,從而緩解了那些問題:

// 返回偶數
int[] evenNumbers(int[] numbers)
{
    // "filter" and "array" are only accessible locally
    import std.algorithm: filter; 
    import std.array: array;
    return numbers.filter!(n => n%2 == 0).array;
}

對 filter 使用 ! 運算符是模板參數的一個語法

上面的函數可以在不破壞代碼的情況下調用,因為它不依賴任何全局導入模塊。像這樣實現的函數都可以在後期無需破壞代碼的情況下增強,這是協同開發的好東西。

通用函數調用語法(UFCS)是 D 語言中的一個語法糖,它允許像調用一個對象的成員函數那樣調用常規函數。一個函數的定義如下:

void cook(string food, int quantity)
{
    import std.stdio: writeln;
    writeln(food, " in quantity of ", quantity);
}

它能夠以通常的方式調用:

string food = "rice";
int quantity = 3;

cook(food, quantity);

通過 UFCS,這個函數也可以像下面這樣調用,看起來好像 cook 是一個成員函數:

string food = "rice";
int quantity = 3;

food.cook(quantity);

在編譯過程中,編譯器會自動把 food 作為 cook 函數的第一個參數。UFCS 使得它能夠鏈起來常規函數,給你的代碼產生一種函數風格編程的自然感覺。UFCS 在 D 語言中被大量使用,就像在上面的 evenNumbers 函數中使用的 filterarray 函數那樣。結合模板、range、條件編譯和 UFCS 能夠在不犧牲方便性的前提下給予你強大的力量。

auto 關鍵詞可以用來代替任何類型。編譯器在編譯過程中會靜態推斷類型。這樣可以省去輸入很長的類型名字,讓你感覺寫 D 代碼就像是在寫動態類型語言。

// Nope. Do you?
VeryLongTypeHere variable = new VeryLongTypeHere(); 

// 使用 auto 關鍵詞
auto variable =  new VeryLongTypeHere();
auto name = "John Doe";
auto age = 12;
auto letter  = 'e';
auto anArray = [1, 2.0, 3, 0, 1.5]; // type of double[]
auto dictionary = ["one": 1, "two": 2, "three": 3]; // type of int[string]
auto cook(string food) {...} // auto for a function return type

D 的foreach 循環允許遍歷各種不同的底層數據類型的集合和 range:

foreach(name; ["John", "Yaw", "Paul", "Kofi", "Ama"])
{
    writeln(name);
}

foreach(number; [1, 2, 3, 4, 4, 6]) {...}

foreach(number; 0..10) {...} // 0..10 is the syntax for number range

class Student {...}
Student[] students = [new Student(), new Student()];
foreach(student; students) {...}

D 語言中內建的單元測試不僅免除了使用外部工具的需要,也方便了程序員在自己的代碼中執行測試。所有的測試用例都位於可定製的 unittest{} 塊中:

int[] evenNumbers(int[] numbers)
{
    import std.algorithm: filter; 
    import std.array: array;
    return numbers.filter!(n => n%2 == 0).array;
}

unittest
{
    assert( evenNumbers([1, 2, 3, 4]) == [2, 4] );
}

使用 D 語言的標準編譯器 DMD,你可以通過增加 -unittest 編譯器標誌把所有的測試編譯進可執行結果中。

Dub 是 D 語言的一個內建包管理器和構建工具,使用它可以很容易的添加來自 Dub package registry 的第三方庫。Dub 可以在編譯過程中下載、編譯和鏈接這些包,同時也會升級到新版本。

選擇

除了提供多種編程範例和功能特性外,D 還提供其他的選擇。它目前有三個可用的開源編譯器。官方編譯器 DMD 使用它自己的後端,另外兩個編譯器 GDC 和 LDC,分別使用 GCC 和 LLVM 後端。DMD 以編譯速度塊而著稱,而 LDC 和 GDC 則以在很短的編譯時間內生成快速生成機器代碼而著稱。你可以自由選擇其中一個以適應你的使用情況。

默認情況下,D 語言是採用垃圾收集的內存分配方式的。你也可以選擇手動進行內存管理,如果你想的話,甚至可以進行引用計數。一切選擇都是你的。

更多

在這個簡要的討論中,還有許多 D 語言好的特性沒有涉及到。我強烈推薦閱讀 D 語言的特性概述,這是隱藏在標準庫中的寶藏,以及 D 語言的使用區域,從而進一步了解人們用它來幹什麼。許多組織已經使用 D 語言來進行開發。最後,如果你打算開始學習 D 語言,那麼請看這本書 D 語言編程

(題圖:opensource.com)

via: https://opensource.com/article/17/5/d-open-source-software-development

作者:Lawrence Aberba 譯者:ucasFL 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國