Aria 语言介绍

Aria 是什么

Aria 是 JVM 上的轻量嵌入式脚本引擎。

  • 自有 KISS 语法(无分号、无 new、箭头函数、dot 前缀变量)
  • 内置 JavaScript 兼容解析器(ES5.1 大部分 + ES6 class/箭头函数/模板字符串)
  • ASM JIT 运行时异步编译
  • 适用于:游戏脚本、配置热更新、业务逻辑插件。

技术栈基于 Java 17,使用 ASM 9.6 进行字节码生成(JIT 编译),Gradle 构建,JMH 基准测试。

设计理念

KISS — 简单、直接、不过度设计。

  • 没有分号,换行即语句结束
  • 没有访问修饰符,没有接口,没有抽象类
  • 变量声明不需要关键字,通过 dot 前缀自然分发语义
  • 函数只有一种形式:-> {}

核心特点

dot 前缀变量系统

varvalglobalserverclient 不是关键字,而是普通标识符,通过 . 运算符分发到不同的存储层:

var.x = 10          // 局部可变
val.PI = 3.14       // 局部不可变
global.score = 0    // 全局共享,线程安全
server.config        // 读取触发 listener
client.name = 'A'   // 写入触发 listener

箭头函数

所有函数使用 -> {} 语法定义,参数通过 args 访问,函数是一等公民:

var.add = -> {
    return args[0] + args[1]
}
print(add(3, 4))    // 7

类系统

单继承,类体内用 var.xxx / val.xxx 声明字段,name = -> {} 定义方法:

class Animal {
    var.name = 'unknown'
    var.age = 0

    new = -> {
        self.name = args[0]
        self.age = args[1]
    }

    speak = -> {
        return self.name + ' says hello'
    }
}

Java 互操作

通过 use() 函数直接访问 JVM 类:

val.HashMap = use('java.util.HashMap')
val.map = HashMap()
val.System = use('java.lang.System')
System.out.println('hello from aria')

JS 兼容模式

Aria 内置了的 JavaScript 兼容解析器,.js 文件自动识别。支持 var/let/constfunction、箭头函数、class/extends/constructornewfor-ofdo-whileswitch/defaulttry/catch/finallytypeof++/--、模板字符串、?.?? 等 ES6+ 语法。

JS 代码被转换为 Aria AST 后共享同一套 IR/VM/JIT 管线:

function greet(name) {
    return `Hello, ${name}!`;
}
console.log(greet('Aria'));  // Hello, Aria!

语义映射:thisselfnullnone=====continuenext。详见 13-javascript-compat

技术架构

flowchart LR
    A[源代码] --> B[Lexer
词法分析] B --> C[Parser
语法分析] C --> D[Compiler
编译] D --> E[IR
中间表示] E --> F[VM + JIT]
  • Lexer:将源代码拆分为 Token 流
  • Parser:将 Token 流构建为 AST
  • Compiler:将 AST 编译为 IR 指令
  • VM:解释执行 IR 指令
  • JIT:通过 ASM 将热点路径编译为 JVM 字节码

快速上手

Hello World

print('Hello, Aria!')

变量

var.name = 'World'
val.PI = 3.14159
var.msg = "Hello, {name}!"
print(msg)

函数

var.greet = -> {
    return 'Hello, ' + args[0] + '!'
}
print(greet('Aria'))    // Hello, Aria!

class Dog extends Animal {
    var.breed = 'unknown'

    new = -> {
        super(args[0], args[1])
        self.breed = args[2]
    }

    speak = -> {
        return self.name + ' barks!'
    }
}

val.dog = Dog('Rex', 3, 'Labrador')
print(dog.speak())           // Rex barks!

与其他 JVM 脚本语言的定位对比

JVM 生态中有许多优秀的脚本引擎,各有所长。Groovy 是功能最完整的 JVM 脚本语言,拥有成熟的生态和强大的元编程能力;Nashorn 曾是 JDK 内置的高性能 JS 引擎,其整函数 JIT 编译技术非常出色;Rhino 作为最早的 JVM JS 引擎,至今仍在许多项目中稳定服务。

Aria 并不试图替代它们,而是在”轻量嵌入”这个细分场景下提供另一种选择:

特性AriaGroovyNashornRhino
定位轻量嵌入式脚本通用 JVM 语言JS 引擎JS 引擎
语法风格自有语法 + JS 兼容双模式类 Java/Ruby 混合ECMAScript 5.1ECMAScript
JS 兼容内置 ES6+ 解析器原生 JS原生 JS
变量系统dot 前缀(5 种命名空间)def/varvar/let/constvar
函数语法-> {} 统一形式闭包 { -> }functionfunction
类系统单继承,无修饰符完整 OOP原型链原型链
Java 互操作use()原生无缝Java.type()java.xxx
JIT 编译ASM 字节码Groovy 编译器整函数编译
启动开销轻量较重中等较重
维护状态活跃开发活跃JDK 15 后移除社区维护