转载

Java编程入门——1.3 Java虚拟机

机器语言由非常简单的指令组成,计算机的CPU可以直接执行这些指令。几乎所有的程序都是用Java、Fortran或C++这样的高级语言编写的。由高级语言编写的程序不能被任何计算机直接执行。首先,必须将其翻译成机器语言。这种翻译由一种称为编译器的程序完成,编译器将高级语言翻译成可执行的机器语言程序。当翻译完成后,机器语言的程序就可以运行任意多次。当然,只能在同一种类型的计算机上运行(这是因为每种类型的计算机都有自己独立的计算机语言)。如果该程序需要在另一种类型的计算机上运行,就必须使用另一种编译器重新翻译成对应的机器语言。

还有另一种编译高级语言的程序的方式。除了使用编译器一次性编译程序外,还可以使用解释器,按需求逐指令翻译程序。解释器也是一个程序,其扮演的角色和CPU类似,还有一个获取并执行(fetch-and-execute)循环。为了执行程序,解释器在一个循环中运行,重复从程序中读取每条指令,根据这条指令来决定要做些什么,然后执行对应的机器语言指令。

使用解释器的过程就是在执行高级语言的程序。例如,Lisp语言通常使用解释器执行,而不是编译器。然而,解释器还有其他目的:即可以在不同类型的计算机上使用同一种机器语言程序。例如,原来有一种家用计算机称为Commodore 64或“C64”。但在实际中并没有发现C64,不过发现了在其他计算机甚至浏览器中运行的程序可以模拟一个C64。这样的模拟器可以通过扮演C64机器语言的解释器来运行C64程序。

Java的设计者巨顶将编译和解释结合起来。Java编写的程序编译成机器语言,但并不存在使用这种机器语言的就是就是。这种“虚拟”的就是就是成为Java虚拟机(JVM)。JVM的机器语言成为Java字节码。Java字节码不仅可以用于虚拟的计算机,也可以用于真实的计算机。但实际上,使用虚拟机成就了Java的一个卖点:即Java字节码可以在任何计算机上使用。所有这些计算机只需要一个Java字节码的解释器。这种解释器模拟模拟JVM,就像C64模拟器模拟Commodore 64计算机那样。(属于JVM还可用于表示Java字节码解释器程序完成模拟的过程。所以我们说,若想运行Java程序,必须要有JVM。从技术上来讲,说解释器实现了JVM比解释器就是JVM要更加正确一些。)

当然,不同类型的计算机需要不同的Java字节码解释器,但每当一种计算机有了Java字节码解释器后,就可以运行任何Java字节码程序,这样的程序也可以运行在任何装有Java解释器的计算机上。这正是Java的本质属性:相同编译后的程序可以运行在许多不同的计算机上。

但为什么能在所有地方都使用中间的Java字节码?为什么不直接分发原来的Java程序,让每个人自行将其编译成需要运行的计算机上的机器语言。其中的原因有很多。首先,需要有一个理解Java这门高级语言的编译器。这种编译器本身就是一个复杂的程序。另一方面,Java字节码解释器,是一个相对来说较小,简单的程序。因此,很容易为一种新类型的计算机编写一个字节码解释器。完成这一步后,新计算机就可以运行任何编译过的Java程序。而为同样的计算机编写一个Java编译器却困难的多。

除此之外,有些Java程序需要从网络下载。 这会导致显而易见的安全问题:我们不想运行会损害计算机或文件的程序。字节码解释器在计算机和下载的程序之间充当一个缓存。在实际中,运行的是解释器,这样是间接的运行下载下来的程序。解释器可以阻止下载下来的程序中含有的潜在的危险行为。

在Java刚问世不久时,人们经常批评Java很慢。这是因为Java字节码由解释器运行,看上去Java字节码永远不会像编译成机器语言的语言那样快(后者实际上是在运行计算机自身的机器语言)。但是,通过即时(JIT)编译器执行Java字节码可以在很大程度上克服这一缺点。即时编译器将Java字节码翻译成本地机器语言。其在执行程序时完成这一步骤。对于普通的解释器,输入到即时编译器的是Java字节码,其任务是执行这个程序。但在执行时,还会将其中的某些部分翻译成机器语言。翻译的部分执行起来比解释执行要快得多。由于在程序运行时,某些部分可能会多次执行,所以即时编译器可以有效的减少总体执行时间。

这里需要提醒一下,Java和Java字节码之间没有必然的联系。Java编写的程序依然可以编译成真实计算机的机器语言。其他语言编写的程序可以编译成Java字节码。但Java和Java字节码之间的组合是不依赖特定平台、安全、网络兼容的,这样允许用户以现代的高级面向对象的语言编写程序。

在过去几年,有许多新语言或已存在的语言都编译成Java字节码。编译后的字节码程序可以用标准的JVM运行。专门为JVM开发的新语言包括Groovy、Clojure、Processing。面向JVM的Jython和JRuby分别表示的已有的Python和Ruby。这些语言可以在不使用Java的情况下享受JVM的优势。实际上,以其他语言使用JVM变得越来越重要,一致JVM中添加了一些新特性,其目的就是为了更好的支持这些语言。JVM的这些改进已经成为了Java 7和Java 8中的一些新特性。

这里还要提醒一点,在不依赖特定平台方面,提供“图形用户界面GUI”这个特性是非常困难的(GUI是指窗体、按钮等这类的东西)。不过Java也能全平台的支持。详见1.6节。

原文链接: math.hws.edu 翻译:ImportNew.com -孙 波翔

译文链接:[]
正文到此结束
Loading...