欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JVM中的动态语言支持简介

程序员文章站 2022-06-11 16:18:48
抽丝剥茧 细说架构那些事——【优锐课】 从版本6开始,JVM已扩展为支持现代动态语言(也称为脚本语言)。Java8的发行为这一领域提供了更多动力。感到这种支持的必要性是因为Java作为一种语言固有地是静态类型的。一切都在编译时决定。另一方面,动态语言的行为是在运行时定义的。结果,JVM对Java的支 ......

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

从版本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 package com.mano.example;
 2 
 3 import javax.script.*;
 4 
 5 public class scriptingdemo {
 6 
 7    public static void main(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 package com.mano.example;
 2 import javax.script.*;
 3 import java.io.*;
 4 import java.nio.file.*;
 5 public class scriptingdemo {
 6    public static void main(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 package com.mano.example
 2 class simpleapp {
 3    static void main(string[] args){
 4  
 5       date date = new date();
 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    end
7 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也成为独立于语言的平台。

 

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