InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

“原罪”(没有原生数据类型,Java会更好吗?)

作者 Dave West 译者 崔康 发布于 2009年6月9日

领域
架构 & 设计,
语言 & 开发
主题
面向对象设计 ,
编程 ,
Java
标签
语言 ,
评论 ,
语言特性

Gilad Bracha重新挑起了一场有关编程语言设计的争论,特别是一门编程语言可以兼顾面向对象思想和原生数据类型吗?他在博客中写道:“我经常说,Java的原罪在于它不是一个纯面向对象的语言(一切皆对象的语言)。”文中讨论的主要内容不是纯面向对象语言的优点,而是提出了一个问题:Java如果没有原生数据类型,是否能保持高性能?答案是肯定的。

Gilad首先拿类型变化举了一个简单例子。Java语言的char类型最初用16位二进制表示(符合当时的Unicode标准)。但是当标准改变之后,“人们用Java处理unicode时不得不自己处理编码格式”。至于性能的问题,他提供了几个例子演示如何在不影响效率的情况下处理对象。其中一个例子:

那么我们如何避免使用原生数据类型而又不损失性能呢?

Java有一套强制静态类型机制,它被编译成静态类型的汇编语言(Java字节码,即JVML)。它支持静态类。我不建议使用这些特性,但是我们需要知道。我们唯一需要做的就是根除原生数据类型。

假设我们存在一个静态类Int表示32位整数。编译器能够把该静态类转换为int类型。因此,我们就可以编写标准的Java代码而无需损失任何性能。

更有趣的例子包括:以操作符命名的方法、==操作符、实例锁定和数组协变等等。

结论:

总之,Java原本可以完全面向对象而不受明显的性能影响。但是它过去不是,现在不是,可能未来也不是。光荣易逝啊(Sic Transit Gloria Mundi)。

文章的读者回复大多数都同意Gilad的观点。

摘选如下:

  • Daniel Speiwak——事实上,听起来很像Scala。Odersky和朋友们提出了一种有关协变数组和消除原生的解决办法:泛型特化。
  • abies ——可能并非如此简单。尽管我也认为将原生类型编码为对象可以非常高效,但是总会有损失的。Smalltalk就是一个例子——大多数实现都把小/大整数区别对待,小整数被存放在非环形指针里。这意味着整数在不同大小转换时表现出巨大的性能差异——对每一个整数的处理都有一些影响。我非常高兴Java在数学运算法方面有可能和C++/Fortran一样快。
  • Osvaldo Doederlein——有关面向对象vs原生数据类型的讨论首先面临一个挑战:举出至少一个纯面向对象语言相比拥有原生数据类型和数组的语言没有显著的性能损失。不要拿高层次的应用基准来糊弄我。我要的是数学运算/数组的微基准,或者是现实世界低层次的运算,如数据压缩、视频编码、网络栈等等。

讨论也包括一些技术上的例子以说明两者之间的鸿沟。

也许有关“OO争论”最有趣的一些方面在这次讨论中并没有提到。比如:

  • 效率vs面向对象纯度是80年代和90年初期(Java诞生之前)Smalltalk和C++语言之争的焦点,其实这是一个完全不相关的辩论,因为它忽视 了OO语言诞生的原因。当时最纯正的OO语言是 Smalltalk和Self,两者都明确的以Simula(不是Simula I)为榜样以建立一种支持领域专家简单直接的表达问题和解决方案的语言。影响性能是完全可以理解的!
  • 文章作者认为Smalltalk在嵌入式、毫秒时间计时、切换的程序和实时的图形显示系统(应用于喷气式飞机)中优于C++应用。这是因为Smalltalk应用了很多编程技巧(比如预编译的方法和Smalltalk对象可以直接与硬件打交道而不依赖操作系统)以获得性能优势。关键在于,编写相同的C++程序所花费的开发时间缩短了1/3。
  • Java从来没有真正想成为一个面向对象语言。如果Sun在获取Smalltalk授权时没有受到阻碍(ParcPlace的纯粹商业错误),Java可能根本不会存在。Oak将继续沿着“智能烤面包机”的道路进化,而不会成为Java的基础。Java的目的就是融合Samlltalk和C++的各自最佳特性,而不是成为一种纯OO语言。
  • 从代码和语言“特征”的角度谈论OO纯度是绝对错误的。对象是一种隐喻工具,开发人员可以借此更好的理解问题域,并获得完全不同的、更加简单和富有效率的 设计和架构。如果一门语言是纯面向对象,“一切皆对象”,仅仅意味着你可以直接表达你的设计而无需考虑这些这些设计在机器层面如何实现和执行。

如果基于为何编程语言这样设计、在机器执行效率不是关键因素时对象是否真的提供了一种建立设计的好办法等问题来看待纯OO/效率的争论,还是非常有趣的。

查看英文原文:"Original Sin" (Would Java be Better Off Without Primitives?) 

译者 崔康 热情的技术探索者,资深软件工程师,InfoQ编辑,从事企业级Web应用的相关工作,关注性能优化、Web技术、浏览器等领域。

闲的 发表人 ran Dig 发表于
Re: 闲的 发表人 典 刘 发表于
Re: 闲的 发表人 Zhang Phoenix 发表于
这段说的好。 发表人 Yetao Chen 发表于
  1. 返回顶部

    闲的

    发表人 ran Dig

    老美是不是因为经济危机没事干太闲啦

  2. 返回顶部

    这段说的好。

    发表人 Yetao Chen

    [blockquote]从代码和语言“特征”的角度谈论OO纯度是绝对错误的。对象是一种隐喻工具,开发人员可以借此更好的理解问题域,并获得完全不同的、更加简单和富有效率的 设计和架构。如果一门语言是纯面向对象,“一切皆对象”,仅仅意味着你可以直接表达你的设计而无需考虑这些这些设计在机器层面如何实现和执行。[/blockquote]

  3. 返回顶部

    Re: 闲的

    发表人 典 刘

    西方人这种看似无聊的争论才让他们达到了今天的高度,争论是不是一切量都可以用有理数表示,争论什么是运动,争论地球是宇宙的中心还是太阳是宇宙的中心,争论撒旦是如何诞生的,争论行星是如何运行。而我们很只注重实用,所以无法达到西方在理论上的高度,永远只能等别人争论完了,出结果了。我们拿来用用,仅此而已。

  4. 返回顶部

    Re: 闲的

    发表人 Zhang Phoenix

    同意,古有四大发明,却无核心的自然科学理论。而理论如果无用,那么原子弹是不可能造出来的。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。