Tnze Programming Language
本项目设计了一种实验性的脚本语言,主要用途是在各种应用程序中作为嵌入式解释器,提供通过自定义脚本调用内部API的功能。
简单来说,就是语法更加现代化的 Lua 语言
语言的设计目标
- 简单易学,没有令人望而却步的各种符号
- 拥有现代化的语法,表达能力强、不罗嗦
- 提供优秀的语言交互接口(FFI)
- 提供“全局异步支持”,所有函数都是异步函数
- 所有设计均符合现代程序员的编程习惯,不搞特殊
- 提供官方的风格化指南,统一代码风格
语言的设计思路
- 提供优秀的类型系统,利于早期发现编程错误
- 脚本依赖宿主的接口都需要显式声明,容易检查宿主环境是否能运行当前脚本
- 函数是一等公民,能正确处理闭包等编程原语
- 基于类型擦除的泛型,作为解释型语言正合适
- 没有默认的“空值”,可能为空的值都需要套Option类型实现,从语法上杜绝空指针异常
- 包含各种常用的类型:
- 布尔值:
bool
- 无符号整数:
u8
,u16
,u32
,u64
,u128
,u256
,u512
- 有符号整数:
i8
,i16
,i32
,i64
,i128
,i256
,i512
- IEEE 754 浮点数:
f8
,f16
,f32
,f64
- 定长数组:
ary<N: usize, T: any>
- 不定长数组:
vec<T: any>
- 字符串:
string
,vec<u8>
- 映射表:
map<K, V>
- 迭代器:
iter<T>
- 积类型与和类型:
struct{}
,union{}
- 布尔值:
- 联合体自带标签,可以自行区分当前是哪一种变体
- 相对丰富的控制流关键字:
if
,for
,match
- 通过
for
关键字统一提供多种循环变体 - 非try-catch方案的错误处理
语言的实现要求
- 解释器易于在多种语言上实现,要提供Rust、Go、C、C#、JS等常见语言的解释器
- 解释器库要对宿主提供简单明了的接口,方便从宿主给脚本提供API
- 解释器能输出良好的错误信息,高效定位问题原因
- 内置模块功能,用于将代码划分为模块,利于项目代码解耦
- 至少能提供马马虎虎、勉勉强强的性能
语言的生态建设手段
- 提供完整的字符串操作工具
- 提供功能强大的官方标准库