【问题标题】:Is worth the effort to learn D? [closed]值得努力学习 D 吗? [关闭]
【发布时间】:2011-04-06 23:46:59
【问题描述】:

假设你有 3 个项目:

  • 程序员的文本编辑器
  • 编译器
  • 和至少 3 种文件类型的搜索引擎库:html、.xls 和 pdf。

你有3个选择:

  • C++
  • Java
  • 和 C#
  • 或者您可以探索使用 D 的替代方法。

然后,你问更聪明的程序员:D 能否在这项任务中给我带来显着优势,在以下领域:模块化、错误修复、团队合作和机器效率?

【问题讨论】:

  • 不知道你想做什么,或者你已经知道的语言,是不可能回答的。而且,有资格谈论 D 与其他语言的人几乎肯定是 D 爱好者,因此您不太可能得到平衡的答案。
  • 如果没有更多细节,我们怎么可能回答这个问题?显然,这对一些 是值得的,而对其他人 是不值得的。你对语言有什么期望?您是否打算用它开发一些东西,或者这是一种学习体验?你有没有研究过 D 提供什么?
  • 关于 Michael Petrotta 的问题,是的,我正在研究 D 提供的功能,但所有语言都基于这个或那个功能提供天堂和天堂。我想从真正从事实际工作的人那里了解这些功能是否如他们所说的那么美妙。
  • 这不是一个论坛,请用您的编辑来编辑您的原始问题。
  • @Nisanio:问题是,对于用户选择使用的任何语言,无论是 D、Common Lisp、Forth 还是我从未听说过的语言,您都会得到热情的回答。你不能依靠这样的答案来判断这些功能是否真的很棒,因为你得到了很大的选择偏差。

标签: programming-languages d


【解决方案1】:

在我看来,与更“传统”的静态类型语言相比,D 具有以下优势:

  1. 非常强大的编译时元编程工具。例如,查看 D2 标准库中的 std.algorithmstd.rangestd.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写的。

【讨论】:

  • 对于您对样板代码的评论,我还要补充一点——当您必须创建样板代码时,您通常可以在语言本身中使用字符串混合来完成。这也是编译时检查的。本质上,您可以将 D 编译器本身用作代码生成器!
【解决方案2】:

我本人正在学习 D,来自 C / C++ 背景。 D 吸引我是因为它的优雅,它的设计经过深思熟虑。在密集、深沉和黑暗的 C++ 角落之后感觉就像天堂一样。

对我来说,D 的一大缺点是缺少库。即使是标准库,我也觉得做得不太好。语言很棒,图书馆还没有(还)。不过,您可以使用 C 库,这是一个很大的赞许。

虽然 D 似乎有很多诀窍和很多语言方面,但它还不是 C++ 的一半。所以我认为它的学习速度非常快(肯定是因为 90% 来自 C++ 或相关语言)。所以学习语言应该是几周/几个月的事情。

由于还没有很好的 GUI 工具,您可能想用其他方式开发编辑器。其他两个项目非常适合 D。

【讨论】:

  • 我必须补充一点,在 1.5 年后,标准库取得了长足的进步。它非常有用并且很快稳定下来。编译器也迅速成熟。当前的障碍是缺乏完整的文档和极少的编译器错误。我希望后者能够通过将 GDC 集成到 GNU 编译器工具集来解决。
【解决方案3】:

如果您想要 C++ 的“强大”而不需要繁琐的语法,或者 C 的“强大”具有有用的特性(例如正确的字符串和类),我会说这是值得的。如果您喜欢依赖庞大的 API(C#/Java),那么 D 可能不会让您喜欢。 还要确保使用 D 1.0,因为库(wxD 和其他 GUI 库)和编译器(GCD、LDC、任何非 DMD)支持对于 D 2.0 来说是令人震惊的,即使该语言版本是一个明显的改进。

【讨论】:

  • 虽然这在 2010 年发布时确实如此,但 D2 在这里支持 gcc 和 LLVM。 D1 是过去的遗迹。
【解决方案4】:

我想说我昨天成为了一个 D 爱好者,当我了解到它比 C++ 好得多时,我已经学习了两天 D 纯粹是出于热爱。哦,它并不完美,但与 C++ 相比?没有比赛。 Java 同上。 3 天前,C# 是我选择的语言,但今天我认为它的排名下降了。

我还没有将 D 用于任何严肃的工作,我可能弄错了。但是 D 对通常针对 C++ 提出的每一个主要批评都有一个答案,从编译时间到糟糕的类型安全性,到维护头文件的头痛,再到缓慢的编译。 D 不仅仅是一种进化上的改进,它在世界上任何一种流行语言中都没有发现创新:

  • 据说拥有世界上最快的编译器之一
  • 您可以使用 try/catch/finally 和 RAII,但 scope(exit) 使异常安全代码更易于读写
  • 您可以定义编译器可以内联的闭包(是否有任何 C++11 编译器会这样做?我不确定,由于需要支持,我坚持使用 Visual C++ 2008 Windows CE)
  • 垃圾收集是标准的但可选,因此您可以通过避免 GC 分配来编写具有低延迟保证的程序(但是如何管理内存呢?我怀疑可以使用 alias this 来变得更智能C++ 的指针?)
  • Slices,一种集合访问机制,它比 C++ 迭代器安全得多,也方便得多,无需像lower_bound(blobCollection.begin(), blobCollection.end(), blob) 那样重复自己
  • 泛型比 C++ 更灵活,并且不会产生错误消息页面
  • 编译时元编程大大优于 C++(显然也是 C#)
  • Compile-time reflection(我希望,但无法确认)如果需要,可以使用它来构建运行时反射系统
  • 一种精心设计的多范式并发方法,为共享内存和消息传递架构提供有趣的功能
  • 对单元测试的内置支持
  • 数组表达式,例如a[] = (b[] + c[]) / 2(MATLAB 更简洁,但在通用语言中这种特性很少见)
  • 高级浮点功能(例如 nextUp()/nextDown()/ulp()、十六进制浮点数、硬件异常控制)

对于编译器或搜索引擎库,D 显然更胜一筹。而且由于 D 与 C++ 非常相似,您不必花很多时间学习它,为什么不呢?另外,从 C++ 移植小程序和库应该不难。我的印象是 GUI 绑定也一直在改进,所以也许 D 现在可以很好地用于文本编辑器。

诚然,我对所有事情都不满意。它们仍在迎合 C 人群,因此您仍然必须用 breaks 填充您的 switch 语句,static 关键字被过度使用,令人困惑,lambda 需要大括号和“return”语句(与 C# 更快的 @ 相反987654330@ 语法),所有函数和 try/catch 都需要大括号,通过引用在调用站点是隐含的......但是 D 提供的东西太好了,不能传递。

当然,虽然 D 语言 显然很棒,标准库也明显成熟,但周边工具可能不是那么好:IDE、对智能手机平台的支持等。唯一的IDE 我试过了,Visual D(Visual Studio 的 IDE 插件)工作得很好,包括调试,它似乎和 Visual C++ 调试器一样好用,并且可以进入标准库(有趣!)。但是,代码完成功能还不是很好。

与 C# 相比,D 在大多数方面都更好,但在动态链接和反射方面似乎很弱。例如,您的文本编辑器可以很容易地在 .NET 下拥有一个插件系统,但我不太确定 D。.NET 也提供运行时代码生成,而 D 没有。但是,存在 research compiler 将 D 编译为 .NET 代码。鉴于 C++/CLI 已经编译为 .NET (C++/CLI),也许有一天人们可以同样出色地使用 D 来处理托管代码和本机代码(当然,在托管领域的性能影响很小。)

与 C/C++ 和 .NET 的互操作性相当不错。 D 应该通过 extern (C++) 和 C++ 名称修改(但 哪个编译器的 名称修改?)与 C++ 函数和单独继承的类进行互操作,同时您可以轻松创建可从 .NET 和其他调用的 COM 接口语言。

【讨论】:

    【解决方案5】:

    我会给效率+1,模块化给0(不赞成或反对),团队合作给0,错误修复给-1。

    -1 来自这样一个事实,即 D 的使用不足以使库功能完整且没有错误。在这种情况下,您总是会通过修复 3rd 方代码来浪费时间。对于不存在好的 D 调试器来说也是一个巨大的 -1。

    通常——作为一名 Eiffel 程序员——我会给 D 一个 +1 的合同设计,但这并不是在整个标准库中经常使用的,而且 95% 的附加库绝对不会使用它。所以你不会从中获得很多好处。

    【讨论】:

    • 不存在好的 D 调试器 — gdb 最近支持 D,还可以查看 Visual D
    • 是的,我知道人们会提到 gdb,这就是为什么我写了一个好的调试器不存在的原因。谢谢,下次我再做一个业余时间 D 项目时,我会检查 Visual D
    【解决方案6】:

    我认为 D 绝对最适合编译器,不太适合其他两个任务。

    【讨论】:

    • 我认为该语言适合所有这些,但库中缺少一些。
    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多