A Scripting Language on JVM

Aria

轻量、快速、优雅。

KISS 设计理念,自有语法与 JavaScript 双模式,ASM JIT 编译。

hello.aria

// dot 前缀变量 + 箭头函数

var.greet = -> {

return "Hello, " + args[0] + "!"

}

 

// Java 互操作

val.HashMap = use('java.util.HashMap')

val.map = HashMap()

map.put('msg', greet('Aria'))

 

print(map.get('msg')) // Hello, Aria!

Features

简单、直接、不过度设计

没有分号,没有访问修饰符,没有接口。只有你需要的。

dot 前缀变量

var、val、global、server、client — 五种命名空间通过 dot 前缀分发到不同存储层。

箭头函数

所有函数使用 -> {} 定义。一等公民,闭包捕获,高阶函数,统一而简洁。

JS 兼容模式

内置 ES6+ 解析器,.js 文件自动识别。共享同一套 IR / VM / JIT 管线。

ASM JIT

四种编译路径:整数特化、浮点循环、递归记忆化、标准路径。热点代码编译为 JVM 字节码。

Java 互操作

use() 加载 JVM 类,Java.extend() 实现接口,注解驱动注册,完整双向互操作。

轻量嵌入

一行代码执行脚本,沙箱安全控制,预编译例程复用,模块系统与增量编译。

Dual Syntax

两种语法,一个引擎

Aria 原生语法与 JavaScript 共享同一套编译管线。

Aria fibonacci.aria

var.fib = -> {

if (args[0] <= 1) {

return args[0]

}

return fib(args[0] - 1) + fib(args[0] - 2)

}

 

print(fib(10)) // 55

JavaScript fibonacci.js

function fib(n) {

if (n <= 1) {

return n;

}

return fib(n - 1) + fib(n - 2);

}

 

console.log(fib(10)); // 55

.js 文件自动识别 · this → self · null → none · === → == · continue → next

JMH Benchmark

性能参考

下面是 Aria 与同类 JVM 脚本引擎及 Java 原生的 JMH 实测数据(ms/op,越小越好)。

Workload Aria Rhino Nashorn Groovy GraalJS Java 原生
Loop Arithmetic 1M 0.231 ms 25.47 ms 14.46 ms 5.42 ms 79.78 ms 0.232 ms
Float Arithmetic 1M 1.85 ms 25.32 ms 14.04 ms 5.10 ms 84.73 ms 0.923 ms
String Concat 100K 0.782 ms 2.68 ms 1.97 ms 0.945 ms 8.43 ms 0.098 ms
Array/List Ops 10K 0.108 ms 0.363 ms 0.146 ms 0.056 ms 1.20 ms 0.041 ms
Object/Map Ops 10K 0.303 ms 1.44 ms 0.264 ms 0.678 ms 1.67 ms 0.243 ms
Branch Intensive 100K 0.082 ms 8.76 ms 6.19 ms 3.68 ms 9.97 ms 0.061 ms
Fibonacci(25) 0.184 ms 2.01 ms 0.633 ms 3.78 ms 13.10 ms 0.182 ms
Function Call 100K 1.61 ms 2.97 ms 1.45 ms 1.60 ms 11.37 ms ~0 ms

注:数值循环(Loop / Fibonacci)Aria 与 Java 原生持平;Branch / Object 接近。

注:Float / String 慢于 Java 原生 2-8×(IValue 包装开销),但仍快于同类脚本引擎。

注:Array/List Ops 10K Aria 0.108 ms:JIT hot path 跳过名称切分/scope 解析,命中后直接 INVOKEVIRTUAL ListValue.add,仅次于 Groovy。

注:Function Call 100K Java 原生的 x = x+1 100k 次被 C2 识别为常量消除,数据接近零;Aria 与 Nashorn / Groovy 处在同一量级。

注:GraalJS 在 OpenJDK 17 上以解释模式运行,用 GraalVM JDK 跑能显著提速。

注:Java Float Arithmetic 采用 double 循环变量;用 int 循环变量测得 2.80 ms。