值得学习D的努力?

Nis*_*nio 23 programming-languages d

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

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

你有3个选择:

  • C++
  • Java的
  • 和C#
  • 或者你可以探索用D做的另一种选择.

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

dsi*_*cha 31

我认为,与其他更"传统"的静态类型语言相比,D具有以下优势:

  1. 疯狂强大的编译时间元编程设施.例如,签出std.algorithmstd.range在D2标准库中.std.parallelism很可能很快就会包含一个模块,如果/何时,它将是另一个很好的例子.这些设施足够强大,语言有时几乎感觉像鸭子类型,但具有静态类型语言的性能.另请参阅关于D元编程的SO问题: 可以使用D模板的示例

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

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

相对于动态语言,D有:

  1. 机编译语言性能虽然比你预期的方便得多,但主要是因为有很棒的元编程功能以及它们在标准库设计中的使用.

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

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

  • 关于样板代码的评论我还要添加 - 当你必须创建样板文件时,你经常可以用语言本身*使用字符串mixins来做*.这也是编译时检查的.从本质上讲,您可以将D编译器本身用作代码生成器! (3认同)

You*_*You 7

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

  • 虽然这在2010年发布时是真的,但D2在这里支持gcc和LLVM.D1是过去的遗迹. (4认同)

Tac*_*lff 7

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

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

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

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

  • 我必须在1.5年后补充说标准库已经取得了显着进展.它非常实用,可以快速稳定.编译器也迅速成熟.当前的障碍是缺乏完整的文档和极少的编译器错误的极端情况.我希望后者能够解决GDC被集成到GNU编译器工具集中的问题. (3认同)

Qwe*_*tie 6

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

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

  • 据说它拥有世界上最快的编译器之一
  • 您可以使用 try/catch/finally 和 RAII,但scope(exit)会使异常安全代码更易于阅读和编写
  • 您可以定义编译器可以内联的闭包(任何 C++11 编译器都这样做吗?我不确定,由于需要支持 Windows CE,我一直在使用 Visual C++ 2008)
  • 垃圾收集是标准的但可选的,因此您可以通过避免 GC 分配来编写具有低延迟保证的程序(但是如何管理内存?我怀疑可以使用alias thisC++ 来制作智能指针?)
  • 切片,一种集合访问机制,比 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语句breaksstatic关键字被过度使用,令人困惑,lambdas 需要大括号和“返回”语句(与 C# 的更快x -> x+1语法相反),所有函数和 try/catch 都需要大括号,引用传递在调用站点是隐含的……但是 D 提供的东西太好了,不能错过。

但是当然,虽然 D语言很了不起,标准库也明显成熟了,但周边的工具可能不是那么好:IDE,对智能手机平台的支持等等。我尝试过的唯一 IDE,Visual D(IDE 插件) Visual Studio) 工作得很好,包括调试,它似乎与 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 接口。