Skip to content

脚本语言

本插件采用两种脚本语言,分别是基于 NashornJavaScript,和 Groovy,使用者可以自由选择,甚至是相互调用

信息

插件中的高级扩展功能只能通过 Groovy 实现,Groovy 要强大很多

语言区别

JavaScript 依赖其他框架,并非传统字节码,不是原生 JVM 语言,但更容易上手

Groovy 是标准的 JVM 语言,和 Java 看上去很像,可以无缝调用 Java 类、继承、异常、泛型等,且支持一些 Java 没有的语法糖,但是我觉得这个语言有些设计非常邪门(所以学习成本略高)

Groovy 才是真是的 Java Script(直译)!

性能对比

Oracle OpenJDK 1.8.0_381 环境下,执行 每轮 1,000,000 次整数累加,以原生 Java 性能为基准(100%),5 次运行结果如下:

轮数Groovy (动态)Groovy (静态)Nashorn (预编译)Nashorn
10 轮2% 左右91% ~ 96%46% ~ 58%48% ~ 59%
30 轮2% 左右84% ~ 95%46% 左右49% 左右
100 轮2% 左右92% ~ 97%46% 左右49% 左右
1000 轮2% 左右96% ~ 99%48% 左右50% 左右

提示

所有引擎均经过 20 轮统一预热,测试代码均为独立方法,确保 JIT 优化条件公平。
⚠️ 本测试仅包含简单整数累加,不代表复杂业务性能

Groovy (动态) 性能极差,严禁用于性能敏感场景

Groovy 动态和静态的编写

加一个 @groovy.transform.CompileStatic 即可表示为静态

groovy
import groovy.transform.CompileStatic //注意需要导入

@CompileStatic
class Test {
    ...
}

不加则是动态

groovy
class Test {
    ...
}

已知BUG

Nashorn 可能存在不可修复的内存泄露问题,具体表现为越重载越卡,不重载则没问题

Groovy 在高版本 Bukkit 中使用 CommandSender#sendMessage(String message) 时无法编译,推测是高版本 Bukkit API 使用了更加复杂的泛型等复杂机制导致 Groovy 无法检测参数类型,可去掉 @CompileStatic 或使用 "${''}原字符串" 解决。