aviatorscript

A high performance scripting language hosted on the JVM.

Stars
4.5K
Committers
21

Bot releases are hidden (Show)

aviatorscript - Aviator 4.1.0 发布

Published by killme2008 almost 6 years ago

新功能列表

  1. 支持赋值语句,可以在表达式中给变量赋值,一些例子:
    assertEquals(3, AviatorEvaluator.execute("a=1; a+2"));
    assertEquals(5, AviatorEvaluator.execute("a=3; b=2; a+b"));
    assertEquals(20.0, AviatorEvaluator.execute("a=3; b=2; c=a+b; c*4.0"));
    assertEquals(6, AviatorEvaluator.execute("square = lambda(x) -> x *2 end; square(3)"));
    assertEquals(1, AviatorEvaluator.execute("a=5;b=4.2 ; c= a > b? 1: 0; c"));
    assertEquals(6, AviatorEvaluator.execute("add_n = lambda(x) -> lambda(y) -> x + y end end ; "
        + "add_1 = add_n(1) ; " + "add_2 = add_n(2) ;" + " add_1(add_2(3))"));

可以看到处了基本类型赋值之外,还可以支持将 lambda 表达式赋值给一个变量,函数也将作为 first class 成员使用。

  1. AviatorEvaulatorInstanceAviatorEvaulator 新增方法 isExpressionCached()getExpressionCacheSize() 分别用于判断表达式是否缓存编译结果,以及返回缓存的编译表达式总数。
  2. AbstractFunctionAbstractVariadicFunction 都继承了 AviatorObject,函数作为 first class 成员提供,他们的值就是自身。
  3. 新增可变参数函数 tuple(x, y, z, ...) 用于返回一个 Object [] 数组,适用于需要返回多参数的场景。
  4. 对于 a.b.c 的嵌套访问语法糖做了性能改进,如果 ab 都是 Map,将直接访问,避免全局锁和反射,感谢阿里同事的 idea 贡献。性能测试来看有接近一倍的提升。
  5. 一些代码重构和改进,感谢 @einverne

Bug 修复

  1. #77 开启高精度计算情况下,正则表达式错误。
  2. #87 longdouble 函数不支持 decimal 和 bigint 类型。
  3. #92 转义符号处理异常。
  4. 修复编译优化丢失 env 的 bug。

兼容问题

  1. FunctionUtils#getStringValue(AviatorObject, Map) 当 string 为 null 的时候直接返回,不再抛出异常 #67
  2. 4.0.0-RC 版本为了支持 lambda 闭包,引入了嵌套 scope 的概念,并且不再直接修改用户传入的 env map,但是发现很多用户依赖这个修改行为,因此 4.1.0 引入了 Options.USE_USER_ENV_AS_TOP_ENV_DIRECTLY 选项,默认为 true,表示将直接使用用户的 env 作为 top 级别的 env 使用,兼容老版本的行为 #74 #94

推荐跳过此版本,直接升级到最新版本,此版本有一定性能问题

Maven 依赖:

<dependency>
      <groupId>com.googlecode.aviator</groupId>
      <artifactId>aviator</artifactId>
      <version>4.1.0</version>
  </dependency>
aviatorscript - Aviator 4.0.0-RC 发布

Published by killme2008 over 6 years ago

本次发布是一个大版本升级,主要改进如下:

  1. 多行表达式支持,以分号;隔开的多个表达式,求值结果将是最后一个表达式的值。
  2. 支持 lambda 定义匿名函数,支持闭包捕获。自定义函数可以通过 lambda,举例如下
AviatorEvaluator.defineFunction("s",
        "lambda(x) -> lambda(y) -> lambda(z) -> x + y + z end end end");
AviatorEvaluator.exec("println(s(4)(5)(6))");

filtermap等高阶函数也支持使用 lambda 替代原有的谓词函数:

Map<String, Object> env = ...
int [] a = ...
env.put("a", a);
AviatorEvaluator.execute("map(a, lambda(x) -> x + 1 end))");
  1. 新增两个选项

    • ENABLE_PROPERTY_SYNTAX_SUGAR,是否启用属性访问的语法糖,例如 a.b.c 的变量访问是否走 commons-beanutils 反射访问,默认启用为 true。禁用后,这类变量将直接从 env 获取。
    • NIL_WHEN_PROPERTY_NOT_FOUND,当启用属性语法糖的时候,如果调用反射失败,默认行为是抛出异常,通过启用这个选项,将直接返回 null,忽略异常。
  2. 支持求值器多实例,可以通过 AviatorEvaluator.newInstance() 创建求值器实例 AviatorEvaluatorInstance,不同求值器之间的选项、自定义函数等不共享。原有的 AviatorEvaluator只是一个全局静态实例。

  3. 修复字符串类型转义符支持。

  4. 新增 FunctionLoader 接口用于自定义函数加载

public interface FunctionLoader {
  public AviatorFunction onFunctionNotFound(String name);
}

可以添加自定义函数加载器到求值器实例 AviatorEvaluator.addFunctionLoader(loader)。默认新增提供了一个 SringContextFunctionLoader,可用于从 spring 容器加载自定义函数。

  1. seq.filter 函数现在支持 Map 类型集合的迭代过滤。
  2. seq 的谓词函数都支持第三个参数,用于做属性过滤,参见测试用例
  3. 新增两个内置的特殊变量:
    • #__env__ 表示运行环境的 env 上下文。
    • #__instance__ 表示当前运行的求值器 AviatorEvaluatorInstance实例。
  4. 新增函数 boolean(v),可将其他类型的值转成布尔类型,除了 nil/false之外,其他值都将为 true。
  5. Opitons.TRACE_EVAL跟踪运行,支持函数调用跟踪。
  6. 语法错误信息改进,标记错误的表达式位置。

兼容性问题

  • 如果现有自定义函数名是 lambda,将无法正常使用,请使用其他名字。
  • 新版本将不再修改用户传入的 env ,如果需要依赖这个行为,请使用返回值的方式。
aviatorscript - Aviator 3.3.0 发布

Published by killme2008 almost 7 years ago

主要特性:

  1. 支持运算符重载,参见开发指南
  2. 新增选项 Options.TRACE_EVAL,打开后可跟踪调试求值过程,该选项极大地影响性能,并且将关闭逻辑运算符的短路运算,请不要在生产环境打开。
  3. 新增选项 Options.PUT_CAPTURING_GROUPS_INTO_ENV,是否将正则匹配捕获的分组放入 env ,默认打开。可关闭提升正则匹配性能。
  4. 废弃选项 ALWAYS_USE_DOUBLE_AS_DECIMAL,这是个命名错误,请使用新选项 ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL替代。
  5. 更新了开发指南,补充新增功能说明。
<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>3.3.0</version>
</dependency>
aviatorscript - Aviator 3.2.0 发布

Published by killme2008 almost 7 years ago

主要变更:

  • 不再兼容 JDK6 及以下版本,要求使用 JDK7 或者更高版本。如果需要继续在 JDK6 使用,请使用老版本。
  • 引入环境变量 aviator.preferClassloaderDefiner,默认为 false,表示是否继续使用 ClassLoader#defineClass 的方式来定义表达式类,默认将优先使用 sun.misc.Unsafe#defineAnonymousClass 方法。
  • 由于优先使用 sun.misc.Unsafe#defineAnonymousClass,编译性能更好(没有 ClassLoader 加载校验等环节),表达式编译后的匿名类将可以被 GC 正常回收,解决在编译大量动态表达式的时候导致的内存消耗膨胀问题。
<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>3.2.0</version>
</dependency>
aviatorscript - Aviator 3.1.1 发布

Published by killme2008 almost 7 years ago

  • 修复 AviatorString 比较运算符存在的 NPE 异常,参见 #31
  • 升级 ASM 库,移除 trace 字节码功能,废弃 Options.TRACE。整个库不包括依赖库大小缩减到 289 K。
aviatorscript - Aviator 3.1.0 发布

Published by killme2008 over 7 years ago

主要更新如下

  • seq 库增加了一些高阶函数 seq.everyseq.not_anyseq.some,以及逻辑组合函数,用于返回复合谓词,例如 seq.and(seq.gt(3), seq.lt(10)) 等, 例如:
//检测数组每个元素都在 0 <= e < 10 之间。   
AviatorEvaluator.execute("seq.every(a,seq.and(seq.ge(0), seq.lt(10)))", env);  

see #18

  • 增加方法 Expression#getVariableFullNames,用于返回表达式原始的变量名列表, see #21
  • 支持引用变量(quote variable),用于使用深度嵌套的变量,例如 #a.b[0].c,变量名要求以 # 开始, see #19

Maven 使用:

 <dependency>
      <groupId>com.googlecode.aviator</groupId>
      <artifactId>aviator</artifactId>
      <version>3.1.0</version>
  </dependency>

或下载二进制文件。

aviatorscript - Aviator 3.0.1 发布

Published by killme2008 almost 8 years ago

主要变更:

  • 数组访问支持方法调用结果或者表达式结果,参考 #15
aviatorscript - 3.0.0 发布

Published by killme2008 almost 8 years ago

改进如下:

 public abstract AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args);
  • 增加内置函数: math.round 等同于 Math.round 方法,以及 rand(n) 用于产生一个 [0-n) 之间的整数。
  • 改进了 rand 函数实现,更安全和高效。
  • AviatorObject 增加 boolean isNull(Map<String, Object> env) 用于判断运行时值是否为 null。
aviatorscript - 2.3.7 发布

Published by killme2008 almost 8 years ago

  • 修复超过 20 个参数的 AviatorFunction 调用失败,参考 #12
aviatorscript - 2.3.6 发布

Published by killme2008 about 8 years ago

  • 修复表达式解析错误 #10
aviatorscript - 2.3.5 发布

Published by killme2008 about 8 years ago

  • 修复部分科学计数法数字解析错误。
aviatorscript - 2.3.4 发布

Published by killme2008 about 8 years ago

  • 重构所有配置选项,引入 Options 枚举类型,增加方法 AviatorEvaluator.setOption 用于设置各种选项:
AviatorEvaluator.setOption(Options.TRACE, true);
AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.COMPILE);
  • 不再兼容 JDK 1.5,要求至少使用 JDK 1.6 版本,生成的字节码版本也是 1.6 。
  • 引入一个新选项 ALWAYS_USE_DOUBLE_AS_DECIMAL,如果设置为 true,那么所有表达式中的浮点数 literal 都将解析为 BigDecimal。用户自行传入的变量仍然需要自行保证。
aviatorscript - 2.3.3 发布

Published by killme2008 about 10 years ago

  • 修复非缓存表达式模式下 PermGen 内存泄露的 Bug。
  • 默认 AviatorEvaluator.execute(expr, env) 方法将不缓存 Expression。

Maven 引用:

<dependency>
      <groupId>com.googlecode.aviator</groupId>
      <artifactId>aviator</artifactId>
      <version>2.3.3</version>
  </dependency>