前言
与上文我们知道,JVM作为一个可以将Class文件转换成机器码的平台,只要安装了虚拟机,就可以在上面运行字节码。
同样,只要其他原因在编译过程中生成了字节码,那么照样可以通过JVM在不同平台上运行,这就实现了跨平台能力了。
目前,可以直接在JVM上运行的语言除了Java之外有很多,本文主要介绍九种。正如平时我们了解一个语言时通常会先学这个语言里最经典的一句话——【我爱你】。本文将每种语言通过一段【Hello, World】代码进行演示,看看不同语言的语法有什么不同之处。
Kotlin
Kotlin是一种在JVM上运行的静态类型编程语言,由JetBrains设计开发并开源。
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
在Google I/O 2017中,Google宣布Kotlin成为Android官方开发语言。
package hello //可选的包头
fun main(args: Array<String>){ //包级可见的函数,接受一个字符串数组作为参数
println("Hello, World") //分号可以省略
}
Kotlin也是一个面向对象的语言。
class Hello(val name: String){
fun greet(){
println("Hello, $name");
}
}
fun main(args: Array<String>){
Greeter("World").greet() //创建一个对象不用new关键字
}
想继续深入的朋友可以看看菜鸟的这个教程:Kotlin教程
Groovy
Groovy是Apache旗下的一门基于JVM平台的动态编程语言,它的语法风格跟Java很像,Java程序员可以很快地熟练使用Groovy,即使开发过程中忘记Groovy的语法,也可以用Java的语法继续写,还可以在Java中调用Groovy脚本。但是Groovy独有的特性也使它在开发语言大潮流中独占一席。
class Hello{
static void main(String[] args){
println("Hello, World");
}
}
其实,光是输出语句到控制台的写法就有挺多种了,以下展示几种:
System.out.println("Hello, World");
System.out.println "Hello, World";
println("Hello, World")
println 'Hello, World'
println('Hello, World');
想继续深入的朋友可以看看W3Cschool的教程:Groovy教程
Groovy官网的文档和资料也是很不错的:Apache Groovy
Scala
Scala是一门多范式的编程语言,多范式就是可以使用多种编程方法的意思,而目目前比较流行的编程方法有面向过程、面向对象、函数式程序设计方法。Scala设计初衷是要集成面向对象编程和函数式编程的各种特性。
它相比传统编程语言最大的优势在于提供了很好的并行编程基础框架。而且Scala代码能很好地被优化成字节码,运行起来和原生Java一样快。
object HelloWorld{
def main(args: Array[String]): Unit = {
println("Hello, World");
}
}
感兴趣的朋友可以看看菜鸟的教程:Scala教程
Jython
Jython是一个用Java语言写的Python解析器,可以无缝与Java类结合,使用户能够用Python语言来高效生成动态编译的Java字节码。而且Jython同时拥有解释器和编译器,使其无需编译就可以测试程序代码。
print "Hello, World"
如果想在Java中加入Jython的代码还可以这么写:
import org.python.util.PythonInterpreter;
public class JythonHelloWorld{
public static void main(String[] args){
try(PythonInterpreter pyInterp = new PythonInterpreter()){
pyInterp.exec("print('Hello, World')");
}
}
}
感兴趣的朋友可以看看Jython的官网:Jython官网
JRuby
JRuby是用来桥接Java与Ruby的,可以使用比Groovy更加简短的语法来编写代码,并且能让每行代码执行更多的任务。JRuby不仅提供了高级的语法格式,而且也提供了面向对象的实现、闭包等。JRuby跟Ruby相比多了很多基于Java的类库,虽然Ruby也有很多类库,但在数量和广泛性上跟Java是无法相比的。
"puts 'Hello, World'"
JRuby的介绍虽然官网也不错:JRuby官网
但刚开始学习的话比较推荐去社区看看:JRuby中国社区
Fantom
Fantom是一种通用的面向对象编程语言,可以运行在Java Runtime Enviroment、.NET Common Language Runtime和浏览器。Fantom本质上是一种脚本语言,所以也可以使用Fantom解释器来运行。但Fantom并不能使用Java的类库,只能使用自己扩展的类库。
class HelloWorld{
static Void main(){
echo("Hello, World")
}
}
想了解Fantom的朋友可以看看IBM Developer上的介绍:基于 JVM 的新一代编程语言:Fantom
Clojure
Clojure是基于LISP编程语言设计的,可在Java和.NET运行时环境上运行的一种高级的、动态的函数式编程语言。
虽然Clojure也能被直接编译成Java字节码,但无法使用动态语言特性以及直接调用Java类库,与其它的JVM脚本语言不同,Clojure并不算是面向对象的。
(defn hello [& args]
(println "Hello, World"))
可以在W3Cschool上了解Clojure:Clojure教程
Rhino
Rhino是一个完全使用Java语言编写的开源JavaScirpt实现,目前由Mozilla基金会管理。它在Java程序中为最终用户提供脚本化能力,也就是说可以给JavaScript加个外壳,嵌入到Java中。同时,Rhino的JavaAdapters能够让JavaScript通过调用Java的类来实现特定的功能。Rhino被作为J2SE 6上默认的Java脚本化引擎。
print('Hello, World')
想继续了解的朋友可以看它家官方的文档:Rhino
或者参考这个博文:Rhino – 基于java的javascript实现
Ceylon
Ceylon是一种面向对象,强调静态类型的编程语言。它是由Red Hat创建的一种既可以在JVM上运行,也可以编译为JavaScript的语言。相对于Java来说,它不仅改进了语言的可读性和内置的模块性,还吸收了高阶函数等函数语言特性,所以这语言也以业务计算为重点,但在其他领域也很灵活。
void main(){
writeLine("Hello, World");
}
有兴趣的朋友可以参考IBM Developer的文章:Ceylon:真正的进步抑或只是另一种语言?
总结
上述就是目前比较流行的可在JVM上运行的九种语言,再加上Java就刚好10种。因为后文会针对Java进行详细介绍,所以在此就不再赘述啦。本人在查找资料的过程中发现,如果真的要学另一种在JVM上运行的语言,从适用性、普及度来考虑,还是比较推荐Kotlin、Groovy、Scala中挑选。
参考资料:
JVM还支持哪些语言(Kotlin、Groovy、JRuby、Jython、Scala)
以及上述提及的资料