java调用shell脚本,java python shell
前言:
Lua作为解析和执行的脚本语言,往往是编写易变逻辑的首选语言,尤其是在游戏领域。C/C和Lua的组合往往是标准的。比如Redis,Nginx对Lua的支持也是杠杠的。当然,Lua也可以作为规则引擎中的规则编写语言。简要介绍Java调用Lua(Luaj)的实现机制。
Luaj简介:
Luaj是Java调用Lua的一种方式,通过构建一个虚拟机来解析和执行Lua脚本来实现,与Groovy的方式不同。
这是Luaj的官方网站,http://www.luaj.org/luaj/3.0/README.html.
它是lua版本5.2.x的解析器,其Luaj库由JavaCC编写。
简单的例子:
设置Luaj,可以通过Maven进行如下配置:
org.luaj
luaj-jse
3.0.1
Luaj的一个简单示例程序:
导入org . luaj . vm2 . globals;
导入org . luaj . vm2 . Lua value;
导入org . luaj . vm2 . lib . jse . jse platform;
公共类TestLuaJ {
公共静态void main(String[] args) {
String luaStr=print 你好,世界!;
globals globals=jse platform . standard globals();
Lua value chunk=globals . load(luaStr);
chunk . call();
}
}
注意:Globals继承了LuaValue对象,用于表示Lua语言中的基本数据类型,如nil、number、string、table、user data、function等。特别需要注意的是,LuaValue也表示Lua语言中的函数。所以Lua语言中的所有函数操作都是通过LuaValue来实现的。
其输出的结果:
你好,世界!
原理初步研究:
按照官方的说法,Luaj在包装和执行具体的Lua代码时有三种不同的模式。
1)纯脚本解析和执行(没有任何编译器)
2) Tolua字节码(luac,Lua到Lua字节码编译器)
3).到Java字节码(Luajc,Lua到Java字节码编译器)
LuaC是默认的编译器。
据官方介绍:
如果不使用LuaC,就不会调用how to do:
org . luaj . vm2 . compiler . luac . install(globals);
使用LuaJC的方法是调用。
org . luaj . vm2 . jse . Lua JC . Lua JC . install(globals);
可惜作者遇到了异常(org . luaj . vm2 . Lua error:no compiler。)在他自己的测试中,这很尴尬:
绩效评估:
Lua解析代码的简单性能评估;
对于相同的逻辑代码:
int a=0;
for(int I=0;我10000;i ) {
a=a I;
}
执行10000次,比较耗时值。
的整体测试代码如下:
导入org . luaj . vm2 . globals;
导入org . luaj . vm2 . Lua value;
导入org . luaj . vm2 . lib . jse . jse platform;
公共类TestLuaJPerf {
公共静态void main(String[] args) {
int iterNum=10000
//*)在Java模式下运行
long beg=system . current time millis();
for(int j=0;j iterNumj ) {
int a=0;
for(int I=0;我10000;i ) {
a=a I;
}
}
long end=system . current time millis();
system . out . println(string . format( Java consume:% DMS ,end-beg));
//*)解析和执行Lua脚本
字符串luaStr= a=0;对于i=0,10000,1做a=a I;结束;
globals globals=jse platform . standard globals();
Lua value chunk=globals . load(luaStr);
beg=system . current time millis();
for(int I=0;i iterNumi ) {
chunk . call();
}
end=system . current time millis();
system . out . println(string . format( Lua consume:% DMS ,end-beg));
}
}
测试结果如下:
Java消耗:10ms
Lua消耗:10249毫秒
差了差不多1000倍,这个性能对比有些大,Lua确实慢了半分(这可能和Luaj的具体实现有关系)。所以在这方面,Java Groovy的组合比Java Lua更有优势。
线程安全:
Luaj中的Globals对象不是线程安全的,所以最佳实践是每个线程有一个Globals对象。
事实上,对象可以以ThreadLocal的方式存储。
因为是对象,不是类,所以它的实现思路和Groovy编译的脚本类有本质的区别。
总结:
我个人对Luaj的了解还比较肤浅,没有深入研究过,所以这里的一些结论可能不准确。同时,Luaj对Lua脚本的支持程度其实是个问号。无论如何,对Luaj有一个初步的了解是有好处的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。