2010-09-01 104 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接口。