学习D语言是否值得投入精力?

27

想象一下你有三个项目:

  • 一款针对程序员的文本编辑器
  • 一个编译器
  • 以及一个可用于至少3种文件类型(html, .xls 和 pdf)的搜索引擎库。

你有以下三个选择:

  • C++
  • Java
  • 以及C#
  • 或者您可以探索使用D语言的替代方案。

然后,你向更有经验的程序员询问: D语言在这项任务中能否为我带来显著优势,尤其是在模块化、错误修复、团队合作和机器效率方面?


7
不知道你想做什么,或者你已经掌握了哪些语言,就无法回答。此外,有资格谈论D语言与其他语言的人几乎肯定是D语言的爱好者,所以你不太可能得到一个平衡的答案。 - David Thornley
4
没有更多细节,我们如何回答这个问题?显然对于“某些人”是值得的,而对于“其他人”则不值得。你对语言有什么期望?你是打算用它来开发什么,还是只是为了学习体验?你有研究过D语言提供的内容吗? - Michael Petrotta
关于Michael Petrotta的问题,是的,我看过D语言提供的东西,但是所有的语言都基于这个或那个特性提供了天堂和乐园。我想知道真正从事实际工作的人是否认为这些特性像他们所说的那样出色。 - Nisanio
1
这不是一个论坛,请在您的原始问题中进行编辑。 - Mornedhel
1
@Nisanio:问题在于,你会得到关于任何一种用户自愿使用的语言的热情回答,无论是D、Common Lisp、Forth还是我甚至没有听说过的东西。你不能依靠这样的答案来发现这些特性是否真的很棒,因为你得到了一个非常大的选择偏差。 - David Thornley
显示剩余2条评论
6个回答

33
我认为D语言相对于更传统的静态类型语言有以下优势:
  1. 极其强大的编译时元编程功能。例如,查看D2标准库中的std.algorithmstd.rangestd.parallelism模块很可能很快就会被包含进来,到那时它将是另一个很好的例子。这些功能足够强大,以至于该语言有时感觉几乎是duck-typed(鸭子类型),但又具备静态类型语言的性能。还可以参考关于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. 具备本地编译语言的性能,同时放弃的便利性明显较少,这主要是由于其惊人的元编程功能以及其在标准库设计中的应用。

  • 静态检查。你的程序不会因为打错变量名或试图给整数类型赋予字符串而在某一天崩溃。

  • 能够进行低级别的工作。例如,除了一些小块的内联汇编代码之外,D语言的垃圾回收器完全是用D语言编写的。


  • 3
    关于您对样板代码的评论,我想补充一点--当您需要创建样板代码时,通常可以使用字符串混合(string mixins)在语言本身中完成。这也是在编译时进行检查的。实质上,您可以将D编译器本身用作代码生成器! - Tim Keating

    9

    我自己正在学习D语言,来自于C/C++背景。D语言吸引我的是它的优雅和深思熟虑的设计。在经历了深入黑暗的C++角落之后,这感觉就像天堂。

    对我来说,D语言的一个大缺点是缺少库。即使是标准库,我也觉得不太好。语言很棒,但库不行(至少现在还不行)。不过你可以使用C库,这是一个大拇指。

    尽管D似乎有许多技巧和语言方面,但它只有C++的一半。因此,我认为学习速度明显更快(肯定是因为90%来自C++或相关语言)。所以学习这门语言应该只需要几周/几个月。

    由于GUI的工具还不太好,您可能希望在其他语言中开发编辑器。另外两个项目非常适合使用D语言。


    5
    我必须补充说明,经过1.5年的发展,标准库取得了显著进展。它非常易用且稳定性也很快。编译器也在快速成熟。目前的障碍是缺乏详尽的文档和一些边角案例的编译器错误。我希望后者能通过将GDC集成到GNU编译工具集中来解决。 - Taco de Wolff

    8
    如果你想要C++的“强大”功能,但不想要繁琐的语法,或者想要像适当的字符串和类这样有用的功能,那么我认为D语言是值得一试的。如果你喜欢使用庞大的API(如C#/Java),那么D可能不会吸引你。请注意,使用D 1.0版本,因为对于D 2.0版本,库(wxD和其他GUI库)和编译器(GCD、LDC以及任何非DMD的编译器)的支持非常差,尽管该版本语言明显有所改进。

    5
    虽然这段话是在2010年发布时真实的,但现在已经有了支持gcc和LLVM的D2版本。D1已经成为过去时代的遗迹。 - Matt Kline

    7
    我想说,昨天我开始学习D语言,发现它比C++好太多了,因此出于纯粹的热爱,我已经学习了两天。虽然它不是完美的,但和C++相比呢?毫无疑问。Java也一样。三天前,C#是我首选的语言,但今天我认为它已经下降了一个等级。
    尚未在任何严肃的工作中使用D,我可能会有所误解。但是,D对C++的所有主要批评都有答案,从编译时间,到差劲的类型安全性,到维护头文件的麻烦,再到缓慢的编译速度。D不仅是进化的改进,而且还有世界上流行语言中没有的创新。
    • 据说它拥有世界上最快的编译器之一
    • 您可以使用try/catch/finally和RAII,但是scope(exit)使得编写安全异常代码更加易读易写
    • 您可以定义闭包编译器可以内联(任何C++11编译器都可以吗?我不确定,由于需要支持Windows CE,我被困在Visual C++ 2008上)
    • 垃圾回收是标准的但是可选的,因此您可以通过避免GC分配来编写具有低延迟保证的程序(但如何管理内存呢?我怀疑可以使用alias this将智能指针制作成类似于C ++的形式?)
    • Slices是一种比C ++迭代器更安全且更方便的集合访问机制,无需像lower_bound(blobCollection.begin(), blobCollection.end(), blob)那样重复自己
    • 泛型比C ++更灵活,不会产生大量错误消息
    • 编译时元编程远远超过了C ++(显然也超过了C#)
    • 编译时反射,如果需要,可以用来构建运行时反射系统(我希望如此,但无法确认)
    • 设计良好的多范式并发方法,具有适用于共享内存和消息传递体系结构的有趣功能
    • 内置支持单元测试
    • 数组表达式,例如a[] = (b[] + c[]) / 2(MATLAB更简洁地完成了这项工作,但在通用语言中,这种功能很少见)
    • 卓越的浮点特性(例如nextUp()/nextDown()/ulp(),十六进制浮点数,硬件异常控制)
    对于编译器或搜索引擎库,D显然表现出色。而且由于D与C ++非常相似,您不需要花费很多时间学习它,那为什么不用呢?此外,从C++移植小型程序和库应该不难。我有印象GUI绑定也在改善,所以也许D现在适合用于文本编辑器。
    诚然,我并不满意所有的东西。他们仍然迎合C人群,因此您仍然必须在switch语句中填写breaks,static关键字被混乱地过度使用,lambda需要花括号和“return”语句(与C#的更快的x -> x + 1语法相反),所有函数和try / catch都需要花括号,在调用站点隐式传递引用......但D提供的太好了,不容错过。
    当然,虽然D语言显然很棒,标准库也成熟了,但周边工具可能并不那么好:IDE、对智能手机平台的支持等。我试过的唯一一个IDE是Visual D(Visual Studio的IDE插件),它运行得相当不错,包括调试,似乎与Visual C++调试器一样有效,可以进入标准库(很有趣!)。然而,代码完成功能尚不完善。
    与C#相比,D在大多数方面都更好,但在动态链接和反射方面似乎较弱。例如,你的文本编辑器可以轻松地在.NET下拥有插件系统,但我对D并不确定。.NET还提供了运行时代码生成,而D则没有。然而,存在一个 研究编译器,可以将D编译为.NET代码。考虑到C++/CLI已经编译为.NET(C++/CLI),也许有一天人们可以同样使用D来处理托管和本机代码(当然,在托管领域会有一些性能损失)。
    与C/C++和.NET的互操作性相当不错。D语言通过 extern (C++) 和 C++名称缩短(但是是哪个编译器的名称缩短?)与C++函数和单继承类进行互操作,同时您可以轻松地创建可从.NET和其他语言调用的COM接口。

    2

    对于效率,我会给予+1的评价;对于模块化,我不偏向任何一方,评价为0;对于团队合作,我也会给予0的评价;但是在修复错误方面,我会给予巨大的-1分。

    这个-1分是因为D语言的库并没有被广泛使用,导致其功能不够完整且存在bug。在这种情况下,你总是需要花费时间来修复第三方代码。此外,由于缺乏一个好的D调试器,我也会给予巨大的-1分。

    通常情况下,作为一名Eiffel程序员,我会因为D具有按契约设计的特性而给予+1的评价,但是这种特性并未在标准库中得到全面应用,并且绝大部分的附加库也没有使用它,因此你将无法从中获得很多好处。


    4
    “好的D语言调试器不存在” — 最近gdb支持D语言了,同时也可以看看Visual D - kennytm
    是的,我知道人们会提到gdb,这就是为什么我写了一个好的调试器不存在。谢谢,下次我再做D语言项目时,我会检查一下Visual D。 - Lothar

    0

    我认为D语言最适合编译器,而不太适合另外两个任务。


    我认为这种编程语言适合所有人,但是对于某些方面的库却不够丰富。 - he_the_great

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接