值得学习D的努力?

时间:2010-09-01 19:22:35

标签: programming-languages d

想象一下,你有3个项目:

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

您有3个选择:

  • C ++
  • Java
  • 和C#
  • 或者您可以探索使用D.
  • 进行此操作的替代方法

然后,你要求更多高级程序员:在这个任务中,D能否给我一个显着的优势:模块化,错误修复,团队工作和机器效率?

6 个答案:

答案 0 :(得分:30)

正如我所看到的,与传统的“传统”静态类型语言相比,D具有以下优势:

  1. 疯狂强大的编译时间元编程设施。例如,请查看D2标准库中的std.algorithmstd.range。很快就会包含std.parallelism模块,如果/何时,它将是另一个很好的例子。这些功能足够强大,语言有时感觉几乎是 duck-typed ,但具有静态类型语言的性能。另请参阅关于D元编程的问题:Examples of what D’s templates can be used for

  2. 默认D2并发模型基于消息传递。如果您没有以明显的,可迁移的方式破坏类型系统,则D2中的线程之间不能隐式共享数据。当然,如果你真的想要未经检查的数据共享,你可以通过强制转换来解决这个问题。例如,目前正在审核的std.parallelism模块就是为了获得踏板到金属的多核并行性。

  3. D倾向于使简单的事情比C ++或Java 简单得多。 (我对C#不太确定。)简单来说,我的意思是基本文件I / O或策略模式之类的东西不需要那么多的样板。事实上,我认为D的主要设计目标之一是从地球表面消除样板代码,因为在语言和标准库的设计中都非常强调避免对它的需求。

    < / LI>

    相对于动态语言,D有:

    1. 本机编译语言的性能虽然放弃了比预期更少的便利性,主要是因为有很棒的元编程功能及其在标准库设计中的应用。 / p>

    2. 静态检查。您的程序有一天不会崩溃,因为您错误输入了变量名称或尝试将字符串分配给整数。

    3. 执行低级别工作的能力。例如,除了几个内联汇编程序之外,D的垃圾收集器完全用D语言编写。

答案 1 :(得分:7)

如果你想要C ++的“强大”而不需要繁琐的语法,或者C语言的“强大”和有用的功能如正确的字符串和类,我会说这是值得的。如果你喜欢拥有一个巨大的API(C#/ Java),D可能不会让你感到满意。 同时确保使用D 1.0,因为库(wxD和其他GUI库)和编译器(GCD,LDC,任何非DMD)支持令人骇人听闻的D 2.0,尽管该版本的语言是一个明显的改进

答案 2 :(得分:7)

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

对我而言,D的一大缺点是缺乏图书馆。即使是标准库我也找不到很好的工作。语言很棒,图书馆还没有。你可以使用C libs,这是一个大拇指。

虽然D似乎有许多知识和许多语言方面,但它不是C ++的一半。所以我认为它的学习速度要快得多(肯定是因为90%来自C ++或相关语言)。因此,学习语言应该是几周/几个月。

由于还没有很好的GUI工具,你可能想要用其他东西开发编辑器。另外两个项目非常适合D。

答案 3 :(得分:4)

我想说我昨天成了D爱好者,当我知道它比C ++好多了,而且我一直在纯粹的爱情中学习D两天。哦,它不完美,但与C ++相比?没有比赛。同样适用于Java。截至3天前,C#是我选择的语言,但今天我认为它已经降级了。

尚未将D用于任何认真的工作,我可能会弄错。但是对于C ++的每一个主要批评都有答案,从编译时间到糟糕的类型安全,到维护头文件的头痛,以及编译速度慢。 D不仅仅是一种进化改进,它还具有世界上任何一种流行语言都没有的创新:

  • 据说它拥有世界上最快的编译器之一
  • 您可以使用try / catch / finally和RAII,但scope(exit)使异常安全代码更易于读写
  • 您可以定义闭包编译器可以内联(任何C ++ 11编译器都这样做吗?我不确定,因为需要支持,我被困在Visual C ++ 2008上Windows CE)
  • 垃圾收集是标准但是可选,因此您可以通过避免GC分配来编写具有低延迟保证的程序(但是如何管理内存呢?我怀疑可以使用alias this来实现制作智能指针a 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人群,因此您仍需要用switch填充breaks语句,static关键字过于混乱,lambdas需要括号和“返回”声明(与C#更快的x -> x+1语法相反,所有函数和try / catches都需要大括号,在调用站点隐含了pass-by-reference ...但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接口和其他语言。

答案 4 :(得分:1)

我会为效率提供+1,为模块化提供0(无专业或无效),为团队工作提供0,为修复错误提供巨大的-1。

-1来自这样一个事实:D实际上并没有足够的使用来使库功能完整且没有bug。在这种情况下,您将通过修复第三方代码来节省时间。对于不存在良好的D调试器,也是一个巨大的-1。

通常情况下 - 作为一名埃菲尔程序员 - 我会给D一个+1来进行合同设计,但这并不是在标准库中不经常使用,并且绝对不会被95%的其他库使用。所以你不会从中获得很多好处。

答案 5 :(得分:0)

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