JVM 还支持哪些语言
我们在《深入分析 Java 的编译原理》中提到过,为了让 Java 语言具有良好的跨平台能力,
Java 独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。
有了字节码,无论是哪种平台(如 Windows、Linux 等),只要安装了虚拟机,都可以直接运行字节码。
同样,有了字节码,也解除了 Java 虚拟机和 Java 语言之间的耦合。这话可能很多人不理解,Java 虚拟机不就是运行 Java 语言的么?这种解耦指的是什么?
其实,目前 Java 虚拟机已经可以支持很多除 Java 语言以外的语言了,如 Kotlin、 Groovy、JRuby、Jython、Scala 等。之所以可以支持,就是因为这些语言也可以被编译 成 字 节 码 。
而 虚 拟 机 并 不 关 心 字 节 码 是 有 哪 种 语 言 编 译 而 来 的 。
经常使用 IDE 的开发者可能会发现,当我们在 Intelij IDEA 中,鼠标右键想要创建 Java 类的时候,IDE 还会提示创建其他类型的文件,这就是 IDE 默认支持的一些可以运行在 JVM 上面的语
言,没有提示的,可以通过插件来支持。
目前,可以直接在 JVM 上运行的语言有很多,今天介绍其中比较重要的九种。每种语言通过一段『HelloWorld』代码进行演示,看看不同语言的语法有何不同。
Kotlin
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,它也可以被编译成为 Java Script 源代码。Kotlin 的设计初衷就是用来生产高性能要求的程序的,所以运行起来和 Java 也是不相上
下。Kotlin 可以从 JetBrains InteilliJ Idea IDE 这个开发工具以插件形式使用。
Hello World In Kotlin
Fun main(args: Array<String>) {
println("Hello, world!")
}
Groovy
Apache 的 Groovy 是 Java 平台上设计的面向对象编程语言。它的语法风格与 Java很像,Java 程序员能够很快的熟练使用 Groovy,实际上,Groovy 编译器是可以接受完全纯粹的 Java 语
法格式的。
使用 Groovy 的一个重要特点就是使用类型推断,即能够让编译器能够在程序员没有明确说明的时候推断出变量的类型。Groovy 可以使用其他 Java 语言编写的库。Groovy的语法与 Java 非
常相似,大多数 Java 代码也匹配 Groovy 的语法规则,尽管可能语义不同。
Hello World In Groovy
static void main(String[] args) {
println('Hello, world!');
}
Scala
Scala 是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 经常被我们描述为多模式的编程语言,因为它混合了来自很多编程语言的元素的特征。但无论如何它本质上还是一个纯粹的面向对象语言。它相比传统编 程语言最大的优势就是提供了
很好并行编程基础框架措施了。Scala 代码能很好的被优化成字节码,运行起来和原生 Java 一样快。
Hello World In Scala
object HelloWorld{
def main(args: Array[String]) {
System.out.println("Hello, world!");
}
}
Jruby
JRuby 是用来桥接 Java 与 Ruby 的,它是使用比 Groovy 更加简短的语法来编写代码,能够让每行代码执行更多的任务。就和 Ruby 一样,JRuby 不仅仅只提供了高级的语法格式。它同样
提供了纯粹的面向对象的实现,闭包等等,而且JRuby 跟 Ruby 自身相比多了很多基于 Java 类库 可以调用,虽然 Ruby 也有很多类库,但是在数量以及广泛性上是无法跟 Java 标准类库相
比的。
Hello World In Jruby
puts 'Hello, world!'
Jython
Jython,是一个用 Java 语言写的 Python 解释器。Jython 能够用 Python 语言来高效生成动态编译的 Java 字节码。
Hello World In Jython
print "Hello, world!"
Fantom
Fantom 是一种通用的面向对象编程语言,由 Brian 和 Andy Frank 创建,运行在 Java Runtime Environment,JavaScript 和.NET Common Language Runtime上。其主要设计目标是提供标
准库 API,以抽象出代码是否最终将在 JRE 或 CLR 上运行的问题。
Fantom 是与 Groovy 以及 JRuby 差不多的一样面向对 象的编程语言,但是悲剧的是 Fantom 无法使用 Java 类库,而是使用它自己扩展的类库。
Hello World In Fantom
class Hello{
static Void main() {
echo("Hello, world!")
}
}
Clojure
Clojure 是 Lisp 编程语言在 Java 平台上的现代、函数式及动态方言。 与其他 Lisp一样,Clojure 视代码为数据且拥有一套 Lisp 宏系统。
虽然 Clojure 也能被直接编译成 Java 字节码,但是无法使用动态语言特性以及直 接调用 Java 类库。与其他的 JVM 脚本语言不一样,Clojure 并不算是面向对象的。
Hello World In Clojure
(defn -main [& args]
(println "Hello, World!"))
Rhino
Rhino 是一个完全以 Java 编写的 JavaScript 引擎,目前由 Mozilla 基金会所管理。 Rhino 的特点是为 JavaScript 加了个壳,然后嵌入到 Java 中,这样能够让 Java 程
序员直接使用。其中 Rhino 的 JavaAdapters 能够让 JavaScript 通过调用 Java 的类来实现特定的功能。
Hello World In Rhino
print('Hello, world!')
Ceylon
Ceylon 是一种面向对象,强烈静态类型的编程语言,强调不变性,由 Red Hat 创建。 Ceylon 程序在 Java 虚拟机上运行, 可以编译为 JavaScript。
语言设计侧重于源代码可读性,可预测性,可扩展性,模块性和元编程性。
Hello World In Ceylon
shared void run() {
print("Hello, world!");
}
总结
好啦,以上就是目前主流的可以在 JVM 上面运行的 9 种语言。加上 Java 正好 10 种。如果你是一个 Java 开发,那么有必要掌握以上 9 中的一种,
这样可以在一些有特殊需求的场景中有更多的选择。推荐在 Groovy、Scala、Kotlin 中选一个。