1. 引言
除了Java,还有其他语言可以在Java虚拟机上运行,比如Scala、Kotlin、Groovy和Clojure。
接下来我们将快速浏览最流行的JVM语言。当然,我们从JVM语言的鼻祖——Java开始。
2. Java
2.1. 概述
Java 是一种通用编程语言,采用面向对象范式。
核心特性是跨平台可移植性,这意味着在一个平台上编写的程序可以在任何具有适当运行时支持的软硬件组合上执行。这是通过先将代码编译成字节码(而不是直接编译为平台特定的机器码)实现的。
Java字节码指令类似于机器码,但由特定于主机操作系统和硬件组合的Java虚拟机(JVM)解释执行。
虽然最初是面向对象语言,Java已开始吸收其他编程范式的概念,如函数式编程。
快速了解Java的主要特性:
- 面向对象
- 强静态类型
- 平台无关
- 垃圾回收
- 多线程
2.2. 示例
看一个简单的"Hello, World!"示例:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
这个示例中,我们创建了一个名为HelloWorld的类,并定义了在控制台打印消息的main方法。
接下来使用javac命令生成可在JVM上执行的字节码:
javac HelloWorld.java
最后,java命令在JVM上执行生成的字节码:
java HelloWorld
更多Java示例可查看我们的教程列表。
3. Scala
3.1. 概述
Scala 代表"可扩展语言"。Scala是一种静态类型语言,结合了两种重要的编程范式:面向对象和函数式编程。
该语言诞生于2004年,但近年来变得更受欢迎。
Scala是纯面向对象语言,因为它不支持原始类型。Scala提供定义类、对象、方法的能力,以及函数式编程特性如特质、代数数据类型或类型类。
Scala的重要特性:
- 函数式 + 面向对象
- 强静态类型
- 代数数据类型
- 模式匹配
- 增强的不可变性支持
- 惰性计算
- 多线程
3.2. 示例
先看同样的"Hello, World!"示例,这次用Scala:
object HelloWorld {
def main(args: Array[String]): Unit = println("Hello, world!")
}
这个示例中,我们创建了一个名为HelloWorld的单例对象和main方法。
编译使用scalac:
scalac HelloWorld.scala
scala命令在JVM上执行生成的字节码:
scala HelloWorld
4. Kotlin
4.1. 概述
Kotlin 是由JetBrains团队开发的静态类型、通用、开源语言,融合了面向对象和函数式范式。
开发Kotlin时的主要关注点是Java互操作性、安全性(异常处理)、简洁性和更好的工具支持。
自Android Studio 3.0发布以来,Kotlin已成为Google在Android平台上完全支持的编程语言。它也被包含在Android Studio IDE包中,作为标准Java编译器的替代方案。
Kotlin的重要特性:
- 面向对象 + 函数式
- 强静态类型
- 简洁
- 与Java互操作
我们的Kotlin入门文章包含更多特性细节。
4.2. 示例
看Kotlin中的"Hello, World!"示例:
fun main(args: Array<String>) { println("Hello, World!") }
将上述代码写入新文件helloWorld.kt。
然后使用kotlinc命令编译并生成可在JVM上执行的字节码:
kotlinc helloWorld.kt -include-runtime -d helloWorld.jar
-d选项用于指示class文件或*.jar文件的输出路径。-include-runtime选项通过包含Kotlin运行时库,使生成的.jar*文件自包含且可运行。
最后,java命令在JVM上执行生成的字节码:
java -jar helloWorld.jar
再看另一个使用for循环打印列表项的示例:
fun main(args: Array<String>) {
val items = listOf(1, 2, 3, 4)
for (i in items) println(i)
}
5. Groovy
5.1. 概述
Groovy 是一种面向对象、可选类型、动态的领域特定语言(DSL),支持静态类型和静态编译能力。它旨在通过易学的语法提高开发人员生产力。
Groovy可轻松与任何Java程序集成,并立即添加强大功能,如脚本能力、运行时和编译时元编程以及函数式编程特性。
重要特性:
- 面向对象,具有高阶函数、柯里化、闭包等函数式特性
- 类型系统——动态、静态、强类型、鸭子类型
- 领域特定语言
- 与Java互操作
- 通过简洁性提升生产力
- 运算符重载
5.2. 示例
先看Groovy中的"Hello, World!"示例:
println("Hello world")
将上述代码写入新文件HelloWorld.groovy。现在可以通过两种方式运行:先编译后执行,或直接运行未编译代码。
使用groovyc命令编译*.groovy*文件:
groovyc HelloWorld.groovy
然后使用java命令执行Groovy代码:
java -cp <GROOVY_HOME>\embeddable\groovy-all-<VERSION>.jar;. HelloWorld
例如,上述命令可能如下:
java -cp C:\utils\groovy-1.8.1\embeddable\groovy-all-1.8.1.jar;. HelloWorld
再看如何使用groovy命令直接执行*.groovy*文件(无需编译):
groovy HelloWorld.groovy
最后是另一个打印带索引列表项的示例:
list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list.eachWithIndex { it, i -> println "$i: $it"}
更多Groovy示例可查看我们的入门文章。
6. Clojure
6.1. 概述
Clojure 是一种通用函数式编程语言。该语言运行在JVM以及Microsoft的公共语言运行时上。Clojure是编译型语言,但仍保持动态特性,因为其功能在运行时支持。
Clojure设计者希望设计能在JVM上运行的现代Lisp,因此它也被称为Lisp编程语言的方言。与Lisp类似,Clojure将代码视为数据,并拥有宏系统。
重要特性:
- 函数式
- 类型系统——动态、强类型,最近开始支持渐进类型
- 为并发设计
- 运行时多态
6.2. 示例
与其他JVM语言不同,在Clojure中创建简单的"Hello, World!"程序不那么直接。
我们将使用Leiningen工具运行示例。
首先,使用以下命令创建默认模板的简单项目:
lein new hello-world
项目将创建以下文件结构:
./project.clj
./src
./src/hello-world
./src/hello-world/core.clj
现在需要更新*./project.ctj*文件以设置主源文件:
(defproject hello-world "0.1.0-SNAPSHOT"
:main hello-world.core
:dependencies [[org.clojure/clojure "1.5.1"]])
现在更新*./src/hello-world/core.clj*文件中的代码以打印"Hello, World!":
(ns hello-world.core)
(defn -main [& args]
(println "Hello, World!"))
最后,切换到项目根目录后使用lein命令执行代码:
cd hello-world
lein run
7. 其他JVM语言
7.1. Jython
Jython 是Python的Java平台实现,运行在JVM上。
该语言最初设计用于在不牺牲交互性的情况下编写高性能应用程序。Jython是面向对象、多线程的,并使用Java的垃圾回收器高效清理内存。
Jython包含Python语言中的大部分模块。它还可以导入和使用Java库中的任何类。
快速看一个"Hello, World!"示例:
print "Hello, world!"
7.2. JRuby
JRuby语言高性能、多线程,拥有来自Java和Ruby的丰富库。它还结合了两种语言的特性,如面向对象编程和鸭子类型。
在JRuby中打印"Hello, World!":
require "java"
stringHello= "Hello World"
puts "#{stringHello.to_s}"
8. 结论
本文研究了许多流行的JVM语言及其基础代码示例。这些语言实现了各种编程范式,如面向对象、函数式、静态类型和动态类型。
这表明,尽管JVM可以追溯到1995年,它仍然是现代编程语言高度相关且极具吸引力的平台。✅