C++和Java传统中积极的一面
作者:Bruce Eckel
译者:赵锟、陈皓
译者注:
本文翻译自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必然被别的语言所取代。
(转载时请注明译者和出处,请勿用于商业用途)
分享到:
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效并网运行。,MMC整流器(Matlab),技术文档 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧电压6.6kV 2.控制器采用双闭环控制,外环控制直流电压,采用PI调节器,电流内环采用PI+前馈解耦; 3.环流抑制采用PI控制,能够抑制环流二倍频分量; 4.采用最近电平逼近调制(NLM), 5.均压排序:电容电压排序采用冒泡排序,判断桥臂电流方向确定投入切除; 结果: 1.输出的直流电压能够稳定在25.2kV; 2.有功功率,无功功率稳态时波形稳定,有功功率为3.2MW,无功稳定在0Var; 3.网侧电压电流波形均为对称的三相电压和三相电流波形,网侧电流THD=1.47%<2%,符合并网要求; 4.环流抑制后桥臂电流的波形得到改善,桥臂电流THD由9.57%降至1.93%,环流波形也可以看到得到抑制; 5.电容电压能够稳定变化 ,工作点关键词:MMC
Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法
STM32F103C8T6 USB寄存器开发详解(12)-键盘设备
科技活动人员数专指直接从事科技活动以及专门从事科技活动管理和为科技活动提供直接服务的人员数量
Matlab Simulink仿真探究Flyback反激式开关电源性能表现与优化策略,Matlab Simulink仿真探究Flyback反激式开关电源的工作机制,Matlab Simulimk仿真,Flyback反激式开关电源仿真 ,Matlab; Simulink仿真; Flyback反激式; 开关电源仿真,Matlab Simulink在Flyback反激式开关电源仿真中的应用
基于Comsol的埋地电缆电磁加热计算模型:深度解析温度场与电磁场分布学习资料与服务,COMSOL埋地电缆电磁加热计算模型:温度场与电磁场分布的解析与学习资源,comsol 埋地电缆电磁加热计算模型,可以得到埋地电缆温度场及电磁场分布,提供学习资料和服务, ,comsol;埋地电缆电磁加热计算模型;温度场分布;电磁场分布;学习资料;服务,Comsol埋地电缆电磁加热模型:温度场与电磁场分布学习资料及服务
1、文件内容:ibus-table-chinese-yong-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-yong-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于51单片机protues仿真的汽车智能灯光控制系统设计(仿真图、源代码) 一、设计项目 根据本次设计的要求,设计出一款基于51单片机的自动切换远近光灯的设计。 技术条件与说明: 1. 设计硬件部分,中央处理器采用了STC89C51RC单片机; 2. 使用两个灯珠代表远近光灯,感光部分采用了光敏电阻,因为光敏电阻输出的是电压模拟信号,单片机不能直接处理模拟信号,所以经过ADC0832进行转化成数字信号; 3. 显示部分采用了LCD1602液晶,还增加按键部分电路,可以选择手自动切换远近光灯; 4. 用超声模块进行检测距离;
altermanager的企业微信告警服务
MyAgent测试版本在线下载
Comsol技术:可调BIC应用的二氧化钒VO2材料探索,Comsol模拟二氧化钒VO2的可调BIC特性研究,Comsol二氧化钒VO2可调BIC。 ,Comsol; 二氧化钒VO2; 可调BIC,Comsol二氧化钒VO2材料:可调BIC技术的关键应用
C++学生成绩管理系统源码
基于Matlab与Cplex的激励型需求响应模式:负荷转移与电价响应的差异化目标函数解析,基于Matlab与CPLEX的激励型需求响应负荷转移策略探索,激励型需求响应 matlab +cplex 激励型需求响应采用激励型需求响应方式对负荷进行转移,和电价响应模式不同,具体的目标函数如下 ,激励型需求响应; matlab + cplex; 负荷转移; 目标函数。,Matlab与Cplex结合的激励型需求响应模型及其负荷转移策略
scratch介绍(scratch说明).zip
内容概要:本文全面介绍了深度学习模型的概念、工作机制和发展历程,详细探讨了神经网络的构建和训练过程,包括反向传播算法和梯度下降方法。文中还列举了深度学习在图像识别、自然语言处理、医疗和金融等多个领域的应用实例,并讨论了当前面临的挑战,如数据依赖、计算资源需求、可解释性和对抗攻击等问题。最后,文章展望了未来的发展趋势,如与量子计算和区块链的融合,以及在更多领域的应用前景。 适合人群:对该领域有兴趣的技术人员、研究人员和学者,尤其适合那些希望深入了解深度学习原理和技术细节的读者。 使用场景及目标:①理解深度学习模型的基本原理和结构;②了解深度学习模型的具体应用案例;③掌握应对当前技术挑战的方向。 阅读建议:文章内容详尽丰富,读者应在阅读过程中注意理解各个关键技术的概念和原理,尤其是神经网络的构成及训练过程。同时也建议对比不同模型的特点及其在具体应用中的表现。
该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。
这份长达104页的手册由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队精心编撰,内容详尽,覆盖了从基础概念、技术原理到实战案例的全方位指导。它不仅适合初学者快速了解DeepSeek的基本操作,也为有经验的用户提供了高级技巧和优化策略。
主题说明: 1、将mxtheme目录放置根目录 | 将mxpro目录放置template文件夹中 2、苹果cms后台-系统-网站参数配置-网站模板-选择mxpro 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进入后台设置 4、主题后台地址: MXTU MAX图图主题,/admin.php/admin/mxpro/mxproset admin.php改成你登录后台的xxx.php 5、首页幻灯片设置视频推荐9,自行后台设置 6、追剧周表在视频数据中,节目周期添加周一至周日自行添加,格式:一,二,三,四,五,六,日
运行GUI版本,可二开