【51CTO独家特稿】2010年开发界最值得期待的一件事就是Java 7的正式发布(如果Sun,或者说,Sun-Oracle能够遵守他们在2009年Devoxx大会上做出的承诺的话)。无论Java开发者们是否喜欢,这个从四、五年前就已经开始酝酿、并且经历了数次延期的Java 7是Sun与Java开发者社区高度协作的成果,其重要性是不可忽视的。然而根据我们的了解,Java编程语言在此次更新中的改变是极其有限的(参考阅读:Java 7新特性展望。值得一提的是,文中提到的闭包最后还是被加入进了Java 7的日程当中,不过开发者们的反映似乎没有Sun预期的那么热烈)。那么,这次重大的变革都发生在哪些方面呢?
Java,JDK与Java SE
首先我或许应该先解释一下:Java 7这个用语其实并不严谨,准确的说法应该是JDK 7或Java SE 7(Java产品的命名规则一直以混乱著称,不过基本上我们可以认为Java SE等同于JDK。这在JDK的官方下载页上是可以证实的)。那么,这个JDK包括了哪些部分?请允许我借用一下JRuby核心开发者之一,Ola Bini在一次演示上用过的简图:
图中的JVM即Java虚拟机(在Java SE中特指Sun的HopSpot),API即Java语言API类库,Java Language即Java编程语言。确切的说,鉴于用JDK开发Java程序的开发者们是自己写的代码而此代码并非是随JDK附送的,此处的Java编程语言理解为javac(编译器)更加合适。
当然,JDK比上面这张图要复杂的多。感兴趣的读者们可以研究下面这张图进行进一步了解:
Java的强大与成功
我们都知道,Java代码的处理方式是先由javac把代码编译成JVM看得懂的字节码,然后JVM就好像解释器一样把这些字节码执行出来。因此,无论是怎样的平台,只要上面有合适的JVM就能跑Java程序,这促成了其“编写一次,到处运行”的特性。这成为Java强大——因而成功——的重要原因之一。(当然,这是一个理想化的境界。出于技术因素以及不同平台上的JVM成分复杂的关系,“编写一次”之后要“到处运行”往往仍会需要一些代码的改动。)
除了跨平台特性之外,Java的成功还有很多其他因素,下面选取了几个比较有代表性的观点供读者们参考:
◆完全的面向对象——甚至连字节码都保持着对象结构
◆完善的类库
◆自身携带的线程类库可以进行多进程处理
◆自身携带很多网络功能类库
◆JVM中的垃圾回收器(GC)可以进行自动内存管理
◆编译+解释的双重步骤和GC机制等因素提升了安全性
◆JVM的性能还不算糟糕,随着JIT编译等技术的出现还越来越好
其他语言的进驻
JVM上最初只运行Java代码。不过由于其运行机制,如果通过“特制”的编译器将用其他编程语言书写的代码编译为Java字节码,那么非Java代码也可以运行在JVM之上。编者目前还没有考察出第一位登陆JVM的非Java语言是谁以及确切的登陆时间,然而对于1995年诞生的Java,JRuby的另一位核心开发者Charles Nutter曾经在08年评论说:“几乎每一个超过五岁的编程语言都或多或少有自己的JVM运行版。”下面是这个列表的一部分:
那句广告词是怎么说的?哪个餐馆吃饭的人多,那个餐馆的饭菜一定差不了。那么,JVM这个餐馆究竟好在哪里?
其实在上面介绍的Java成功的因素中,有三条都是与JVM相关的,即它的垃圾回收机制、安全性以及性能。事实上这也差不多概括了所有JVM的好处了。在性能这一点上或许有待商榷,不过自从JIT编译技术应用在JVM上之后,据说其性能已经接近了C++的级别;而在JDK 7当中也承诺会有性能的大幅提升。另外,JDK 7即将使用的全新垃圾回收器G1也承诺将带来更好的并发性、可预测性以及性能。
据Java之父James Gosling使用过的一个统计,世界上有超过8亿5千万台桌面设备启用了Java(即,至少安装了JRE),还有100亿台具有Java功能的设备。JVM这样一个质量好名气又大的舞台,谁会不想上去跳几步?
Java语言的衰老
在这些进驻JVM平台的语言中,有好几个都是专门定位于JVM的新语言(而非其他现成语言的JVM版本),其中以Clojure、Groovy和Scala为代表。而这些语言的创始人们都不约而同的表示过自己对Java语言的厌倦与失望。Clojure的创始人Rick Hickey说:“我想要一个动态的、富有表达力的、函数式的语言。”Groovy的创始人James Strachan说:“Java是一种令人惊叹的复杂语言,它的语法规范长达600页,我怀疑到底有没有人能真正理解它。”James在去年的一篇广为流传的博文中表达了自己对Scala语言的看好,而Scala语言的创始人Martin Odersky则是这样描述Java的:
“经过Pizza和GJ的经历,我有时会感到沮丧,因为Java是一个具有非常强的约束的语言。因此,很多事情都不能像我想象的那种方式那样去做——那种我原本确信是正确的方式。……其中最强、最难以应付的是,它必须充分地向后兼容非泛型Java。”
在09年7月的51CTO编程语言排行榜上,red7对Java语言的弱势进行了一番总结,观点如下:“……Java的进化速度在最近几年已经远远无法追赶日趋复杂项目需求和苛刻的交付日期。人们开始尝试各种开源项目以缓解Java在某些方面的不足,以Hibernate和Spring为代表的框架快速发展和普及;另一方面,Sun和JCP的各种标准不断遭到人们的质疑,JSF和JPA等官方框架被大多数开发者抛在一边。而这背后,是Sun和JCP对新需求的麻木和对社区的漠视,这直接导致Java的更新落后于变化,Java正在新变化新需求中变得缓慢和老态。”至于更加具体的方面,Java程序员、架构师,LambdaJ的作者Mario Fusco的这篇博文对Java语言特性的老化进行了全面的总结。
衰老中的Java语言王者之风犹存,但既然JVM是一个如此优秀而开放的平台,由更加年轻、功能更加强大的语言来承接JVM这个舞台,相信也是Java愿意看到的。事实上,Java之父自己也清楚的表述了这个观点:“我们看中的并非Java语言,而是JVM。事实上我们可以让所有语言一起工作。”同时,Sun自己也在2008年初启动了一个叫做Da Vinci Machine(达芬奇机器)的项目,试图让JVM更好的支持所有动态语言。而这个项目的一个重要组成部分,JSR 292(Java平台的动态语言支持),也将在JDK 7当中实现。如果成功的话,动态语言在JVM上的性能会得到飞一般的提升,甚至可以和Java语言本身相媲美。
我们需要怎样的语言?
无论Java语言的支持者们是如何反对这种在他们看来有些舍本逐末的行为,事实正在逐渐证明这个推送JVM的方向是进步的,而且是受开发者们欢迎的(比如Groovy的开发者们大多都表示庆幸自己从Java投向了Groovy,并且翘首期待JSR 292的到来)。这是一个开放的时代,语言的好处和语言的糟糕之处都可以轻易地飘到那些项目经理的耳朵里,而接下来,项目经理的下定决心只是一个时间问题。
那么,项目经理们需要什么?或者说,以后的企业级项目和Web项目需要怎样的语言?一般而言,有下面几点:
◆可伸缩性
◆可移植性
◆并行编程
◆高性能的
◆DSL(领域特定语言)的实现
当然还有对于低风险的要求,比如与旧项目的兼容性,旧项目迁移的成本,开发工具的支持,开发团队对语言的熟悉情况,以及语言开发团队的稳定性等等。而具体到每一位开发者头上,那么情况变得更加复杂。他们可能想要:
◆动态的
◆静态的
◆强类型的
◆函数式的
◆富有表达力的
◆面向对象的
◆简洁的
◆容易理解的
◆容易学习的(在有Java或其他语言开发经验的基础上)
◆深刻的
◆快捷的
◆模块化的
◆灵活的
◆有强大的类库
◆有好用的框架
◆有合适的IDE
◆有活跃的社区
……
某些语言能够满足上述条件中的很多条,但是很明显,没有任何一种语言能够满足所有的条件!同时,同一个项目的不同层面的需求也是不同的。现在全世界最流行的微博服务Twitter,表层是Ruby on Rails,底层是Scala,而Twitter团队进行这样的选择正是因为考虑到不同层面的业务需求。
事实上,这种多语言编程(Multi-lingual programming),或者叫做混合语言编程(Polyglot Programming)并不是一个新概念,这个理念的成功案例可以追述到二十多年前,当时诞生的而至今在开发者社区中仍然火热无比的Emacs正是一个C语言与Lisp方言的混合产物。对于多语言编程适用的层次,请允许我再次借用Ola Bini的一个预言,在预言中他描述了同一个项目中可能会需要不同语言的三个层:
◆稳定层(stable layer)–不包含大量的应用程序功能,可以使用静态语言构建
◆动态层(dynamic layer)- 包含大量的应用程序功能,使用动态语言构建
◆领域层(domain layer)- 包含大量的应用程序功能,使用DSL构建
Twitter这样的成功案例刚好支持了这样的预测,因为Scala是一个强大的静态语言,而Ruby不仅是一个动态语言,还是一个十分适合编写DSL的语言。
百家争鸣的JVM
不过话又说回来了,既然混合语言编程这么好,为什么一直以来都没怎么流行呢?答案很简单,和我们与国际友人之间有沟通问题的原因是一样的:一段Ruby代码要如何明白一段Java代码说了些什么呢?对于高级语言来说,要互相理解对方的功能,进而进行交互,是一件很困难的事情。如果无法交互,又要如何一起来完成同一个项目呢?
沟通问题是一个很大的障碍。然而,这个障碍的清除早就有了一个成功的案例:那就是微软的.NET平台。在微软官方文档的描述中,这种“沟通”被命名为“跨语言互操作性”,或者“语言互用性”。在.NET平台上,这个问题的解决方案是公共语言规范 (CLS)。事实上,不得不说微软在这方面做的要远远超过解决“沟通问题”的这个层面:它的目的是能够让多种语言可以自由共享和扩展彼此的库。不过,在过去的很长一段时间内,.NET平台上的主要公民只有两个:C#和VB.NET,其他公民则大多半死不活,这使得这个互操作性的意义大打折扣。
然而JVM现在的情况似乎非常乐观:且不说Groovy、Scala这种专门针对JVM而创建的语言活的挺滋润(这两个语言都可以直接使用Java类库,据说是所有的),就是移植到JVM上的语言,尤其是JRuby和Jython,看起来活的都不错,足以让它们在面对IronRuby和IronPython的时候高兴的挺起腰板。
为什么.NET在多语言之路走了很久的路仍然青黄不接,而JVM已经俨然呈现出一幅百家争鸣之态?答案很明显:因为Java是开源的!(准确的说,那些语言开发者们需要掌握的部分都是开源的,而开源社区的创造力显然要远远超过微软那虽然不算少但仍然精力有限的开发团队。)语言互操作只是第一步,随着开放理念的前行,平台的互操作,标准的互操作都将逐步跟进,届时Java的开源性质将使JVM上的百花绽放的更加鲜艳,而混合语言项目则会发现Java平台是他们最理想的去处。
结语
综上所述,软件项目的未来在于混合语言编程。此前景的舞台将在未来数年内搭建成熟,而聚光灯的焦点就是一个百家争鸣的JVM。观望此番前景,我们在近日的51CTO Java频道改版中特意新添了一栏目,名为Java+,目的正是观察基于JVM的混合语言编程的发展趋势,为Java开发者们提供指引。想一想看,当你的老板或项目经理决定要尝试Groovy或是Scala进行部分开发的时候,如果你能够立即站出来为他进行一些解惑或指点,那么你又何愁饭碗随着Java语言的老去而消逝呢?
现在就开始学习吧。
你未来可能会用到JVM上的哪些其他语言?你是否已经在学习、使用这些语言,或者计划学习这些语言?谈谈你的看法吧。
分享到:
相关推荐
Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础...
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...
《深入理解Java虚拟机JVM高级特性与最佳实践》是一本专注于Java开发人员提升技术水平的著作,由周志明撰写。这本书旨在填补Java技术体系中关于Java虚拟机(JVM)知识的空白,帮助读者深入理解JVM的工作原理及其对...
1.前言最近在研究JVM内存模型和Java基础知识。主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码。这里列出一条规则,“类中的成员变量,也叫实例
资源名称:实战Java虚拟机:JVM故障诊断与性能优化资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
《Java虚拟机:JVM高级特性与最佳实践(第2版)》这本书深入探讨了Java虚拟机(JVM)的工作机制,旨在帮助开发者们更好地理解Java程序的运行过程,优化性能,并解决潜在的问题。作者周志明是Java领域的资深专家,他...
- **异常处理**:Java的异常处理机制,包括try-catch-finally、throws、throw关键字,以及异常链。 - **安全管理**:JVM提供一套安全管理框架,包括类加载安全、权限检查等,确保应用在受控环境中运行。 8. **JVM...
需要两部分一起解压才可以: 当前为第二部分。 第一部分地址如下: https://download.csdn.net/download/dcxy0/10374640 也可以通过下面的地址找另外第一部分的文件:https://download.csdn.net/user/dcxy0/uploads
Java虚拟机(JVM)监控工具是确保Java应用程序性能和稳定性的重要资源。这些工具可以帮助开发者监控和分析JVM的运行时状态,包括内存使用、垃圾回收行为、线程活动等关键指标。本文将详细介绍如何在Java中使用JVM...
4.6 网络移动性:java设计的中心 4.7 资源页 第5章 java虚拟机 5.1 java虚拟机是什么 5.2 java虚拟机的生命周期 5.3 java虚拟机的体系结构 5.3.1 数据类型 5.3.2 字长的考量 5.3.3 类装载器子...
【Java中的`java.net.BindException: Address already in use: JVM_Bind`异常】 在Java编程中,当你尝试启动一个服务器端应用,如Tomcat,或者任何需要监听特定端口的服务时,可能会遇到`java.net.BindException: ...
【Java未来发展——JVM7】 Java作为一门广泛使用的编程语言,其未来发展一直是开发者关注的焦点。JVM(Java虚拟机)作为Java平台的核心,它的每一次重大更新都会对Java生态系统产生深远影响。JVM7,即Java 7,是...
Dive into JVM garbage collection logging, monitoring, tuning, and tools Explore JIT compilation and Java language performance techniques Learn performance aspects of the Java Collections API and get ...
在myeclipse中将html文件改成jsp文件时myeclipse卡住;将之前的任务关掉;再打开时多次部署项目的时候报错
2. **垃圾回收**:Java的自动内存管理主要依赖于垃圾回收机制。Java8中引入了G1(Garbage-First)垃圾收集器,它是并行和并发的,目标是减少垃圾回收停顿时间。还有其他如CMS(Concurrent Mark Sweep)和Parallel/...
实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送)
《实战Java虚拟机 JVM故障诊断与性能优化》是由葛一鸣编著的一本专业书籍,主要探讨了如何在实际工作中解决Java虚拟机(JVM)的相关问题,以及如何进行性能调优。书中涵盖了许多关键的知识点,让我们一一展开讨论。 ...
分析常见的JVM调优技术及其相关条件,以及在实战中怎么使用到相关的技术进行调优,比较适合中高级开发进行学习,适合对JVM理解较深的开发学习