首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》1.1 语言与平台

关灯直达底部

使用Java之前,我们要先弄清楚Java语言和Java平台之间的区别。然而,有时候不同的作者对语言和平台的构成会有不同的定义,所以人们有时不太清楚两者之间的区别,分不清是语言还是平台提供了代码使用的编程特性。

因为本书的大部分内容都需要你理解两者的区别,所以这里需要说明一下。以下是我们给出的定义。

  • Java语言 在“关于本书”中,我们提到Java语言是静态类型、面向对象的语言,希望你对这种说法已经非常熟悉了。Java语言还有一个非常明显的特点,它是(或者说应该是)人类可读的。

  • Java平台 平台是提供运行时环境的软件。Java虚拟机(JVM)负责把类文件形式(人类不可读)的代码链接起来并执行。JVM不能直接解释Java语言的源文件,你要先把源文件转换成类文件。

Java作为软件系统之所以能成功,主要因为它是一种标准。也就是说,它有规范文件描述它应该如何工作。不同的厂商或项目组可以据此推出自己的实现,这些不同实现的工作方式在理论上是相同的。规范虽然不能保证这些实现处理同一任务时表现如何,但可以保证处理结果的正确性。

控制Java系统的规范有多种,其中最重要的是《Java语言规范》(JLS)和《JVM规范》(VMSpec)。在Java 7中,这两者之间的界限愈发清晰。实际上,VMSpec不再引用JLS中的任何内容,如果你认为这是Java 7重视Java之外其他语言的信号,说明你有见微知著的能力!希望你能继续关注,接下来我们会更加深入地探讨这两个规范之间的差别。

提到Java的双重角色,你自然想问:“它们两者之间还有什么关联吗?”如果它们在Java 7中如此泾渭分明,又是如何共同形成我们所熟悉的Java系统的呢?

连接Java语言和平台之间的纽带是统一的类文件(即.class文件)格式定义。认真研究类文件的定义能让你获益匪浅,这是优秀Java程序员向伟大Java程序员转变的一个途径。图1-1展示了产生和使用Java代码的整个过程。

图1-1 Java源码被转换成 .class 文件,在JIT编译前被加载处理

如图所示,Java代码的演进过程从我们可以看懂的Java源码开始,然后由javac编译成.class文件,变成可以加载到JVM中的形式。值得注意的是,类文件在加载过程中通常都会被处理和修改。大多数流行框架(特别是打着“企业级”旗号的)都会在类加载过程中对类进行改造。

Java是编译型语言还是解释型语言?

大多数开发人员都知道,Java源文件需要编译成.class文件才能在JVM中运行。如果继续追问,许多开发人员还会告诉你说.class中的字节码首先会被JVM解释,但在稍后即时(JIT)编译。然而很多人将字节码含糊地理解为“在某种虚构的或简化的CPU上运行的机器码”。

实际上,JVM字节码更像是中途的驿站,是一种从人类可读的源码向机器码过渡的中间状态。用编译原理术语讲,字节码实际上是一种中间语言(IL)形态,不是真正的机器码。也就是说,将Java源码变成字节码的过程不是C或C++程序员所理解的那种编译。Java所谓的编译器javac也不同于gcc,实际上它只是一个针对java源码生成类文件的工具。Java体系中真正的编译器是JIT,如图1-1所示。

有人说Java是“动态编译”的,他们所说的编译是指JIT的运行时编译,不是指构建时创建类文件的过程。

所以如果被问及“Java是编译型语言还是解释型语言”,你可以回答“都是”。

希望我们已经把Java语言和Java平台之间的区别解释清楚了。接下来我们进入下一话题,看看Java 7中一些语法上的调整,先从Coin项目中的那些小变化开始。