# ks
**Repository Path**: lbgf/ks
## Basic Information
- **Project Name**: ks
- **Description**: 基于jvm的可用中文编写的脚本语言(中文:赤子脚本语言、英文:kid script),也可扩展第三方语系
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 22
- **Forks**: 3
- **Created**: 2021-10-15
- **Last Updated**: 2024-11-14
## Categories & Tags
**Categories**: scripting-language
**Tags**: 脚本引擎, 字节码, 脚本语言
## README
# ks
#### 介绍
基于jvm的可用中文编写的脚本语言(中文:赤子脚本语言、英文:kid script),也可扩展第三方语系(demo中有一个扩展日语的例子) [快速体验](#setup目录说明)
#### 版本
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](#demo目录说明)
#### 使用说明
脚本引擎的执行方式分解释(DV)和编译(BC)两种,其中BC会生成java字节码,默认使用解释执行;
DV的使用:
1. KsRunner第二个参数是扩展语言,具体使用参考例子
```
String code = "ks脚本代码";
KsRunner kr = new KsRunner(code, null);
kr.exec();
```
BC的使用:
1. KsRunner第二个参数是扩展语言,具体使用参考例子
2. KsRunner第三个参数是脚本名称,生成的字节码会以(Script+脚本名称)的类名进行加载,例如:脚本名称为test1,脚本里面还定义了一个叫“动物”的类,那么它实际上生成了两个类,名称如下图所示

3. 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模式 |
| // |
单行注释 |
√ |
√ |
| /* */ |
块注释 |
√ |
√ |
| " " |
单行字符串 |
√ |
√ |
""" """ |
多行字符串 |
√ |
√ |
#### demo目录说明
>|-- src
>>|-- demo
>>>|-- astview (一个可以查看语法树的工具),如下图

>>>|-- bc (以BC模式运行的例子)
>>>|-- dv (以DV模式运行的例子)
>>>|-- extfunc (扩展内置函数的例子)
>>>|-- language (扩展语系的例子,里面是一个日语的demo)
>>>|-- perf (性能测试,主要执行1亿次加法运算,里面有三种不同情况的测试,分别是DV模式,BC模式,BC定义值类型模式)
#### setup目录说明
为了方便使用打了个压缩包([ks.zip](https://gitee.com/lbgf/ks/tree/master/setup)),解压后可以直接在windows运行,可以作为命令行使用,如下图

#### 特别的工具
可以关注一下它相关的另一个项目,主要为ks设计的可视化编辑器([ks_ide](https://gitee.com/lbgf/ks_ide)),如下图

#### 运行异常处理
jdk1.6开始多了一个字节码校验的环节,在使用BC模式生成字节码运行时有可能出现VerifyError错误,ks的引擎已经处理过stack map frame,但如果运行中依然报java.lang.VerifyError,可以加入vm参数-noverify禁用这个功能
#### 参考资料