基于jvm的可用中文编写的脚本语言(中文:赤子脚本语言、英文:kid script),也可扩展第三方语系(demo中有一个扩展日语的例子) 快速体验
v0.7.26
jdk1.8
1.简单的例子
变量1 = 1;
变量2 = 变量1 + 3;
变量3 = "结果是:" + 变量2; // 注释
打印 变量3;
2.自定义类
类 动物 {
脚数 = 0;
函数 输出脚数() {
返回 this.脚数;
}
}
猫1 = 创建 动物();
猫1.脚数 = 4;
打印 "猫一共有" + 猫1.输出脚数() + "条腿!";
3.与java结合使用
导入 java.lang.System;
导入 java.util.ArrayList;
变量 列表1 = 创建 ArrayList();
列表1.add("1");
打印 列表1.size();
System.out.println(列表1.size());
4.扩展个性化的语言(下面是一个日语的例子,参考demo中的language目录)
クラス クラス1 {
機能 テスト() {
印刷 "クラス1-->ccccc";
}
}
変数 オブジェクト1 = 新しい クラス1();
オブジェクト1.テスト();
在demo/perf目录下有三个不同情况的测试用例,主要是执行1亿次加法运算,以i7的8代cpu为准,DV模式执行时间大概10秒,BC模式执行时间大概0.8秒,BC定义值类型模式执行时间大概0.2秒;具体跳转 demo
脚本引擎的执行方式分解释(DV)和编译(BC)两种,其中BC会生成java字节码,默认使用解释执行;
DV的使用:
- KsRunner第二个参数是扩展语言,具体使用参考例子
String code = "ks脚本代码";
KsRunner kr = new KsRunner(code, null);
kr.exec();
BC的使用:
- KsRunner第二个参数是扩展语言,具体使用参考例子
- KsRunner第三个参数是脚本名称,生成的字节码会以(Script+脚本名称)的类名进行加载,例如:脚本名称为test1,脚本里面还定义了一个叫“动物”的类,那么它实际上生成了两个类,名称如下图所示
- KsRunner第四个参数是保存路径,把生成的字节码文件保存指定的目录内(注:为null时不保存,保存了也只用于查看和调试,脚本执行时不需要这些文件)
String code = "ks脚本代码";
KsRunner kr = new KsRunner(code, null, "脚本名称", null);
kr.exec();
支持关键字
关键字(英) | 关键字(中) | 说明 | DV模式 | BC模式 |
---|---|---|---|---|
import | 导入 | 导入java类,不支持* | √ | √ |
include | 包含 | 包括其他ks脚本 | √ | √ |
var | 变量 | 变量定义 | √ | √ |
if...else | 如果...否则 | 条件判断 | √ | √ |
while | 迭代 | while循环 | √ | √ |
for | 循环 | for循环 | √ | √ |
break | 中断 | 中断当前循环 | √ | √ |
continue | 继续 | 回头循环开头继续执行 | √ | √ |
class | 类 | 实现类和对象功能 | √ | √ |
return | 返回 | 返回和中断方法或程序 | √ | √ |
switch...case | 开关...门锁 | 条件分支判断 | √ | × |
function | 函数 | 实现函数功能 | √ | √ |
extends | 扩展 | 继承并扩展新的类 (注:不能继承java原生类) |
√ | × |
closure | 闭包 | 闭包 | √ | × |
try...catch...finally | 异常监控...捕获...收尾 | 异常处理 | √ | × |
运算符
运算符 | 说明 | DV模式 | BC模式 |
---|---|---|---|
= | 赋值 | √ | √ |
== | 两边相等 | √ | √ |
!= | 两边不等 | √ | √ |
> | 大于 | √ | √ |
< | 小于 | √ | √ |
>= | 大于等于 | √ | √ |
<= | 小于等于 | √ | √ |
+ | 加 | √ | √ |
一 | 减 | √ | √ |
* | 乘 | √ | √ |
/ | 除 | √ | √ |
% | 取模 | √ | √ |
! | 非 | √ | √ |
|| | 或 | √ | √ |
&& | 与 | √ | √ |
<=> | 归属 | √ | √ |
基础数据类型
类型 | 说明 | DV模式 | BC模式 |
---|---|---|---|
int | 整型 | √ | √ |
long | 长整型 | √ | √ |
float | 小数型 | √ | √ |
double | 双精小数型 | √ | √ |
boolean | 布尔型 | √ | √ |
外部变量
DV模式 | BC模式 |
---|---|
√ | √ |
数组
DV模式 | BC模式 |
---|---|
√ | √ |
三元表达式
DV模式 | BC模式 |
---|---|
√ | √ |
其它
标记 | 说明 | DV模式 | BC模式 |
---|---|---|---|
// | 单行注释 | √ | √ |
/* */ | 块注释 | √ | √ |
" " | 单行字符串 | √ | √ |
""" """ |
多行字符串 | √ | √ |
|-- src
|-- demo
|-- astview (一个可以查看语法树的工具),如下图
|-- bc (以BC模式运行的例子)
|-- dv (以DV模式运行的例子)
|-- extfunc (扩展内置函数的例子)
|-- language (扩展语系的例子,里面是一个日语的demo)
|-- perf (性能测试,主要执行1亿次加法运算,里面有三种不同情况的测试,分别是DV模式,BC模式,BC定义值类型模式)
为了方便使用打了个压缩包(ks.zip),解压后可以直接在windows运行,可以作为命令行使用,如下图
也可以关注一下它的另一个项目,可视化编辑器(ks_ide),如下图
jdk1.6开始多了一个字节码校验的环节,在使用BC模式生成字节码运行时有可能出现VerifyError错误,ks的引擎已经处理过stack map frame,但如果运行中依然报java.lang.VerifyError,可以加入vm参数-noverify禁用这个功能
http://www.groovy-lang.org
https://github.com/chibash
https://asm.ow2.io
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html