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