Skip to content

脚本语言 ​

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

信息

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

我强烈推荐使用 IntelliJ IDEA 编写 Groovy

语言区别 ​

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

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

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 ​

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

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