基于Java平台的多语言混合编程

2014-11-15 20:13钱宇虹
软件工程 2014年11期

摘 要:Java领域混合语言编程时代已经到来。本文首先回顾静态类型语言和动态类型语言、命令式语言和声明式语言的基本概念和各自的优缺点,然后介绍Java语言的发展趋势和基于Java Virture Machine的代表性语言Jython、JRuby、Groovy、Scala和Clojure,最后指出软件项目的未来在于混合语言编程,Java仍将是JVM生态系统中的重要组成部分。

关键词:JVM;Groovy;Scala;Clojure;多语言混合编程

中图分类号:TP311 文献标识码:A

1 引言(Introduction)

Java语言的一个非常重要特点就是平台无关性,而使用Java Virtual Machine(JVM,Java虚拟机)是实现这一特点的关键。JVM是一个虚构的计算机,它是通过在实际的计算机上仿真模拟各种计算机功能来实现的,因此JVM屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,把字节码解释成具体平台上的机器指令执行,这就是Java能够“一次编译,到处运行”的原因。

虽然JVM是为支持Java语言的语义而设计的,但是这种将编程语言与运行时环境分开的技术使得它也可以用作其他语言的目标。在过去几年间,使用JVM来运行非Java程序的情况成增长趋势,据统计有超过200种语言能够运行在JVM平台上。有的基于JVM的语言Jython(1997年)和JRuby(2000年)都是从其他已存在的语言移植到JVM中来的,Jython(之前被称为Jpython)是一个基于JVM的Python语言实现,Sun公司资助的JRuby是一个基于JVM的Ruby版本,而全新的基于JVM的语言是Groovy、Scala。Clojure还算不上是JVM的一种新的编程语言,它是一种Lisp方言。

随着运行在JVM上的程序设计语言大量增多,大大激发了多语言编程理念,因为这样你可以混合使用编程语言并可以选择最佳匹配,同时还维护着相同的底层字节码和类库。在实际应用中,没有一种语言可以做到完美解决一切问题,每种语言都有自己擅长的方面,而且日趋复杂的软件需求也使得混合编程的应用场景更加频繁。对于Java程序员来说,技术单一正面临着危机,混合编程时代已经到来,这是Java程序员必须迎接的挑战。

本文接下来首先回顾静态类型语言和动态类型语言、命令式语言和声明式语言的基本概念和各自的优缺点,然后介绍Java语言的发展趋势和基于JVM的代表性语言Jython、JRuby、Groovy、Scala和Clojure,最后指出软件项目的未来在于混合语言编程,Java仍将是JVM生态系统中的重要组成部分。

2 静态类型语言和动态类型语言(Statically typed

language vs. dynamically typed language)

根据变量的类型是在编译时确定还是在运行时确定,编程语言可分为静态类型语言和动态类型语言。静态类型语言是指在编译时变量的数据类型即可确定的语言,如:Java,C++等等,多数静态类型语言要求在使用变量之前必须声明数据类型(某些具有类型推导能力的现代语言可能会部分减轻这个要求)。与此相反,动态类型语言是指在运行时确定数据类型的语言,变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型,如:Python和Ruby就是典型动态类型语言,很多脚本语言vbscript,javascript也是这类语言。

要区分静态和动态类型语言仅从语法格式上就足够了,如代码清单1和代码清单2所示:

public int add(int x,int y){

return x+y;

}

代码清单1:静态类型语言(Java)

function add(x,y){

return x+y;

}

代码清单2:动态类型语言(JavaScript)

静态类型语言的主要优点在于其结构规范,便于调试,方便类型安全,缺点是为此需要写更多的类型相关代码。静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言则不需要。动态类型语言的优点在于不需要写非常多的类型相关的代码,缺点自然就是不方便调试,命名不规范,会造成不利于理解等。

3 命令式编程语言和声明式编程语言(Imperative

programming language vs. declarative

programming language)

根据编程范式的不同,高级编程语言可分为命令式语言和声明式语言,两者的编程方式有很大的差异。

命令式语言是基于动作的语言,以冯诺依曼计算机体系结构为背景。机器语言及汇编语言是最早的命令式语言,在这种语言中,计算机被看作是动作的序列,程序就是用语言提供的操作命令书写的一个操作序列。用命令式语言编写程序,就是描述解题过程中每一步,程序的运行过程就是问题的求解过程。命令式语言分为面向过程和面向对象,传统的命令式语言比如Fortran、C和Pascal都是面向过程的,它们主要的程序设计单元是过程。现代的命令式语言比如C++、Java和C#则是面向对象的,它们将对象作为程序的基本单元,将程序和数据封装其中,通过对象之间的协作来解决问题。

声明式编程与命令式相对立,不同于命令式编程需要用算法明确指出每一步该怎么做,声明式编程描述目标的性质,让计算机明白目标,而非流程,即告诉计算机需要计算“什么(What)”而不是“如何(How)”去计算。声明式编程是一个大的概念,其下包含一些有名的子编程范式:约束式编程、领域专属语言、函数式编程、逻辑式编程等。例如:数据库查询语言(SQL,XQuery),正则表达式属于领域专属语言,LISP属于函数式编程语言,Prolog属于逻辑式编程语言。声明式编程语言通常用作解决人工智能问题和约束满足问题。endprint

命令式编程通常会让代码变得十分冗长,更重要的是由于它提供了过于具体的指令,使得执行代码的基础设施(如JVM)没有太多的发挥空间,只能老老实实地根据指令一步步地向目标前进。因为像“执行目的”这样更高层次的信息已经丢失了,并行执行程序会变得十分困难,因此,编程语言的趋势之一,便是能让代码包含更多的“What”,而不是“How”,这样执行环境便可以更加聪明地去适应当前的执行要求,所以声明式编程自2009年起备受人们的关注。

4 Java语言的发展趋势(The trend of the Java

language)

Java语言集许多语言的优点于一身,它的面向对象特性让大型软件工程变得更加容易管理,它的自动垃圾回收机制能有效地管理内存和防止内存泄露,它的平台无关性让Java在服务器端软件领域获得巨大成功。Sun公司在推出Java时就将其作为开放的技术,得到了广大软件开发商的支持,Java拥有世界上最大的开发人群和开源生态系统,这是其他语言无法比拟的。

Java语言已经证明了它的强大与成功,但是Java并不是尽善尽美的。对Java语言的批评主要集中在三个方面:语言问题、模块化问题、性能问题。首先是语言问题,Java是静态类型语言,属于命令式编程范式,它的语法与固有范式存在着已知的局限性。Java语言的一个发展趋势是在可能的范围内降低语言本身的语法复杂度,从J2SE 5.0中增强的for循环,到Java SE 7中的try-with-resources语句和<>操作符,再到Java SE 8中引入的lambda表达式,Java正在不断地简化自身的语法并引入一些重要的现代语法特征,例如函数式编程中的某些特性。第二是模块化问题,Java平台所包含的各种功能不同的类库是一个统一的整体,在一个程序的运行过程中很多类库其实是不需要的。模块化的含义是把Java平台提供的类库划分成不同的相互依赖的模块,程序根据需要选择运行时所依赖的模块,只有被选择的模块才会在运行时被加载。模块化的实现不仅可以应用到Java平台本身,也可以应用到Java应用程序的开发中,OpenJDK中的Jigsaw项目提供了这种模块化的支持[1]。第三是性能问题,这主要是因为JVM这个中间层次的存在。随着硬件技术的发展,越来越多的硬件平台采用了多核CPU和多CPU的架构,Java平台需要帮助开发人员更好地充分利用这些资源来提高程序的运行性能。Java SE 7中的fork/join框架是一个高效的任务执行框架。Java SE 8对集合类框架和相关API做了增强,以支持对批量数据进行自动的并行处理。

Java仍然是最受欢迎的编程语言,而且至少在接下来的这几年里不会改变,原因有很多:首先,许多计算机科学的程序和其他领域的程序是用Java编写的。第二,Java有一个巨大的稳定的代码库。第三,有大量的厂商投资、工具、培训和其他产品,使得无论是供应商还是他们的客户都依赖Java。第四,Java拥有最大的开发社区和开源生态系统,当涉及到选择何种工具、供应商和开发者作为未来的开发方向时,Java仍然是首选。

5 基于JVM的语言(JVM-hosted languages)

Java面临的最大的威胁是快速发展的JVM-hosted语言,如Jython、JRuby、Groovy、Scala和Clojure,这些语言都基于JVM,它们可以与Java语言方便简单地集成,相比Java都有更加简明的语法和丰富的表达能力。以Groovy、Scala和Clojure为代表的JVM语言被业界称为“JVM三巨头”,调查显示Groovy和Scala两者都显示出强劲的商业应用热度,Clojure的支持绝大部分来自业余爱好者和lisp黑客,而不是商业组织[2]。没有任何一种语言可以彻底地取代另外一种或是所有的语言,它们根据各自的擅长很好地解决问题。

5.1 Jython

Jython即是Python语言的Java实现。要了解Jython,首先要了解Python。Python支持命令式程序设计、面向对象程序设计、函数式编程、面向方面的程序设计、泛型编程多种编程范式。Python开发者的哲学是“用一种方法,最好只有一种方法来做一件事”,因此Python源代码具备很好的可读性,并且能够支撑大规模的软件开发。Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。一些知名大学采用Python教授程序设计课程,例如卡耐基梅隆大学的编程基础和麻省理工学院的计算机科学及编程导论就使用Python语言讲授。

Jython是用Java编写,它继承了Java和Python二者的特性而显得很独特,如Jython代码的可读性和清晰性,与Java的无缝集成,动态类型,Java程序员在数日内就能熟悉Jython。

5.2 JRuby

JRuby是Ruby语言的纯Java实现(Ruby是用C写的),它结合了Ruby简洁的语法以及Java丰富的类库,通过JRuby可以在JVM上直接运行Ruby程序,调用Java的类库。JRuby无缝地“组合”了Java和Ruby的优势,使我们的开发效率事半功倍[3]。

Ruby发明的理念是“你既能进行高效开发又能享受编程的快乐”,其次是良好的界面设计,他强调系统设计必须注重人性化,而不是一味从机器的角度设想,遵循上述的理念,Ruby语言通常非常直观,按照编程人认为它应该的方式运行。Ruby是一种有趣的语言,它支持使用多重范式,其中之一是“函数式范式”,JRuby是完全面向对象的。

5.3 Groovy

Groovy是Java平台上设计的面向对象编程语言。这门动态类型语言拥有类似Python、Ruby和Smalltalk的一些特性,可以作为Java平台的脚本语言使用。Groovy的语法很像Java以至于多数的Java代码也是正确的Groovy代码,这样了解Java的开发者可以更快地学习Groovy。Groovy代码动态的被编译器转换成Java字节码。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。Groovy的优势在于易用性以及与Java无缝衔接,一些开发者由于Groovy和Java的无缝集成而使用Groovy[4]。endprint

5.4 Scala

Scala是一种纯粹的面向对象编程语言,Scala中的每个值包括基本数据类型都是对象,连函数也是对象。Scala包含若干函数式语言的关键概念,把函数式和面向对象的编程思想很好地统一到了一种语言里。Scala可以与Java互操作,可以访问现存的数之不尽的Java类库,这使得Scala成为Java程序员解决某些问题的另一种选择。Scala把Erlang风格的基于actor的并发带进了JVM,开发者现在可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,它会自动获得多核处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。因此与Groovy相比,Scala的优势在于性能和一些高级特性[5]。

5.5 Clojure

Clojure给JVM带来了Lisp。Lisp是基于λ演算的函数式编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况,Clojure的出现彻底改变了这一现状,它是一种运行在Java平台上的Lisp方言,在任何具备JVM的地方都可以利用Lisp的强大功能。Clojure不是面向对象的,但提供了很多你想从OO中得到的东西,如封装(通过名字空间、私有定义和闭包)、强大的多态(multimethods)、函数重用比继承更胜一筹。同时,Clojure可以无缝地与Java进行交互操作,因此,Java开发团队学习Clojure具有优势。Clojure还把函数式编程语言引入JVM,使Clojure成为一种进行并行、并发编程的完美语言,支持现在的多核、多CPU以及分布式计算。

6 结论(Conclusion)

我们究竟需要什么样的编程语言?企业级项目和Web项目需要怎样的语言?一般而言有以下要求:可伸缩性、可移植性、并行编程、高性能、DSL(领域专属语言)的实现,还有对于低风险的要求,如与旧项目的兼容性,旧项目迁移的成本,开发工具的支持,开发团队对语言的熟悉情况,以及语言开发团队的稳定性等等。而具体到每一位开发者头上情况变得更加复杂。他们可能想要:动态的、静态的、强类型的、函数式的、富有表达力的、面向对象的、容易学习的(在有Java或其他语言开发经验的基础上)、快捷的、模块化的、有强大的类库、有好用的框架、有合适的IDE、有活跃的社区等等。某些语言可能满足上述条件中的若干条,但是没有任何一种语言能够满足所有条件。同时,一个项目的不同层面的需求也是不同的,比如,广受欢迎的社交网络及微博网站Twitter,表层是Ruby on Rails,底层是Scala;著名的在线学习网站Coursera把Scala作为服务器语言使用。

综上所述,软件项目的未来在于混合语言编程,而Java仍将是JVM生态系统中的重要组成部分。

参考文献(References)

[1] OpenJdk Project Jigsaw [EB/OL].http:// openjdk.java.net/

projects/jigsaw/

[2] The Big Three-Scala, Clojure and Groovy [EB/OL].http://

thecodegeneral.wordpress.com/2012/03/04/the-big-three-

jvm-languages/.

[3] JRuby Homepage [EB/OL].http://www.jruby.org/.

[4] Groovy Homepage [EB/OL].http://groovy.codehaus.org/.

[5] Scala website [EB/OL].http://www.scala-lang.org/.

作者简介:

钱宇虹(1967-),女,硕士,副教授.研究领域:软件开发与应

用,软件工程,软件测试技术.endprint