写点什么

现在谈论 C++ 与 Java 的遗产是否有些为时过早?

  • 2009-04-03
  • 本文字数:2308 字

    阅读完需:约 8 分钟

最近 Bruce Eckel 关于 C++ 与 Java 遗产的博文引发了激烈的争论。在谈到了一些设计失误之后,他总结到:这两种语言对编程语言的发展都起到了非常重要的作用,同时也留下了宝贵的遗产。但此时来谈论这两种语言的遗产是否有些为时过早呢?

Eckel 曾是 C++ 标准委员会的成员,他回忆了当初 C++ 采取对 C 语言向后兼容的决定:

要想明白为何 C++ 那么难用、那么复杂及其设计中好的一面,你必须要清楚 C++ 的设计原则:与 C 语言兼容。Stroustrup 决定(看起来也是正确的)将众多的 C 程序员转向对象之路的过程透明化:可以不改变已有的 C 代码就能在 C++ 下编译通过。

C++ 吸引了大量的 C 开发者并使其转向了 C++,尽管在这方面取得了巨大的成功,但这种兼容的决策对语言的发展产生了严重的负面影响:

与 C 语言兼容会导致很大的局限性,但这也是 C++ 最强大的地方,同时也是最让人诟病之处。该决策促使了 C++ 的成功,同时也导致了其异常复杂。

他提到 C++ 中的操作符重载很难用:

他们(对 C++ 理解不深的那些家伙)认为程序员很难恰当地使用操作符重载,事实也基本如此,因为 C++ 既有栈存储,也有堆存储,你需要重载操作符以处理所有情况且要保证不会导致内存泄漏。确实有些难啊。

毫无疑问,这么说肯定会引起争论。Archilleas Margaritis 认为兼容 C 语言并没有什么问题:

我认为 C++ 并没有因为兼容 C 而导致糟糕的设计。ADA 也兼容于 C,但却是非常棒的语言,其设计来源于久经考验的工程学实践。 对于 C++ 来说,与 C 源码级的兼容才是问题的根源。C++ 保留了 C 的预处理系统来包含 C headers,这导致了别扭的失去了上下文关系的自由语法,而这么做的目的只是为了与 C 兼容,实在是得不偿失啊。

Michele Costabirle 认为从一开始就缺少标准的程序库是 C++ 的一个败笔:

我觉得 C++ 的一个严重问题就是缺少标准的程序库。 如果记得没错的话,Stroustroup 在“C++ 的设计与演化”一书中说到他应该写一个标准程序库来支持多继承,我等无福消受啊。

关于 C++ 有很多东西值得探讨,但确定的一点是:C++ 助力程序员在编程之梯上迈上了一个新台阶。

接下来 Eckel 又以同样的基调谈到了另一种编程语言:Java,他也揪出了 Java 的一些设计错误:

多年来,Java 团队一直对“操作符重载太复杂”这个论调深信不疑。这一点以及其它很多决定导致我们在开发中困难重重,鉴于此,我对 Gosling 及其率领的 Java 团队的很多决定都嗤之以鼻… 他们说:“为了效率必须引入原生数据类型”。而我认为正确的做法应该是坚持“万物皆对象”这一理念,同时在需要考虑效率问题时提供“后门”来进行低层次的操作(这也需要考虑使用 hotspot 技术来透明地提高效率,最后的结果也是这样——引入了该技术)。最后我们发现无法使用浮点处理器直接计算超函数(结果使用软件实现了)…

我曾批评过泛型那糟糕的设计,结果得到的回复也一样:“我们需要对 Java 之前的决定(非常差劲的决定)保持向后兼容”。最后随着越来越多的人掌握了泛型编程的技巧,他们才发现泛型确实很难用。

Bill Venners 所回忆的却与此不同:

我不知道你是怎么得到下面这个结论的:放弃操作符重载仅仅是因为它太复杂了。我记得在采访 Gosling 时曾问过他为何放弃操作符重载(我想该问题和答案还尚未公开过)。他的回答与其他场合下的说法也是如出一辙:Gosling 看到在其他语言中操作符重载被大量滥用(我不知道这是否专指 C++,但肯定包括 C++),这已经超过了它能带给我们的好处。就是这些,这是主观上的设计决策。

James Watson 对 Java 故意采取的那些限制表示支持:

Java 值得称道之处就在于容易模仿。用任何语言你都能编写出难以维护的代码,但 Java 则不然。它没有像其他语言那样提供那么多容易滥用的特性。 从个人角度来看,这很可怕。如果我不想使用某个特性,那不用就好了。Sun 提的那些建议与我何干?但如果你处在团队当中,每个人都有不同的想法,那情形就大不一样了。用有限的方法完成任务就很有意义了。

Noel Grandin 也来劲了,他甚至还提到了其他语言,这让争论达到了白热化的程度:

大多数其它的“热门”语言,像 Ruby、Scala 等都没有随大流,因为他们更偏重于编写代码,而不是阅读代码。 Java 完美的平衡了这一点——看起来 Java 很乏味且缺少“酷酷”的特性,但我们却能够轻松领会代码的意图。

最后,Eckel 谈到了 Java 遗产:

Java 将主流程序员带到了垃圾回收、虚拟机和一致的错误处理模型的世界中(特别是在你去掉 checked 异常时更是如此,这可以通过我在 Thinking in Java 第四版中提到的技术实现)。尽管它有很多缺陷,但却让我们提升了一个层次,将我们带到了更高层的语言中来。

最积极的因素就是为未来语言做好准备了:

C++ 曾经是最主要的语言,人们认为这会一直持续下去。很多人对 Java 也持有相同的观点,但实际上 Java 更容易被超越,原因在于 JVM。现在我们是可以创建一门新的语言并且其效率也可以达到 Java 的水平… 这种情况正在上演——既有高层的静态语言如 Scala,也有动态语言,包括新创建的和移植过来的,如 Groovy、JRuby 及 Jython…

无心插柳柳成荫,即便 Java 本身已经走到头且不会再发展了,那它也为后继者铺平了道路。未来所有的语言都会了解到:要么创建一种可被模仿的文化(就像 Python 和 Ruby 那样),要么给竞争者创造成长的空间。

在出现之际 Java 就引起了很多争论,尤其是在 C++ 与新的 Java 开发者之间的争论。从那以后,争吵声逐渐平息下来,我们也得以更清楚地看到自己所处的位置以及这两种语言的为我们所留下的遗产。或许现在谈论遗产问题有些为时过早?听起来好像他们已死或正在垂死挣扎(我们期盼你的意见)。

查看英文原文: Is It Premature to Talk About C++ and Java’s Legacy?

2009-04-03 07:431274
用户头像

发布了 88 篇内容, 共 274.0 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

华为云等保合规方案,助力企业最快30天过等保

科技说

Golang负载均衡器Balancer的源码解读

骑牛上青山

Go 负载均衡

在华为云构建多云跨云的容灾系统,真的很香

路过的憨憨

跨平台应用开发进阶(四十四)一文走近应用层抓包工具:Charles

No Silver Bullet

应用层 抓包分析 抓包工具 三周年连更

Exception和Error有什么区别吗 | 社区征文

共饮一杯无

Java Exception Error 三周年连更

如何利用人工智能的语言模型创造价值和收益

派大星

ChatGPT

聊聊JavaScript和Scala的表达式 Expression

汪子熙

JavaScript scala 三周年连更

🔥🔥🔥热乎的前端面试题(昨天)

Immerse

JavaScript 面试 Vue 前端面试

助力企业网络安全建设,华为云等保合规解决方案值得拥有

路过的憨憨

克隆远端项目,idea 自动生成了一个.idea 文件夹,怎么办?

bug菌

git IDEA .gitignore 三周年连更

跨平台应用开发进阶(四十五)uni-app集成企微客服实战

No Silver Bullet

uni-app 项目实战 三周年连更

Spider实战系列-爬取鬼吹灯小说

浅辄

案例分享 三周年连更

更专业、安全的过等保,华为云等保合规解决方案值得选择

IT科技苏辞

华为云等保合规解决方案,助力企业高效过等保

秃头也爱科技

MySQL数据文件被误删,如何进行恢复?

架构精进之路

MySQL 数据库 三周年连更

【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)

码界西柚

Java 安全管理器 SecurityManager

fabric.js开发图片编辑器可以实现哪些功能?多图

秦少卫

h5编辑器 FabricJS Fabric.js 海报编辑器 图片编辑

布隆过滤器的设计之美,后端程序员一定要好好体会

程序员小毕

程序员 数据结构 面试 后端 布隆过滤器

机器视觉公司,在玩一局玩不起的游戏

脑极体

CV

华为云等保方案,为企业上云保驾护航

科技说

华为云等保合规解决方案,助力企业轻松、省心、安全“上云”

秃头也爱科技

华为云等保方案,轻松满足企业等保合规要求

IT科技苏辞

Vue3 watch 与 watchEffect

程序员海军

Vue Vue 3 watch 三周年连更

一天吃透操作系统八股文

程序员大彬

面试 操作系统

【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、iptraf、ifstat]

A-刘晨阳

Linux 网络 三周年连更

2023移动云大会重磅官宣,云改“新三年”强势开局引期待?

ToB行业头条

云效AppStack--扫雷亲测

六月的雨在InfoQ

云效 AppStack 云效流水线 Flow 三周年连更

新技术加持下前端开发工程师的未来在哪里?| 社区征文

No Silver Bullet

前端开发 新技术 三周年征文

现在谈论C++与Java的遗产是否有些为时过早?_Java_Abel Avram_InfoQ精选文章