我对D不太了解,但是我认识的许多C ++程序员对此非常不满意,我个人必须同意-我不喜欢D的外观,也不会更亲近D。
为了理解为什么D没有获得更多的吸引力,您需要首先了解什么吸引了人们使用C ++。一言以蔽之,首要原因是控制。当您使用C ++编程时,便可以完全控制您的程序。是否要替换标准库?您可以。是否想进行不安全的指针转换?您可以。想违反const正确性吗?您可以。是否要更换内存分配器?您可以。是否要在原始内存中复制而不考虑其类型?如果您真的想要。要继承多个实现吗?这是你的葬礼。地狱,您甚至可以获得垃圾收集库,例如Boehm收集器。然后,您会遇到诸如性能之类的问题,这些问题与控制息息相关-程序员拥有的控制权越多,他制作程序的优化就越多。
在做一些研究并与几个尝试过的人交谈时,我看到了以下几件事:
统一的类型层次结构。C ++用户很少使用继承,大多数C ++程序员更喜欢使用组合,并且只有在有充分理由的情况下,才应通过继承链接类型。对象的概念通过链接每种类型都严重违反了这一原理。另外,它违反了C ++最基本的原则之一-您仅使用所需的内容。就让程序员控制程序而言,没有选择从Object进行继承的选择以及随之而来的成本与C ++所代表的语言非常强烈地相反。
我听说过函数和委托的问题。显然,D同时具有函数和委托作为运行时可调用函数类型,它们并不相同,但它们是可互换的或...?我的朋友与他们有很多问题。这绝对是C ++的降级,C ++已经降级std::function
,您已经完成。
然后,您就具有兼容性。D与C ++并不特别兼容。我的意思是,没有一种语言与C ++兼容,让我们面对现实吧,除了C ++ / CLI有点作弊,但作为入门的障碍,必须提一下。
然后,还有其他一些事情。例如,只需阅读Wikipedia条目。
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
gets
与以前的C Standard库中的大问题一样,它是有史以来设计的最不安全的功能之一。如果在Stack Overflow上搜索它,您会发现很多与滥用有关的问题。从根本上讲,printf
是对DRY的侵犯-您要在格式字符串中输入类型,然后在输入参数时再次输入。违反DRY的地方,如果您弄错了,就会发生非常糟糕的事情-例如,如果将typedef从16位整数更改为32位整数。它也不是完全可扩展的,想象一下如果每个人都发明了自己的格式说明符会发生什么。C ++的iostream可能很慢,它们对运算符的选择可能不是最大的,它们的接口可以使用工作,但是从根本上保证了它们的安全性,并且不违反DRY,并且可以轻松扩展它们。这不是可以说的printf
。
没有多重继承。那不是 C ++的方式。C ++程序员希望对他们的程序拥有完全的控制权,而强制执行您无法继承的语言违反了该原则。另外,它使继承(甚至更多)变得脆弱,因为如果由于要提供默认实现或某些东西而将类型从接口更改为类,突然间所有用户代码都将被破坏。那不是好事。
另一个示例是string
和wstring
。在C ++中,必须在它们之间进行转换已经非常痛苦,并且该库是否支持Unicode,而这个旧的C库仅使用const char*
,并且必须根据所需的字符串参数类型编写同一函数的不同版本。值得注意的是,例如Windows标头具有一些非常令人讨厌的宏,以解决通常可能会干扰您自己的代码的问题。添加dstring
到混音只会使情况变得更糟,因为现在必须管理三种字符串类型,而不是两种字符串类型。具有多个字符串类型将增加维护难度,并引入重复的代码来处理字符串。
斯科特·迈耶斯写道:
D是一种编程语言,旨在帮助程序员应对现代软件开发的挑战。它通过促进通过精确接口互连的模块,紧密集成的编程范例联盟,语言强制的线程隔离,模块化类型的安全性,有效的内存模型等来实现。
语言强制的线程隔离不是一个加分项。C ++程序员希望完全控制自己的程序,而强制执行某种操作的语言绝对不是医生所订购的。
我还将提到编译时字符串操作。D可以在编译时解释D代码。这不是一个加号。考虑一下C语言相对有限的预处理器所引起的巨大麻烦,所有资深C ++程序员都知道这种情况,然后想象一下此功能将被滥用的严重程度。在编译时创建D代码的能力很好,但是应该是语义的,而不是语法的。
另外,您可以期待一定的反射。D具有垃圾回收,C ++程序员会将垃圾回收与Java和C#之类的语言相关联,这些语言在哲学上与之直接相对立,并且语法上的相似性也使他们想到。这不一定客观上是合理的,但一定要注意。
从根本上讲,它没有提供C ++程序员无法做到的很多功能。用D 编写阶乘元程序也许更容易,但是我们已经可以用C ++编写阶乘元程序。也许在D中您可以编写一个编译时的光线跟踪器,但是无论如何也没有人真正想要这样做。与C ++哲学的根本违背相比,在D中可以做的事情并不是特别值得注意。
即使这些问题只是表面上的问题,但我可以肯定地说,表面上D实际上根本不像C ++的事实很可能是许多C ++程序员不迁移到D的一个很好的理由。也许D需要做一个更好的广告自己。