2010-09-01 95 views
23

想象一下,你有3個項目:HTML,.xls和PDF格式:值得努力學習D嗎?

  • 程序員
  • 編譯
  • 和至少3種類型的文件搜索引擎庫中的文本編輯器。

你有3種選擇:

  • C++
  • 的Java
  • 和C#
  • 您也可以探索與D.

做那麼的另類,你可以請求更多的程序員:在這個任務中,D可以給我一個顯着的優勢:模塊化錯誤修復,團隊合作和機器效率?

+7

不知道你想要做什麼,或者你已經知道的語言,這是不可能回答的。此外,有資格談論D和其他語言的人幾乎肯定是D愛好者,所以你不可能得到一個平衡的答案。 – 2010-09-01 19:26:53

+4

我們怎麼可能在沒有更多細節的情況下回答這個問題?很明顯,它對* some *是值得的,而對其他*則不值得。你期望什麼語言?你打算用它來開發一些東西,還是這是一種學習體驗?你有沒有看過D所提供的? – 2010-09-01 19:27:05

+0

關於邁克爾佩特羅塔的問題,是的,我關注了D所提供的內容,但是所有的語言都提供了基於這個或那個特徵的天堂和天堂。我想從真正從事實際工作的人那裏瞭解這些功能是否如他們所說的那樣美妙。 – Nisanio 2010-09-01 19:53:28

回答

29

在我看來,d具有以下優點在更多的「傳統」靜態類型語言:

  1. 出奇的強大的編譯時元編程設施。例如,檢出D2標準庫中的std.algorithmstd.range。一個std.parallelism模塊很快就會被包含,如果/當它是,它將是另一個很好的例子。這些設施足夠強大,語言有時幾乎感覺到鴨子型,但與靜態類型語言的表現。另請參閱有關D元編程的SO問題:Examples of what D’s templates can be used for

  2. 默認D2併發模型基於消息傳遞。如果不以明顯的可擦除方式顛覆類型系統,則D2中的線程之間不能隱式共享數據。當然,如果你真的想要不經過檢查的數據共享,你可以通過演員來分解。例如,目前正在審查的std.parallelism模塊會執行此操作以獲得踏板到金屬的多核平行度。

  3. D傾向於使簡單的事情比C++或Java更簡單。 (我不太確定C#)。通過簡單的事情,我的意思是像基本文件I/O或策略模式這樣的東西不需要太多的樣板。事實上,我覺得D的主要設計目標之一是從地球表面消除樣板代碼,因爲在語言和標準庫的設計中都非常重視對它的需求。

相對於動態語言,d有:

  1. 性能本地編譯語言,而放棄的便利遠遠低於你所期望,主要是因爲該真棒元編程設施他們在標準庫的設計中的使用。

  2. 靜態檢查。你的程序不會有一天崩潰,因爲你錯誤地輸入了一個變量名或試圖給一個整數賦一個字符串。

  3. 做低級別工作的能力。例如,除了幾小塊內聯彙編的,D的垃圾收集器完全D.

+0

非常感謝你 – Nisanio 2010-09-01 20:43:03

+3

對於你關於樣板代碼的評論,我還會添加 - 當你必須創建樣板文件時,你可以經常用*語言本身*使用字符串混合。這也是編譯時檢查。實質上,你可以使用D編譯器本身作爲代碼生成器! – 2010-10-01 04:51:39

7

如果您想要C++的「強大」,而不需要繁瑣的語法或C的「強大」功能​​,並使用適當的字符串和類等有用的功能,那麼我認爲這是值得的。如果你喜歡有一個巨大的API依靠(C#/ Java),D可能不會打擊你的幻想。 此外,請確保使用D 1.0,因爲D 2.0支持的庫(wxD &其他GUI庫)和編譯器(GCD,LDC,任何非DMD)的支持令人震驚,即使該版本的語言有明顯的改進。

+4

儘管在2010年發佈時確實如此,但D2在這裏支持gcc和LLVM。 D1是過去的日子遺留下來的。 – 2014-02-13 18:53:59

6

我本人在學習d,從C/C++背景的過程寫入。 D因爲它的優雅而吸引了我,它通過設計深思熟慮。那感覺就像密集的,深沉而黑暗的C++角落之後的天堂。

對我而言,D的一大缺點是缺乏庫。即使是標準庫,我也沒有發現很好。語言很棒,圖書館還沒有(還)。儘管你可以使用C庫,這是一個很大的讚賞。

雖然d似乎有許多專門怎樣和多語言方面,它不是什麼C++有一半。所以我認爲學習速度非常快(肯定是因爲90%來自C++或相關語言)。所以學習這門語言應該是數週/數月。

由於目前還沒有很棒的GUI工具,所以您可能需要在其他方面開發編輯器。另外兩個項目都非常適合D.

+3

經過1.5年的時間,我必須補充標準庫已經取得了重大進展。它非常有用並且很快穩定下來。編譯器也快速成熟。當前的障礙是缺乏徹底的文檔和極少情況下的編譯器錯誤。我希望後者能夠通過將GDC集成到GNU編譯器工具集中來解決。 – 2012-01-15 11:32:20

1

我會給+1求效益,以0(沒有贊成或反對)的模塊化,0團隊的工作和巨大的-1 bug修復。

-1來自於一個事實,即d是不是真的足夠用了,使圖書館功能齊全,無bug。在這種情況下,通過修復第三方代碼,你總是會失去時間。還有一個非常好的D調試器不存在的-1。

通常 - 作爲艾菲爾程序員 - 我會給d +1具有由合同設計,但這不是跨越該標準庫不斷使用,並且絕對不使用額外的庫的95%。所以你不會從中獲得很多好處。

+3

*不存在一個好的D調試器* - 最近支持gdb,也檢出[Visual D](http://www.dsource.org/projects/visuald)。 – kennytm 2010-09-05 19:25:10

+0

是的,我知道人們會提到gdb,這就是爲什麼我寫了一個不錯的調試器的存在。並且,謝謝我會檢查出Visual D,下次我再次做一個空閒時間D項目 – Lothar 2010-09-05 19:37:31

0

我認爲D肯定是最適合編譯器的,不太適合其他兩項任務。

+0

我認爲這門語言適合所有人,但是圖書館對其中的一部分缺乏。 – 2010-09-10 05:26:19

4

我只想說,我成了昨天d愛好者,當我得知它是比C++好多少,我一直在研究d兩天直出純粹的愛。噢,這不是完美的,但與C++相比?沒有比賽。 Java的同上。 C#是我3天前選擇的語言,但今天我認爲它已經降級了。

還沒有使用D對於任何認真的工作,我可能會被誤認爲。但是D對於通常針對C++提出的所有主要批評都有答案,從編譯時間到糟糕的類型安全性,以及維護頭文件頭痛,以及編譯速度緩慢。d不僅是一個漸進的改善,但在沒有世界上流行的語言已經找到創新點:

  • 據說有世界上最快的編譯器的一個
  • 可以使用的try/catch /終於和RAII,但scope(exit)使異常安全的代碼更容易讀寫
  • 您可以定義關閉,編譯器可以內聯(是否有任何C++ 11編譯器都這樣做?我不確定,我被卡住了Visual C++ 2008由於需要支持Windows CE)
  • 垃圾回收是標準的但是可選的,因此您可以通過避免GC分配來編寫低延遲保證的程序(但是如何管理內存呢?我懷疑人們可以使用alias this使智能指針一拉C++?)
  • 片,集合訪問機制,遠遠比C + +迭代器更安全,也更方便,無需重複自己在lower_bound(blobCollection.begin(), blobCollection.end(), blob)
  • 泛型比C++更加靈活,不會產生錯誤消息
  • 編譯時元編程,大大大大優於C++的頁面(顯然C#太)
  • Compile-time reflection這(我希望,但無法證實)人們可以用它來建立一個運行時反射系統,如果有人想要
  • 精心設計,多範例approac h共享存儲器和消息傳遞體系結構的有趣特徵的併發性
  • 對單元測試的內置支持
  • 以數組爲單位的表達式,例如,一個[] =(b [] + c [])/ 2(MATLAB對此更加簡潔,但在通用語言中這種功能很少見)
  • 優越的浮點功能(例如nextUp()/ nextDown ()/ ulp(),十六進制浮點數,控制硬件例外)

對於編譯器或搜索引擎庫,D顯然會優於。由於D與C++非常相似,所以您不必花費大量時間來學習它,爲什麼不呢?另外,從C++移植小程序和庫應該不那麼困難。我的印象GUI綁定也在不斷改進,所以現在D可以適合文本編輯器。

不可否認,我對任何事都不滿意。他們仍然迎合C羣,所以你仍然必須填寫你的switch陳述breaksstatic關鍵字被混淆過度使用,lambda需要花括號和「返回」語句(而不是C#的更快x -> x+1語法),所有功能和嘗試/捕捉需要大括號,在呼叫站點隱含傳遞引用......但是D提供的內容太好了,無法傳遞。

不過,當然,同時d 語言顯然是了不起的,標準庫顯然已經成熟了,周圍的工具可能不是那麼好:集成開發環境,用於智能手機平臺的支持,等我想唯一的IDE, Visual D(用於Visual Studio的IDE插件)工作得非常好,包括似乎與Visual C++調試器一樣工作的調試,以及可以進入標準庫(有趣!)的調試。但是Code Completion還不能很好地工作。

與C#相比,D在大多數領域更好,但在動態鏈接和反射方面似乎很弱。例如,你的文本編輯器可以很容易地在.NET下有一個插件系統,但我不太確定D. .NET也提供了運行時代碼生成,而D不提供。但是,存在將D編譯爲.NET代碼的research compiler。考慮到C++/CLI已經編譯爲.NET(C++/CLI),也許有一天能夠同時很好地使用D來管理和本地代碼(當然,在受管理的域中性能影響很小)。與C/C + +和.NET是相當不錯的。 D應該可以通過extern (C++)和C++ name mangling(但是其編譯器的名稱重疊?)與C++函數和單繼承類互操作,而您可以輕鬆創建可從.NET和其他語言調用的COM接口。