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编写的脚本。
package com.mano.example;
import javax.script.*;
public class ScriptingDemo {
public static void main(String[] args) {
final ScriptEngineManager manager = new
ScriptEngineManager();
final ScriptEngine engine =
manager.getEngineByName("js");
try {
System.out.println(engine.eval("engine.getClass()
.getSimpleName()"));
System.out.println(engine.eval("5+5"));
engine.put("x", 123423558);
engine.put("y", 4);
engine.eval("var result = x.toExponential(y);");
System.out.println(engine.get("result"));
}catch (ScriptException e) {
e.printStackTrace();
}
}
}
我们还可以使用Reader来执行存储在网络或文件中的脚本。将脚本存储在单独的文件中具有优势。我们可以分别调试和修改脚本,而无需重新编译Java代码。但是,对于简短的脚本,可以将JavaScript放在String对象中。
package com.mano.example;
import javax.script.*;
import java.io.*;
import java.nio.file.*;
public class ScriptingDemo {
public static void main(String[] args) {
finalScriptEngineManager manager = new
ScriptEngineManager();
final ScriptEngine engine =
manager.getEngineByName("js");
Path scriptFile = Paths.get("sample.js");
try {
Reader reader = Files.newBufferedReader(scriptFile);
engine.eval(reader);
}catch(IOException | ScriptException e) {
e.printStackTrace();
}
}
}
请注意,尽管通过eval调用脚本,但它不与评估者共享状态。这是一个独立的代码。JVM使用的基础脚本引擎是Nashorn,但很快它将被GraalVM取代。从API的角度来看,没有任何区别,但是从性能和可扩展性的角度来看,GraalVM会有所作为。
JDK安装的bin /文件夹中有一个名为jjs(不推荐使用)的命令行工具。该工具可用于直接执行JavaScript文件。 如,
$ jjs sample.js
尽管这里显示的示例很简单,但是我们可以做更多的事情,并以更有意义的方式结合JavaScript和Java。
在JVM上使用Groovy
Apache Groovy作为一种动态语言已经与Java并存了很长时间。它功能强大,可以选择使用静态类型和编译功能进行键入。它与Java程序集成得很好,并且可以像JavaScript一样使用。它被设计为Java的扩展。语言,对象模型和运行时库保留了旧版。它支持静态和动态类型输入,并且对XML和HTML,正则表达式,列表和关联数组具有本地支持。请注意,以下代码实际上是Groovy脚本,而不是Java。语法有点类似。自然,Java程序员可以快速掌握几乎平坦的学习曲线。Groovy脚本引擎具有对Java标准API库的完全访问权限;因此,它不需要任何其他绑定即可调用Java API Date功能,如下所示。
package com.mano.example
class SimpleApp {
static void main(String[] args){ Date date = new Date();
System.out.println(date.toString());
for(int i=0;i<10;i++)
println(i)
}
}
可以从命令行执行以下代码。
$ groovy SimpleApp.groovy
有groovyc,它是Groovy编译器,用于将Groovy源代码编译为字节码,就像javac一样。它只是创建一个类文件,然后可以像JVM通常运行的任何其他类文件一样运行该文件。它是一个命令行工具,也是编译和运行Groovy脚本的最简单方法。像这样:
$ groovyc sample.groovy
JVM上的Ruby
Ruby曾经是Web开发领域中流行的动态语言。最近,它为现代Web应用程序开发带来了一些重大的创新。JVM平台的Ruby实现称为JRuby。它以高性能和多线程功能而闻名,它具有从Java和Ruby派生的大量库。与Groovy相似,这带来了Java和Ruby之间的巨大互操作性。
JRuby中实现阶乘的一种简单方法如下:
def fact(num)
if num==0
return 1
else
return num*fact(num-1)
end
end
JVM上的Python
Python作为一种面向对象的动态语言,最近吸引了很多人。它被科学界广泛使用,并以其庞大的图书馆库和从Web开发到自然语言处理的框架而闻名。 Python的JVM实现称为Jython。
如果说Groovy的强大之处在于它与Java的语法相似性,那么Python的强大之处就是其语法的简单性。以下是一个非常琐碎的演示。
print "This is a simple code to demonstrate Jython"
i = 0
while i<10:
i = i+1
print "Value of i = ",i
Python有趣的方面是人们为了简单起见使用它。有足够的文档和帮助,可根据需要提供。在Jython的帮助下,我们可以将Python的功能无缝地集成到现有的Java应用程序中。
结论
Java应用程序现在可以利用可扩展的动态语言支持进行充实。除此之外,JVM还支持许多其他语言。仅举几例:Clojure,Kotlin和Scala。将来肯定会添加更多。Nashorn的弃用和GraalVM的合并可能会在语言支持方面带来新的东西。 现在,Java应用程序可以从聚集在一个友好环境中的多种语言中受益。也许目的是使JVM也成为独立于语言的平台。
本文分享到这。感谢阅读!

JVM中的动态语言支持简介的更多相关文章
- jvm中的动态分派
动态分派与复写密不可分,因为java中存在向上转型,这样就涉及到方法的调用问题.先看一下示例代码 package com.dy.xidian; class Test1 { public void sa ...
- 体验 ASP.NET Core 中的多语言支持(Localization)
首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOp ...
- 一步一步在angular11中添加多语言支持
1.新建angular 2.添加@angular/localize ng add @angular/localize 3.设置默认locale_id,在app.module.ts中 import { ...
- ubuntu14.04安装了im-switch后系统设置中不见了语言支持
sudo apt-get install language-selector-gnome
- JVM中ClassLoader的学习
JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...
- thinkPHP的多语言支持如何配置和部署
框架底层语言包位于:ThinkPHP/Lang/zh-cn.php 可以参考如何编写语言文件 第一步:项目目录下的配置文件中配置多语言支持的相关选项 以我的路径为例是Application\Commo ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 【转】解析JDK 7的动态类型语言支持
http://www.infoq.com/cn/articles/jdk-dynamically-typed-language Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问 ...
随机推荐
- java学习笔记之反射—反射和工厂模式
简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...
- C#中删除目录以及目录下文件的方法
场景 C#中根据文件夹路径,将文件夹以及文件夹下文件删除. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电 ...
- mysql远程连接失败的两种解决方法
---恢复内容开始--- (这是转载别人的,因为我觉得很有用,每次都是参考这个的第二种方法解决的,不管你听不听得到,先说声谢谢!也记下来方便大家看看) mysql解决远程不能访问的二种方法,需要的朋友 ...
- 使用yum安装报错:[Errno 256] No more mirrors to try
背景:我使用yum方式安装软件时,比如zabbix这种软件,我们在安装时一般都是直接到zabbix官网,按照官方的步骤进行安装,但是有一个问题,官方的服务器不在国内,时常会在安装时导致超时报错.此时解 ...
- Angular 相关概念
1.XMLHttpRequest 对象(属于xmlJavascript) XMLHttpRequest 对象用于在后台与服务器交换数据. Ajax 是对XMLHttpRequest 的封装,XMLHt ...
- C++——指针1
7.关于内存地址 内存空间的访问方式:通过变量名访问,通过地址访问: 地址运算符:& 如:int var; 则&var表示变量var的内存起始地址: //& 出现在声明语句中出 ...
- 关于List比较好玩的操作
作为Java大家庭中的集合类框架,List应该是平时开发中最常用的,可能有这种需求,当集合中的某些元素符合一定条件时,想要删除这个元素.如: public class ListTest { publi ...
- ECMAScript基本语法——④变量
简介 变量:一小块存储数据的内存空间先申请了一块内存空间,规定空间的存储类型,给空间赋值3, 想找到这个3可以通过内存空间的地址值,但是通过地址值太麻烦了,给这个空间起了一个名字a 通过这个a可以找到 ...
- 巨杉TechDay回顾 | 技术人的夏天 · 就是这么燃!
在All in Cloud的云计算时代,业务和应用正在不断“云化”,在此过程中云原生(Cloud Native)理念应运而生.作为云化改造的重要部分,云数据库因其天生的弹性扩展能力以及灵活.易用等特点 ...
- Windows下解决github push failed (remote: Permission to userA/XXXX.git denied to userB.) 上传gitHub失败报错
Windows环境下解决 github push failed (remote: Permission to userA/XXXX.git denied to userB.) · 初学GitHub的朋 ...