自研编程语言Zyrnal
·

自研编程语言Zyrnal:纯瞎折腾的通用脚本语言
它核心就是个我闲得慌写的通用静态类型脚本语言,只是后来顺手加了些神经网络相关的数学库当扩展功能,绝非主打方向。重新跟你唠唠这个纯个人瞎折腾的产物,不管是挑错、吐槽,还是说我“闲得造轮子”,都随便说~
一、为啥造Zyrnal?核心就仨原因
- 日常写业务代码写腻了,想自己造个顺手的通用脚本语言,兼顾静态类型的安全和脚本的易用性;
- 学了点编译器、内存管理的知识,想落地练练手,验证下自己的理解;
- 纯解闷,没有任何“对标某语言”“做产品”的想法,就是自己玩。
至于神经网络相关的功能,纯属后期加的“彩蛋”——写完核心语法后,想着加个数学库试试水,就顺手做了些矩阵、激活函数相关的实现,压根不是造这个语言的初衷。
二、Zyrnal核心定位:通用静态类型脚本语言
先明确它的核心能力,神经网络只是附加项,核心是通用编程:
| 特性方向 | 核心能力 | 完成度 |
|---|---|---|
| 基础能力 | 模块系统、全局变量、REPL交互式解释器 | 100% |
| 内存安全 | Region内存管理、借用检查、Use-after-move检测 | 100% |
| 工程化 | 代码格式化、包管理、文档生成、测试框架 | 100% |
| 高级特性 | async/await异步运行时、宏系统(声明式+过程式) | 100% |
| 扩展能力 | 数学库(含神经网络相关函数) | 100% |
简单说,它能做普通脚本语言能做的大部分事:写命令行工具、处理网络请求、做文件IO,神经网络只是其中一个小分支功能。
三、语法示例:主打“通用、易上手”
语法借鉴了Rust、Go、Python,核心是通用编程,先看基础用法,神经网络功能放最后:
1. 基础变量与函数(通用场景)
// 不可变变量(默认)
let pi = 3.14159
// 常量
const MAX_NUM = 100
// 可变变量
mut count = 0
// 函数定义(proc是过程函数关键字)
int proc add(a: int, b: int) {
return a + b
}
// 主函数(程序入口)
void proc main() {
count = add(1, 2)
println("1+2={}", count) // 输出:1+2=3
}
2. 模块系统(组织通用代码)
// 定义模块
mod utils {
// pub表示对外可见
pub string proc format_str(s: string, num: int) {
return s + ": " + num.to_string()
}
}
// 导入模块
use utils::format_str
void proc main() {
println(format_str("计数", 5)) // 输出:计数: 5
}
3. 异步编程(通用高级特性)
async void proc async_sleep(ms: int) {
await async_delay(ms);
println("等待{}毫秒完成", ms);
}
void proc main() {
let f1 = async_sleep(100);
let f2 = async_sleep(200);
await_all(f1, f2); // 并行等待两个异步任务
}
4. 神经网络相关功能(仅作为扩展)
这部分只是附加的数学库功能,不是核心:
void proc main() {
// 向量点积(数学库基础功能)
let a = [1.0, 2.0, 3.0]
let b = [4.0, 5.0, 6.0]
println(dot_product(a, b)) // 输出:32.0
// Sigmoid激活函数(扩展功能)
println(sigmoid(0.5)) // 输出:0.622...
}
四、底层架构:通用脚本语言的四层结构
架构完全是按通用语言设计的,神经网络功能只是标准库的一个分支:
1. 前端:解析与类型检查
- 词法/语法解析(通用AST生成);
- 名称解析(处理模块、变量作用域);
- 静态类型校验(泛型、Trait约束);
- 内存安全检查(参考Rust简化版规则)。
2. 中端:优化与字节码生成
- 通用优化(常量折叠、死代码消除);
- 生成自定义栈式字节码。
3. 后端:虚拟机执行
- 通用栈式VM(支持所有基础类型、控制流);
- 异步运行时(通用IO、网络异步处理);
- 标准库调用(数学、网络、文件等)。
4. 标准库层
- 基础库:字符串、集合、IO、网络(TCP/UDP/HTTP);
- 扩展库:正则、线程、JSON;
- 可选扩展:数学库(含少量神经网络相关函数)。
整体流程:
源码 → 词法解析 → 语法解析 → 类型检查 → 字节码生成 → VM执行
↓
标准库调用(通用/扩展功能)
五、怎么上手?5分钟跑通通用示例
Zyrnal 仅支持 Windows X64 系统,无需编译(仅提供打包好的 zyrnal.exe 单文件可执行程序),直接下载运行即可:
1. 环境准备
- 系统要求:Windows 10/11 64位(X64)
- 无需安装依赖:
zyrnal.exe为绿色免安装单文件程序,无任何运行时依赖 - 下载与重命名:
- 下载程序包
链接:https://pan.quark.cn/s/3bdb97779f6a
提取码:R9cA; - 解压后将主程序重命名为
zyrnal.exe(方便命令行调用); - 建议放到独立目录(如
D:\Zyrnal),便于管理脚本文件。
- 下载程序包
2. 验证程序可用性
- 打开「命令提示符(CMD)」或「PowerShell」;
- 切换到
zyrnal.exe所在目录(示例路径):cd D:\Zyrnal - 执行版本检查命令,验证程序正常:
正常输出示例:Zyrnal 0.1.0.\zyrnal.exe --version
3. 运行REPL交互式示例(快速测试)
REPL支持实时输入、执行Zyrnal代码,适合验证语法/功能:
# 启动交互式解释器
.\zyrnal.exe repl
# 进入REPL后,逐行输入以下代码(即时执行)
let str = "Zyrnal"
println("Hello, {}", str) # 输出:Hello, Zyrnal
# 测试基础运算
let num = add(15, 25)
println("15+25={}", num) # 输出:15+25=40
# 测试神经网络扩展函数
println(sigmoid(0.8)) # 输出:0.689...
# 退出REPL:输入 exit 或按 Ctrl+C
exit
4. 运行本地脚本文件(实际开发场景)
- 在
D:\Zyrnal目录下新建文本文件,命名为demo.zrn,写入以下代码:// 通用脚本示例:模块+数组运算+格式化 mod utils { pub string proc format_result(s: string, val: float) { return s + " = " + val.to_string() } } use utils::format_result void proc main() { // 通用数组运算 let arr = [1.0, 3.0, 5.0, 7.0] let mean_val = array_mean(arr) println(format_result("数组平均值", mean_val)) // 输出:数组平均值 = 4.0 // 神经网络扩展功能(仅演示) let vec1 = [2.0, 4.0] let vec2 = [3.0, 5.0] println(format_result("向量点积", dot_product(vec1, vec2))) // 输出:向量点积 = 26.0 } - 在CMD/PowerShell中执行该脚本:
输出结果:.\zyrnal.exe run demo.zrn数组平均值 = 4.0 向量点积 = 26.0
3.更多示例请看:https://pan.quark.cn/s/5e2928c1afbb
5. 运行神经网络示例脚本
神经网络功能仅为扩展,需下载配套示例文件运行:
- 下载
neural_network.zrn到D:\Zyrnal目录; - 执行命令:
.\zyrnal.exe run neural_network.zrn - 输出示例(XOR神经网络训练结果):
======================================== Zyrnal 神经网络示例 - XOR 问题 ======================================== 创建神经网络架构: 输入层: 2 个神经元 隐藏层: 4 个神经元 输出层: 1 个神经元 学习率: 0.5 开始训练神经网络... Epoch 0 - 平均损失: 0.25 Epoch 100 - 平均损失: 0.12 ... 训练完成! ======================================== 测试结果 ======================================== 输入: [0.0, 0.0] -> 预测: 0.05 (期望: 0.0) ✓ 输入: [0.0, 1.0] -> 预测: 0.94 (期望: 1.0) ✓ 输入: [1.0, 0.0] -> 预测: 0.93 (期望: 1.0) ✓ 输入: [1.0, 1.0] -> 预测: 0.08 (期望: 0.0) ✓
6. 常用命令速查
| 命令 | 作用 | 示例 |
|---|---|---|
zyrnal.exe --version |
查看程序版本 | .\zyrnal.exe --version |
zyrnal.exe repl |
启动交互式解释器 | .\zyrnal.exe repl |
zyrnal.exe run <文件> |
运行本地脚本 | .\zyrnal.exe run demo.zrn |
zyrnal.exe fmt <文件> |
格式化代码 | .\zyrnal.exe fmt demo.zrn |
zyrnal.exe test <文件> |
运行脚本内测试用例 | .\zyrnal.exe test demo.zrn |
六、自曝缺点:通用语言的坑比扩展功能多
既然是个人瞎写的,毛病肯定不少,先聊通用层面的问题,再提扩展功能的问题:
1. 通用语法/功能限制
- 多行数组字面量暂不支持,只能写一行;
- 宏系统的过程宏扩展能力有限;
- 泛型关联类型没做,太复杂懒得搞;
- 仅适配Windows X64,无其他系统/架构支持。
2. 性能问题(通用层面)
- VM是单线程的,没法多核并行;
- 字节码执行效率比成熟脚本语言(Python/Lua)低;
- 网络IO的异步处理没做深度优化。
3. 扩展功能(神经网络)的问题
- 矩阵乘法是基础实现(O(n³)),没做Strassen算法等优化;
- 只支持基础感知器/多层感知器,CNN/RNN等复杂模型未实现;
- 数学库的神经网络函数仅够演示,无工业级落地能力。
七、后续打算:先完善通用能力,再随缘扩展
完全按个人兴趣迭代,优先级很明确:
- 短期(1-2个月):补全通用功能(多行数组、泛型关联类型、Windows路径/编码适配);
- 中期(3-6个月):优化VM执行性能、完善异步IO稳定性;
- 长期(随缘):若有精力,补充数学库优化(如Adam优化器),但核心仍聚焦通用脚本语言。
八、求吐槽、求建议!
如果你觉得通用语法设计反人类、exe运行有兼容性问题,或者觉得“造这玩意不如直接用Python/Go”,都欢迎吐槽——哪怕纯骂我闲得慌,我也听着。
说到底,造这个语言就是图个乐,把学的编译器、内存管理知识落地一遍,哪怕最后就我自己偶尔用它写个小工具,也算是圆了刚学编程时的小念想~
更多推荐




所有评论(0)