本文翻译自Bruce Eckel(《Thinking in C++》& 《Thinking in Java》作者)的博文,该博文于2009年03月14日发表于:

http://www.artima.com/weblogs/viewpost.jsp?thread=252441

本文的发表引起了互联网上热烈的讨论,关于讨论大家可以到这里围观。

下面是原文。原名《The Positive Legacy of C++ and Java》

    摘要:

在最近的讨论中,有些人断定C++并不是一个设计完美的语言。在我在C++标准委员那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的问题列表在这些沉闷的回应面前只能显得单调乏味。那么,是不是这样就意味着Java是失败的语言设计呢?绝对不是,Java将主流程序员带 入到了一个垃圾收集器、虚拟机、一致的错误处理模型的世界(如果你不使用异常处理,这类异常可能是非常有用的异常,正如我在《Think in Java 》4ed中演示的那样)。伴随着它设计上种种缺陷,Java把我们带领到了一个更高的层次,在这个层次上我们正在准备着迎接更为高级别的语言。(译者注: 作者在这里大意是说Java干了很多事虽然很不成熟,可能还有点失败,但他的成功之外是能让我们找到一种通往更为高级别的语言的铺路石。作者在这里有讥讽 的意思。)

另一个观点,人们一直认为C++是语言中的先驱,许多人也认为Java是语言的先驱。但是因为虚拟机,Java使得自己更容易被别的语言替代。现在任何人 都有可能快速创建一门新的语言,并且和Java具有一样的效率;而以前,要得到一个正确的,有效率的编译器花去了开发一门新语言的大部分时间。(译者注: 作者在这里大意是说C++是先驱,而Java因为虚拟机让其性能比较差,有时还不如别的语言。作者在这里再次讥讽了Java的高不成低不就。)

现在,我们正在见证这一切的发生——不管是更高级的静态语言,例如Scala,或者说是动态语言(译者注:Dynamic Language,如Python或Ruby),不管是新的还是移植的,例如Groovy ,JRuby和Jython.这就是未来的趋势,并且其过度将会非常的平滑,因为你可以在已有的Java代码中使用这些新语言,如果有需要,你甚至可以重 写Java中产生有性能瓶颈的地方。

正如C++会消亡一样,Java自生有可能消亡,或着被用于特殊环境之下(或仅仅是为了支持以前遗留的代码,因为Java并不像C++那样会被用于硬件编 程)。但是Java 真正的亮点,也是意料之外的收获,就是如果当Java已经到了自身没法在进化的地步时,Java已经为其替代者创建一条平滑之路。所有未来的语言都将从这 里学到:要么为自己创建一种可以不断重构(进化)(正如Python和Ruby做的那样)的文化,要么就让其竞争者发展壮大。

译者注:作者本文的大意是在从侧面鄙视Java标准委员会的很多决议,作者认为Java这种静态语言性能上强不过C++,然后还不停地加入太多的动态语言 的东西,搞不好还不如那些动态语言(如Python或Ruby),整得自己高不成低不就,其现在还不如其过去,Java再这样搞下去,未来的Java必然 被别的语言所取代。

C ++和Java传统中积极的一面相关推荐

  1. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  2. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  3. 如何解决java.lang.NoClassDefFoundError:Java 9中的javax / xml / bind / JAXBException

    本文翻译自:How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9 I have s ...

  4. Java开发中Websocket的技术选型参考

    1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...

  5. 聚合中返回source_Java 8 中的 Streams API 详解—— Streams 的背景以及 Java 8 中的使用详解...

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  6. Java的中BIO、NIO、AIO-1

    Java的中BIO.NIO.AIO-1 java  最近在项目中用到TCP通信来完成命令和运行结果的交互,用的是典型的TCP通信中的C/S架构,原因很简单:在业务需求低的环境下,这种架构简单.稳定还容 ...

  7. java8避免null_在 Java 8 中避免 Null 检查

    如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一.而且中级和高级程序员也在时时刻刻规避这个错误.其是迄今为止 Java ...

  8. Java 9 中的 GC 调优基础

    转载自   Java 9 中的 GC 调优基础 在经过了几次跳票之后,Java 9终于在原计划日期的整整一年之后发布了正式版.Java 9引入了很多新的特性,除了闪瞎眼的Module System和R ...

  9. Java 9中的HTTP / 2支持简介

    1.简介 IETF流媒体小组于2015年(即HTTP / 1.1发布后的16年) 批准了HTTP / 2协议. HTTP / 2有望降低延迟,并且使许多替代方法变得过时,而这些替代方法是HTTP / ...

最新文章

  1. python 格式话-占位符
  2. java统计日志qps_【原创】基于日志增量,统计qps,并基于ip排序
  3. 支持树莓派的路由器系统_用树莓派打造无线路由器
  4. nusoap php 7,nusoap-用php的NuSoap 访问webservice遇到的问题。
  5. 我是怎么进入Oracle这样的大企业的?
  6. 一双耐克出厂价70元,代工老板赚到900亿身家
  7. 做你最后的Administrator
  8. [JSOI2016]病毒感染[dp]
  9. Flocker 做为后端存储代理 docker volume-driver 支持
  10. 哪些话你一开始不信,后来却深信不疑
  11. 他们为啥说我没有数据分析思维?
  12. 简化版shell远程登录脚本
  13. jdbc mysql innodb 死锁 deadlock_Mysql InnoDB 数据更新/删除导致锁表
  14. poi 和jxl导出excel(2)
  15. 基于地理距离的省际空间权重矩阵
  16. bootstrap表单样式
  17. NanobeamM5无线网桥配置
  18. matlab数学实验二重积分的计算,matlab计算二重积分
  19. 根据线索整理的一套在2021年继续使用Flash Player的方法(20.12.29更新)
  20. FPGA之旅设计99例之第九例-----驱动0.96寸OLED屏

热门文章

  1. 老是抱怨责怪他人_责怪实施,而不是技术
  2. java 更改excel文件名称_根据Excel文件中的内容,修改指定文件夹下的文件名称
  3. SMSC updata error (更新错误)
  4. arch linux必备软件,ArchLinux常用软件
  5. 最常用的9个机器学习算法,解决99%的业务问题!
  6. 一个用 C 开发的图形界面开发库
  7. 第4章 MyBatis的关联映射和缓存机制
  8. ICCV2019 最佳论文解读:SinGAN从单幅图像学习生成模型
  9. 企业IT部门基本岗位配置
  10. FutureTask的介绍和基本使用