LenoLang:一门带静态类型检查的脚本语言
"Leno 诞生于对编程语言设计的热爱与探索,虽非完美,但乐在其中。"
一、语言定位
LenoLang 是一门带静态类型检查的脚本语言,定位介于 Python(纯动态)和 Go(纯静态)之间。它试图在开发效率和运行时安全之间找到一个平衡点:既保留脚本语言的灵活性和简洁语法,又通过编译期类型检查提前捕获错误。
二、核心设计亮点
1. 双层 int 设计:零开销的任意精度整数
Leno 的 int 采用巧妙的双层存储策略:
-
int48(48 位内联存储):值在 ±140 万亿范围内时,直接内联在 Value 中,性能极高,零开销
-
BigInt(自动升级):超出范围时自动切换到堆分配的 BigInt,精度无上限
leno
var a = 42 // int48,零开销
var b = 100000000000000000000 // 自动升级为 BigInt
print(type(a)) // "int"
print(type(b)) // "int" —— 对外完全透明
2. 渐进式类型系统
Leno 不强迫你在"全动态"和"全静态"之间二选一:
表格
| 局部变量 | var x = 10 | 编译器自动推断为 int |
| 函数参数 | func add(int a, int b) | 编译期严格检查 |
| 函数返回 | func sum():int | 调用者无需转换 |
| 不确定类型 | var x / func test(var x) | 运行时灵活处理 |
关键规则:var 在变量声明时是"推断模式",在函数参数中是"动态模式"(any),两者含义完全不同。
3. 零摩擦 FFI
Leno 的 FFI 设计非常有特色,特别是 clib 声明式调用:
leno
clib msvcrt {
i32 strlen(str8 s)
f64 pow(f64 base, f64 exp)
str8 strerror(i32 errnum)
}
msvcrt lib = ffi.load("msvcrt.dll")
int len = lib.strlen("hello") // i32 → int,自动展开
float p = lib.pow(2.0, 10.0) // f64 → float,自动展开
string msg = lib.strerror(2) // str8 → string,自动转换
设计哲学:"C 的窄类型是 ABI 约束,Leno 的 int 是数学约束。ABI 在调用边界处理,数学在语言内部处理。"
三、语言特性速览
控制流
leno
// for 循环:包含结束值用冒号
for 0:5 to i { print(i) } // 0 1 2 3 4 5
for 5:0 to i { print(i) } // 5 4 3 2 1 0(自动倒序)
// 数组/字典/字符串遍历
for arr to item, index { }
for dict to key, value { }
for str to char, index { }
// switch 支持类型匹配
switch x {
case is int { }
case is string { }
case 0, 1, 2 { }
default { }
}
面向对象的 Struct
leno
struct Point {
int x = 0
int y = 0
func distance_to(Point other):float {
int dx = other.x – x
int dy = other.y – y
return maths.sqrt(dx * dx + dy * dy)
}
}
var p = new Point(x = 3, y = 4)
print(p.distance_to(new Point())) // 5.0
函数是一等公民
leno
func make_adder(int n) {
return func(int x) { return x + n } // 闭包
}
var add5 = make_adder(5)
print(add5(10)) // 15
四、密码学示例:语言的表达能力
Leno 在 examples/crypto/ 下提供了一套纯 Leno 实现的密码学算法,充分展示了语言的位运算和算法表达能力:
表格
| AES-128 | 对称块加密 | 完整实现 SubBytes/ShiftRows/MixColumns/AddRoundKey |
| ChaCha20 | 对称流加密 | TLS 1.3 标准算法 |
| SHA-256 / HMAC-SHA256 | 哈希/MAC | 目前仍安全的哈希算法 |
| RSA | 非对称加密 | 含 Miller-Rabin 素性测试 |
| PBKDF2 | 密钥派生 | 基于 HMAC-SHA256 |
| TEA / XTEA | 轻量块加密 | 微型 Feistel 网络 |
| 凯撒/维吉尼亚/仿射 | 古典密码 | 含频率分析破译 |
这些实现依赖 Leno 的 _int32() / _uint32() 固定位宽函数来处理加密算法中的 32 位环绕运算:
leno
// TEA 加密中的 32 位环绕
sum = _int32(sum + DELTA)
// MD5 的 F 函数
_int32((_uint32(x) & _uint32(y)) | (_uint32(~x) & _uint32(z)))
五、模块生态
Leno 内置了常用标准库:
表格
| ffi | 调用 C 动态库、内存操作 |
| asyncs | async/await 异步编程 |
| maths | 数学函数(sin/cos/sqrt/pow 等) |
| rands | 随机数生成 |
| files / dirs | 文件和目录操作 |
| jsons | JSON 编解码 |
| sockets | TCP 网络连接 |
| strings | 字符串工具(reverse/find/byte/char 等) |
项目地址:https://gitee.com/cheng8214/LenoLang

