java调用shell脚本,java python shell

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: