java 支持动态语言,JVM中的动态语言支持简介,

JVM中的动态语言支持简介,

抽丝剥茧 细说架构那些事——【优锐课】

从版本6开始,JVM已扩展为支持现代动态语言(也称为脚本语言)。Java8的发行为这一领域提供了更多动力。感到这种支持的必要性是因为Java作为一种语言固有地是静态类型的。一切都在编译时决定。另一方面,动态语言的行为是在运行时定义的。结果,JVM对Java的支持为Java程序员开辟了新的视野,我们可以在其中结合平台的静态和动态方面,并在Java应用程序中有效地使用它。本文浏览了JVM中的动态语言支持列表。

动态语言支持

静态类型化的语言意味着所有类型化的信息(例如类,其成员,函数参数,返回类型值等等)都在编译时确定。Java编译器使用此信息来生成字节码。

另一方面,动态语言(脚本语言)由脚本引擎在运行时执行所有类型检查。没有单独的编译步骤。指令序列由解释器执行,然后对其进行解析以生成中间代码。变量在编译为JVM使用的Java字节码时存储在符号表中。动态语言的特征在于,一旦编写了代码,便可以立即对其进行部署。因为它是解释型的,所以几乎没有等待时间就很容易调试。在Java中,包javax.script提供了所有类和接口,称为Java Scripting API,以支持动态语言。

静态和动态两种语言都有很多优点和缺点。但是,要点是,由于Java的静态特性,Java到目前为止无法获得好处。在特殊支持下重建JVM并非易事。也许,真正的挑战在于实现一个运行时系统,该系统可以在编译过程结束后为方法调用选择适当的实现。在这里,我们介绍了JVM流行的一些动态语言支持。

JVM中的JavaScript

JavaScript是Java Scripting API支持的最流行的脚本语言。当今所有的Web浏览器都支持这种语言。ScriptEngine接口中的eval方法可用于执行以纯Java String编写的脚本。

1 packagecom.mano.example;2

3 import javax.script.*;4

5 public classScriptingDemo {6

7 public static voidmain(String[] args) {8

9 final ScriptEngineManager manager = new

10

11 ScriptEngineManager();12

13 final ScriptEngine engine =

14

15 manager.getEngineByName("js");16

17 try{18

19 System.out.println(engine.eval("engine.getClass()

20

21 .getSimpleName()"));

22

23 System.out.println(engine.eval("5+5"));24

25 engine.put("x", 123423558);26

27 engine.put("y", 4);28

29 engine.eval("var result = x.toExponential(y);");30

31 System.out.println(engine.get("result"));32

33 }catch(ScriptException e) {34

35 e.printStackTrace();36

37 }38

39 }40

41 }

我们还可以使用Reader来执行存储在网络或文件中的脚本。将脚本存储在单独的文件中具有优势。我们可以分别调试和修改脚本,而无需重新编译Java代码。但是,对于简短的脚本,可以将JavaScript放在String对象中。

1 packagecom.mano.example;2 import javax.script.*;3 import java.io.*;4 import java.nio.file.*;5 public classScriptingDemo {6 public static voidmain(String[] args) {7 finalScriptEngineManager manager = new

8 ScriptEngineManager();9 final ScriptEngine engine =

10 manager.getEngineByName("js");11 Path scriptFile = Paths.get("sample.js");12 try{13 Reader reader =Files.newBufferedReader(scriptFile);14 engine.eval(reader);15 }catch(IOException |ScriptException e) {16 e.printStackTrace();17 }18 }19 }

请注意,尽管通过eval调用脚本,但它不与评估者共享状态。这是一个独立的代码。JVM使用的基础脚本引擎是Nashorn,但很快它将被GraalVM取代。从API的角度来看,没有任何区别,但是从性能和可扩展性的角度来看,GraalVM会有所作为。

JDK安装的bin /文件夹中有一个名为jjs(不推荐使用)的命令行工具。该工具可用于直接执行JavaScript文件。 如,

1 $ jjs sample.js

尽管这里显示的示例很简单,但是我们可以做更多的事情,并以更有意义的方式结合JavaScript和Java。

在JVM上使用Groovy

Apache Groovy作为一种动态语言已经与Java并存了很长时间。它功能强大,可以选择使用静态类型和编译功能进行键入。它与Java程序集成得很好,并且可以像JavaScript一样使用。它被设计为Java的扩展。语言,对象模型和运行时库保留了旧版。它支持静态和动态类型输入,并且对XML和HTML,正则表达式,列表和关联数组具有本地支持。请注意,以下代码实际上是Groovy脚本,而不是Java。语法有点类似。自然,Java程序员可以快速掌握几乎平坦的学习曲线。Groovy脚本引擎具有对Java标准API库的完全访问权限;因此,它不需要任何其他绑定即可调用Java API Date功能,如下所示。

1 packagecom.mano.example2 classSimpleApp {3 static voidmain(String[] args){4

5 Date date = newDate();6 System.out.println(date.toString());7 for(int i=0;i<10;i++)8 println(i)9 }10 }

可以从命令行执行以下代码。

1 $ groovy SimpleApp.groovy

有groovyc,它是Groovy编译器,用于将Groovy源代码编译为字节码,就像javac一样。它只是创建一个类文件,然后可以像JVM通常运行的任何其他类文件一样运行该文件。它是一个命令行工具,也是编译和运行Groovy脚本的最简单方法。像这样:

1 $ groovyc sample.groovy

JVM上的Ruby

Ruby曾经是Web开发领域中流行的动态语言。最近,它为现代Web应用程序开发带来了一些重大的创新。JVM平台的Ruby实现称为JRuby。它以高性能和多线程功能而闻名,它具有从Java和Ruby派生的大量库。与Groovy相似,这带来了Java和Ruby之间的巨大互操作性。

JRuby中实现阶乘的一种简单方法如下:

1 def fact(num)2 if num==0

3 return 1

4 else

5 return num*fact(num-1)6 end7 end

JVM上的Python

Python作为一种面向对象的动态语言,最近吸引了很多人。它被科学界广泛使用,并以其庞大的图书馆库和从Web开发到自然语言处理的框架而闻名。 Python的JVM实现称为Jython。

如果说Groovy的强大之处在于它与Java的语法相似性,那么Python的强大之处就是其语法的简单性。以下是一个非常琐碎的演示。

1 print "This is a simple code to demonstrate Jython"

2 i = 0

3 while i<10:4 i = i+1

5 print "Value of i = ",i

Python有趣的方面是人们为了简单起见使用它。有足够的文档和帮助,可根据需要提供。在Jython的帮助下,我们可以将Python的功能无缝地集成到现有的Java应用程序中。

结论

Java应用程序现在可以利用可扩展的动态语言支持进行充实。除此之外,JVM还支持许多其他语言。仅举几例:Clojure,Kotlin和Scala。将来肯定会添加更多。Nashorn的弃用和GraalVM的合并可能会在语言支持方面带来新的东西。 现在,Java应用程序可以从聚集在一个友好环境中的多种语言中受益。也许目的是使JVM也成为独立于语言的平台。

本文分享到这。感谢阅读!

http://www.dengb.com/Javabc/1386589.htmlwww.dengb.comtruehttp://www.dengb.com/Javabc/1386589.htmlTechArticleJVM中的动态语言支持简介, 抽丝剥茧 细说架构那些事【优锐课】 从版本6开始,JVM已扩展为支持现代动态语言(也称为脚本语言)。Java8的...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值