上学吧:http://www.shangxueba.com
上学吧为您提供 JAVA 认证考试资料下载:http://www.shangxueba.com/share/e53.html
8 年里,我目睹所有关于 C++的决议的诞生。我希望本文有助于帮读者理解 C++和 JAVA 的设
计选择,从而可以让大家更全面的来看待他们。
有人说,我很少再使用 C++.当我使用 C++时,我只是为了测试一下陈旧的代码,或者写
一个和性能密切相关的程序,通常这个程序非常小,并且通过其他的语言来调用。(我喜欢
的做法是,用 Python 快速开发一个程序,用 profile 辅助程序对其进行性能优化,如果需要
的话,通过 Python 的 ctypes 调用 C++写的程序来改善性能)。
因为我曾经是 C++标准委员会的一员,我目睹了这些决议的产生。这些 C++决议都是在
经过超级深思熟虑的考虑之后在做出,他们远比大多数 Java 的决议更为谨慎小心。
然而,就像有些人准确地指出那样,C++是复杂而难于使用的,并且充满了各种个样容
易让人忘记的古怪的规则。当我在写书的时候,我只能从规范中找到这些规则的说明,而不
是自己能记住这些规则。
为了让人们理解 C++这门语言如何即难用、复杂,同时还要有良好的设计,你必须记住
一条 C++中最主要的设计原则——兼容 C 语言。这是 Stroupstru 最正确的决定,这样做将会
出现一条让大量的 C 程序员通向 C++程序的捷径:这条捷径允许 C 程序员不需要做任何修改
就可以在 C++下编译程序。然而,这也成为了 C++语言巨大的约束,它给 C++带来了强大的
力量,同时也给 C++带来了无尽的痛楚。正是因为这个约束导致了 C++如此的成功,并且也
如此的复杂。
这些 C++古怪的条约使那些没有完全了解 C++的 Java 的设计者们犯了傻。例如,他们认
为程序员能用好操作符重载将会是非常困难的一件事。但是操作符重载在 C++中却是必须的,
因为在 C++中有栈分配,同时又有堆上的分配,你只有通过重载好操作符来处理好不同类型
的内存分配,并保证不会产生内存泄漏,的确是难!但对 Java 来说,因为 Java 只有单一的
一种内存分配机制(译者注:Java 基本上是采用堆分配)和垃圾回收机制,这样操作符重载
在 Java 中就变得多余(正如 C#的操作符重载,和更早之前的 Python 操作重载,但是 Python
出现的要比 Java 早)。但是多年以来,来自 Java 的团队就一致认为“操作符重载太过复杂”。
这一决议或其他的一些 Java 决议,明显说明了很多 Java 的设计者在做出决议的时候没有做
足自己的工作,这也是为什么我有了一个藐视由 Gosling 和他的 Java 团队所做决议的名声。
同样还有太多太多的例子,基本类型“因为性能原因被引入”。真正的原因是为了坚持“所
有都是对象”,并且同时为底层具有效率要求的程序提供一个后门(同时这也使得一些热点
技术执行起来更有效率)。噢,但是事实是,你没有办法直接使用浮点处理器来进行超越函
数的计算(译者注:Transcendental Functions ,一种微积分的函数),而只能使用软件来计
算,但原本这类函数就可以使用浮点计算处理器来计算的。我尽我所能将类似这样的问题罗
列出来,但是我听到的结果却总是那些无用的回答“这就是 Java 的方式”。
当我写下泛型是个如何糟糕的设计时,我得到了同样的回应,“我们必须兼容之前的(糟
糕的)Java 的决议”。最后越来越多的人们获得了足够关于泛型是多难用的经验——的确,C++
的泛型更强大,一致性更好(尤其现在当编译器的错误信息越来越清晰后,泛型也比以前更
好使用),因为 Java 泛型设计很差,很难,所以人们又开始回到认真对待具现化而不是泛型,
当然,这对语言是有帮助的,因为具现化这个东西并不会消弱太多的语言设计,也不会因为
这些自我限制而导致语言缺陷。
那个 Java 的问题列表在这些沉闷的回应面前只能显得单调乏味。那么,是不是这样就
评论0
最新资源