科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何在Java平台上使用脚本语言做Java开发(1)

如何在Java平台上使用脚本语言做Java开发(1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本篇文章概括了一些脚本语言(如Groovy,Jruby,Jython)和Java语言的区别,论述了一些在Java平台上使用脚本将会面临的挑战。同时,本文介绍了一些方法,使你可以集成一些最初由Ruby或Python写成的脚本到你的Java代码中。

作者:Gregor Roth/梁婷婷 编译 来源:51CTO.com 2007年12月10日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

它走起路来是否像一个鸭子?

当使用如Rython,Ruby或Groovy这样的脚本语言的时候,不需要定义像上面列表4定义的那样的接口。变量可以拥有任意对象类型的引用。当发送一个消息给目标对象的时候,语言的runtime检查是否存在一个匹配的方法,然后调用这个方法;否则,就抛出一个异常。目标对象不需要实现特殊的接口或是继承类。如果方法本身就存在,runtime就会自动调用它。这种行为被称作“duck typing”,(鸭子测试)意思就是“如果它看起来像一个鸭子,而且像鸭子一样呷呷地叫,那么它一定是一个鸭子。”

列表5:用Groovy写的回调处理

// the call back implementation (which doesn't implement any interface)
class SmtpProtocolHandler {
def onData(nbc) {
def session = nbc.attachment
//...
}
}
        def server = new MultithreadedServer(new SmtpProtocolHandler())
server.run()

质量和性能

比较上面列表4和列表5的两段handler代码,很显然地发现,脚本语言代码比Java代码更紧凑,更易读。这主要是因为使用Groovy和JRuby,你就不需要像使用Java(静态,强类型语言)那样写出所有的类型声明。但在另一方面,缺失类型信息也存在一些缺点。静态类型的支持者称:静态,强类型语言可以通过在编译时检测类型错误来保证程序的健壮性;动态语言的支持者称:相反,像测试驱动开发这样的开发技术抵消了编译时检查的优点。

一般而言,脚本语言比系统程序语言运行的慢,但是运行时性能并不是要考虑的唯一问题。问题始终是,对于目标底层结构来说,是否执行起来足够快。除了速度需求,其它像可靠性和可变性之类的质量问题也需要考虑。例如,在整个软件生命周期中,维护费用占总体开销的比例最大。减少维护费用的关键就是提高可靠性和简易性。脚本语言比较简单,在这些方面通常就比像C++或Java这样的系统程序语言有更好的效果。

在Java平台上使用脚本的方法

现在,你不需要在使用Java和像Groovy,Ruby或Python这样的脚本语言之间做选择了。你的应用程序可以同时享用脚本语言的效率、简洁和Java平台的可靠性。在Java平台上使用脚本语言的关键是,要知道在哪儿用脚本语言最好,在哪儿用Java代码最好。

过去,脚本语言被看作是与Java组件连接在一起的一个细小的粘合代码层。现在,很多Java开发者在Java平台上使用脚本语言,完成很多工作,他们只是依靠Java类库来提供那些不被他们所使用的脚本支持的特征(例如,Java平台提供很多企业层的特征,这些特征大部分脚本语言环境都不支持,如事务管理,remoting通信,或是监测。)

不管你怎样使用它,脚本语言和Java平台的无缝粘合产生了一个更富足的开发环境,在这个环境下,你可以为恰当的任务选择恰当的语言。

有两种方法可以使你认识到什么是Java平台上的“polyglot”开发环境(完整开发环境):你可以或者在Java虚拟机上运行你自己的脚本,或者使用Java本身的接口/进程间通信,来在一个本身的脚本环境内执行脚本语言。

大多数流行的脚本语言的runtimes都是基于C/C++的。使用JNI,可以把你的Java环境连接到本身的脚本环境。对于Ruby,你可以使用一个基于JNI的解决方案(如RJB),或者一个基于进程间的解决方案(如YAJB)。遗憾的是,很多解决方案都会有一些不合需求的限制。例如,基于进程间的解决方案使用一个远程协议连接到当前环境,这可能会导致性能瓶颈。

基于Java的脚本runtime (动态语言支撑的结构)实现

开源工程,如Jython或JRuby被认为是纯粹的基于Java的脚本runtime实现,使你能够在Java虚拟机上执行Python或Ruby脚本。这意味着,使用Python或Ruby写成的脚本可以运行在拥有Java SE runtime的所有平台上。基于Java的脚本rutimes只是会首先把脚本语言结合到Java平台里,并不提供你所想象的那些功能。

因为最初的Ruby或Python脚本的runtimes比基于Java的快很多,使用本身的runtime会是处理这些脚本的首选。而JRuby和Jython这些语言的真正的价值是它们可以调用Java类和被Java类调用。这就把整个Java世界开放到了脚本语言。脚本语言可以访问任何由Java实现的事情。

从底层结构来看,JRuby或Jython可以被看作是基于Java的脚本runtimes,来在Java平台上执行正规的Ruby或Python脚本。从开发者角度看,JRuby或Jython可以被看作是丰富的脚本,它们使用Java类,需要格外的脚本runtime性能。因此,这些“J 脚本”不能执行在本身的脚本runtime上。

集成脚本到Java中

为了在Java虚拟机上运行Python,Ruby或Groovy,需要在Java classpath里添加基于Java的脚本runtimes的jars。设置完后,脚本引擎被实例化,就可以在Java环境里执行脚本了。大多数情况下,会为脚本执行提供简单的引擎类,如列表6所示:

列表6:为Ruby,Groovy,Python提供的Rutime引擎

// run a Ruby scripting  (JRuby V1.1b1)
Ruby runtime = Ruby.getDefaultInstance();
runtime.executeScript(scripting, filename);
// run a Groovy scripting (Groovy V1.1)
GroovyShell gs = new GroovyShell();
gs.evaluate(scripting);
// run a Python scripting (jython V2.2)
PythonInterpreter interp = new PythonInterpreter();
interp.exec(scripting)

大多数脚本引擎允许为你的脚本捆绑Java环境的主机变量,还可以调用特殊的脚本函数。需要注意的是一些脚本引擎需要额外的设置才可以使用扩展特征。如想要调用gems,就需要设置系统属性(jruby.home和jruby.lib)。

随着Java SE 6的发布,一个标准的host脚本引擎的接口被定制成为Java runtime的一个主要部分。JSR 223:在Java平台上使用脚本中有标准化函数,如:脚本引擎发现,捆绑Java主机变量,和脚本符号。JSR 223接口需要一个JSR 223兼容的脚本实现。主要脚本语言的实现可以从脚本工程主页上下载到。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章