Skip to content

脚本语言

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

信息

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

语言区别

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

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

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

性能区别

进行 1000 轮,每轮 1000000 次加算的相对 Java 性能(越高越好)
原生 Java: 100%
Groovy (动态): 2% ~ 3%,极差,非必要不建议用
Groovy (静态): 95% 左右,非常接近原生 Java
JDK 8 Nashorn (预编译): 55 ~ 60%,仅一半左右 Java 性能
JDK 8 Nashorn: 60%左右,仅一半左右 Java 性能

提示

测试前已充分预热 20
测试结果不代表真实性能,测试内容仅循环计算,结果仅供参考,结论自己斟酌

Groovy (动态)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 或使用 "${''}原字符串" 解决。