自研编程语言Zyrnal:纯瞎折腾的通用脚本语言

它核心就是个我闲得慌写的通用静态类型脚本语言,只是后来顺手加了些神经网络相关的数学库当扩展功能,绝非主打方向。重新跟你唠唠这个纯个人瞎折腾的产物,不管是挑错、吐槽,还是说我“闲得造轮子”,都随便说~

一、为啥造Zyrnal?核心就仨原因

  1. 日常写业务代码写腻了,想自己造个顺手的通用脚本语言,兼顾静态类型的安全和脚本的易用性;
  2. 学了点编译器、内存管理的知识,想落地练练手,验证下自己的理解;
  3. 纯解闷,没有任何“对标某语言”“做产品”的想法,就是自己玩。

至于神经网络相关的功能,纯属后期加的“彩蛋”——写完核心语法后,想着加个数学库试试水,就顺手做了些矩阵、激活函数相关的实现,压根不是造这个语言的初衷。

二、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 为绿色免安装单文件程序,无任何运行时依赖
  • 下载与重命名:
    1. 下载程序包
      链接:https://pan.quark.cn/s/3bdb97779f6a
      提取码:R9cA;
    2. 解压后将主程序重命名为 zyrnal.exe(方便命令行调用);
    3. 建议放到独立目录(如 D:\Zyrnal),便于管理脚本文件。

2. 验证程序可用性

  1. 打开「命令提示符(CMD)」或「PowerShell」;
  2. 切换到 zyrnal.exe 所在目录(示例路径):
    cd D:\Zyrnal
    
  3. 执行版本检查命令,验证程序正常:
    .\zyrnal.exe --version
    
    正常输出示例:Zyrnal 0.1.0

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. 运行本地脚本文件(实际开发场景)

  1. 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
    }
    
  2. 在CMD/PowerShell中执行该脚本:
    .\zyrnal.exe run demo.zrn
    
    输出结果:
    数组平均值 = 4.0
    向量点积 = 26.0
    

3.更多示例请看:https://pan.quark.cn/s/5e2928c1afbb

5. 运行神经网络示例脚本

神经网络功能仅为扩展,需下载配套示例文件运行:

  1. 下载 neural_network.zrnD:\Zyrnal 目录;
  2. 执行命令:
    .\zyrnal.exe run neural_network.zrn
    
  3. 输出示例(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. 短期(1-2个月):补全通用功能(多行数组、泛型关联类型、Windows路径/编码适配);
  2. 中期(3-6个月):优化VM执行性能、完善异步IO稳定性;
  3. 长期(随缘):若有精力,补充数学库优化(如Adam优化器),但核心仍聚焦通用脚本语言。

八、求吐槽、求建议!

如果你觉得通用语法设计反人类、exe运行有兼容性问题,或者觉得“造这玩意不如直接用Python/Go”,都欢迎吐槽——哪怕纯骂我闲得慌,我也听着。

说到底,造这个语言就是图个乐,把学的编译器、内存管理知识落地一遍,哪怕最后就我自己偶尔用它写个小工具,也算是圆了刚学编程时的小念想~

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐