12.1 介绍Nashorn
本章假定你对 JavaScript 有一定的了解。如果你还不熟悉 JavaScript 的基本概念,Michael Morrison 写的 Head First JavaScript(O'Reilly 出版)是本不错的入门书。
回忆一下 1.5.4 节介绍的 Java 和 JavaScript 之间的区别,你会发现,这两种语言十分不同。因此,能在 Java 的虚拟机中运行 JavaScript 看起来有点奇怪。
12.1.1 在JVM中运行Java之外的语言
其实,除了 Java 之外有相当多的语言都运行在 JVM 中,而且其中有些与 Java 的差异大于 JavaScript 与 Java 的差异。之所以能在 JVM 中运行其他语言,是因为 Java 语言和 JVM 耦合得非常松,两者之间只通过特定格式的类文件交互。在 JVM 中运行其他语言有两种方式。
- 目标语言使用 Java 实现的解释器。
解释器在 JVM 中运行,执行使用目标语言编写的程序。
- 目标语言提供编译器,把目标语言代码转换成类文件。
编译得到的类文件直接在 JVM 中执行,通常还会提供一些语言专用的运行时功能。
Nashorn 采用的是第二种方式,不过做了改进,把编译器嵌入运行时,所以,执行程序前绝不会先编译 JavaScript 源代码。这意味着,不是专为 Nashorn 编写的 JavaScript 代码也能轻易部署到这个平台中。
Nashorn 和很多其他运行在 JVM 中的语言(例如 JRuby)有个区别,它没有实现任何解释器。Nashorn 总是把 JavaScript 代码编译成 JVM 字节码,然后直接执行字节码。
从技术的角度来看,这种实现方式很有趣。不过很多开发者好奇的是,Nashorn 在已经建立好的 Java 成熟生态系统中扮演着怎样的角色。下面就来看看 Nashorn 扮演的角色。
12.1.2 目的
在 Java 和 JVM 生态系统中,Nashorn 有多种用途。首先,它为 JavaScript 开发者提供了一个可用的环境,用于探索 JVM 的功能。其次,它让企业继续利用对 Java 技术的现有投资,采用 JavaScript 作为一门开发语言。最后,它为 HotSpot 使用的先进虚拟机技术提供了一个很好的工程样板。
JavaScript 不断发展,应用范围越来越宽,以前只能在浏览器中使用,而现在则能在更通用的计算和服务器端使用。Nashorn 在稳固的 Java 现有生态系统和一波有前途的新技术之间架起了一座桥梁。
下面我们要介绍 Nashorn 运作的技术细节,以及如何开始使用这个平台。在 Nashorn 中运行 JavaScript 代码有多种不同的方式,下一节会介绍其中最常使用的两种。
Nashorn 和很多其他运行在 JVM 中的语言(例如 JRuby)有个区别,它没有实现任何解释器。Nashorn 总是把 JavaScript 代码编译成 JVM 字节码,然后直接执行字节码。