基于行的显式类型脚本语言,由 NSI(NoethingScript Interpreter,TypeScript 编写的解释器)运行。
A line-based, explicit-type scripting language, powered by the NSI interpreter (written in TypeScript).
- 显式声明:变量必须声明作用域(
global/local)与数据类型(number/int/float/string/bool/array);声明初始化只允许字面量表达式(禁止引用变量) - 流程控制:
if/else、for(C 风格,循环变量只读)、while、switch、break/continue - 函数:形参、返回值变量、
return即时返回;支持mut可变引用参数与copy深拷贝 - 数组:定长声明、
arrfill填充、len()长度;四种传参模式(只读引用/副本/字面量/可变引用mut),整体赋值引用共享,只读视图写保护 - 异常处理:
try/catch可捕获全部错误类型(SyntaxError/TypeError/ReferenceError/RangeError/AssertionError/循环初始化/循环更新错误等) - 内置对象:
Math(sin/cos/tan/sqrt/abs/pow/floor/ceil/round/max/min/random)、len/str/int/float/copy/input(运行时输入,命令行读 stdin、浏览器默认 prompt 弹窗且可自定义绑定;浏览器交互模式支持挂起/恢复,供脚本自持主循环) - 进制字面量:二进制
0b、八进制0o、十六进制0x - 调试控制:
debug级别调节输出详细程度 - 模块系统:
use声明式激活跨文件模块(modules ... endmodules头部块、三分类来源目录、call 对象.函数()点分调用、模块私有命名空间与来源标识、autoinit初始化、加载期错误不可捕获);自带模块管理器 nsm(install/update/upgrade/check-update/check-upgrade/refresh/list/search/remove,仓库清单缓存 TTL 7 天、依赖递归安装、镜像自动回退——官方模块仓库已建立(GitHubLinuxMint-User/NoethingScriptModules主 + Giteeepix-xhan/NoethingScriptModules镜像),内置默认双镜像按序回退,--repo临时覆盖、nsm -- init一键生成.nsm-mirrors.json持久配置)与打包工具 nsmp(pack <包目录>扫描自动生成 manifest 并打 zip、gen-catalog <packages目录>自动汇总生成仓库清单);解释器自更新:--check-upgrade检查官方仓库新版本、--upgrade自动拉取源码重新编译(GitHub 主/Gitee 镜像写死按序回退,失败自动恢复备份回滚);完整设计见 module-system/design.md - 运行前参数 (cmdargs):声明式接收启动参数——
cmdargs块 +param 名:类型 = 默认值 [as "短名"],命令行--分隔符后的参数区按声明匹配(--名字 值/-短名 值/匿名按序/bool 开关/cast 类型转换),绑定为只读全局、先于 autoinit 与正文执行;浏览器等价入口NSI.setCmdargs(args) - 国际化:
--lang en|zh切换输出语言(默认中文),错误/警告/调试信息全部模板化,语言包可扩展(l10n 友好) - 统一错误报告:
[ERROR N] [行 X] 类型: 消息、[WARN]警告、[内部错误](解释器缺陷)、CLI[错误]四层隔离,互不混淆 - 其他:断言
assert、跳转jump、清除量purge、单行//与多行///(独占行)注释
NoethingScript 由 Node.js 运行,需要先安装 Node.js(npm 会随 Node 自动装上,无需单独安装)。
- Windows:打开 nodejs.org 下载 LTS 版本安装包,双击一路「下一步」即可;安装完成后打开「命令提示符」或 PowerShell,输入
node -v能显示版本号即成功 - macOS:安装 Homebrew 后执行
brew install node - Linux:用系统包管理器安装,如 Debian/Ubuntu 的
sudo apt install nodejs npm;或推荐用 nvm 管理版本
验证安装:任意终端输入 node -v 与 npm -v,均能显示版本号即可开始。
# 安装依赖 (含 TypeScript)
npm install
# 编译到 dist/
npm run build
# 运行脚本 (默认中文输出)
node dist/noethingScript-Interpreter.js 脚本文件名.ns
# 英文输出
node dist/noethingScript-Interpreter.js 脚本文件名.ns --lang en
# 带调试级别运行 (0-3)
node dist/noethingScript-Interpreter.js 脚本文件名.ns --debug 2
# 帮助与版本
node dist/noethingScript-Interpreter.js --help
node dist/noethingScript-Interpreter.js --version
# 脚本参数区: -- 之后的参数归脚本, 由入口文件 cmdargs 声明接收 (见 doc.md "运行前参数")
node dist/noethingScript-Interpreter.js script.ns -- --cmd build -v -n 42
# 注入 Node 内置能力 (fs/http), 脚本中可 名字.函数() 点分调用 (见 doc.md "Node/CLI 注入入口")
node dist/noethingScript-Interpreter.js --inject fs,http script.ns
# 模块管理器 nsm / 打包工具 nsmp (命令别名, 解释器自动注入 fs/http; 见 doc.md "模块管理器 nsm" 与 "打包工具 nsmp")
node dist/noethingScript-Interpreter.js nsm -- list
node dist/noethingScript-Interpreter.js nsmp -- pack modules/main/nsm --out /tmp
# 解释器自更新 (见 doc.md "解释器自更新")
node dist/noethingScript-Interpreter.js --check-upgrade
node dist/noethingScript-Interpreter.js --upgrade注:不支持短参数(如
-h);以-开头的未知参数会提示"未知参数"而非被当作文件名。
解释器核心为纯 TypeScript,不依赖 Node.js API,可直接在浏览器中加载 dist/noethingScript-Interpreter.js,通过全局 window.NSI 调用:
<script src="dist/noethingScript-Interpreter.js"></script>
<script>
// 执行一段 NoethingScript 代码 (输出走 console, 与 Node 一致)
window.NSI.run("global x:int = 42\nprint x * 2");
// 切换输出语言 ('zh' | 'en', 默认 zh)
window.NSI.setLanguage('en');
window.NSI.getLanguage();
// 绑定自定义输入: input() 调用此同步函数, 而非默认的 prompt 弹窗
window.NSI.setInput(() => document.getElementById('inputBox').value);
window.NSI.setInput(null); // 恢复默认 prompt
// 交互执行 (程序模式): 脚本自持主循环, 跑到 input() 时挂起返回 'suspended',
// 由 JS 喂入输入继续执行, 直到脚本自然结束返回 'finished'
const status = window.NSI.runInteractive(NS_SCRIPT, () => {}); // 启动/重新开局
function onKey(key) { window.NSI.resumeInput(key); } // 每按键喂一次
</script>window.NSI(即 globalThis.NSI)提供:version、run(code)、runInteractive(code, onInput?)、resumeInput(value)、setLanguage(lang)、getLanguage()、setInput(handler)、setCmdargs(args)(脚本参数区,对应命令行 -- 之后的部分)、setModuleLoader(loader)/setModuleDir(dir)/setCurrentFilePath(path)(模块加载能力注入)、registerGlobal(name, obj)(宿主 JS 对象注入,NS 中以 名字.函数() 点分调用,返回值限 number/string/boolean/Array,见 doc.md "JS 能力注入"),以及底层类 Interpreter/ExpressionEvaluator/ScopeManager 和语言包 LANG_PACKS。Node 环境同样挂载 globalThis.NSI,且 require('./dist/noethingScript-Interpreter.js') 直接返回 NSI 对象(不触发 CLI 入口);命令行注入内置能力用 --inject fs,http(见 doc.md "Node/CLI 注入入口")。交互执行完整示例见 examples/2048_web.html(脚本与命令行版 examples/2048.ns 同构、自持主循环)。
将以下代码保存为 example.ns 并运行:
global message:string = "Hello, NoethingScript!"
print message
global array data[5]:int = [10, 20, 30, 40, 50]
for (local i:int = 0; i < len(data); i = i + 1)
print data[i]
endfor
:add (a:int, b:int) -> sum:int
sum = a + b
return sum
:end
call add(3, 4) -> result
print result
try
print undefinedVar
catch (Exception err)
print "caught: " + err
endtry
内置合成基准与 2048 端到端基准(benchmarks/),可对比当前版与任意基线提交:
npm run bench # 合成基准: 当前版 vs 原生 JS (全局/局部循环、函数调用、数组读写)
npm run bench:head # 合成基准: 对比基线提交 (默认 HEAD~1, 自动编译基线, 含行吞吐)
npm run bench:2048 # 2048 端到端计时 + 固定种子确定性校验 (语义零回归验证)
npm run bench:module # 模块化基准: 单文件 (函数内联) vs 模块化 (use + 点分 call), 输出逐字节校验后对比
node benchmarks/ns_perf_bench.js --base=<rev> # 对比任意提交 (如 --base=7fc14c5)说明:行吞吐口径为每轮循环执行 4 行(while 条件行 + body + endwhl 结构行);倍率以原生 JS 稳态中位耗时(200 次预热 + 100 次计时)为基准,JS 侧为微秒级,绝对倍率仅供参考,相对变化与历史对比请保持同一脚本同一口径。基线产物缓存于 .bench-head/(已 gitignore),基线提交变化时自动重建。
基准结果与硬件 CPU 与 Node 版本强相关,两个基准脚本每次运行都会自动打印运行环境(printEnv()),对比数字时请先核对环境一致:
运行环境: Node v22.23.1 / AMD Ryzen 5 5600 6-Core Processor (12 线程) / linux 7.1.6-201.fc44.x86_64
记录于 2026-08 的参考数据(本机实测)为上述环境。跨环境对比时,同一代码在更快的 CPU/更新的 Node 上数字会整体更好,但相对变化(当前版 vs 基线提交)在不同环境间基本可比。
以下数字均来自各提交信息,全部为参考环境(上述 Node/CPU)实测,相对变化为同环境、同基准脚本口径下测得,可追溯:
| 提交 | 基线 | 相对变化 |
|---|---|---|
b881828 阶段3 NSVM 指令集全覆盖 |
ee5e79b |
全部 23 测试逐字节回归一致;2048 端到端 -17.5% |
7fc14c5 解释器全面提速 |
最初版本 | 循环 -56%,函数 -42%,数组 -74%;倍率 ~11800x → ~4600x |
8bee034 局部变量槽位化 |
7fc14c5 |
局部循环 -26%,局部数组 -20%;2048 端到端 -11% |
347d7c3 函数/表达式/数组特化 |
71c997d |
局部循环 -29%,局部数组 -28%,全局循环 -18%,全局数组 -23%,函数调用 -10%;2048 端到端 -19% |
如需复现任一历史版本的绝对数字:git show <rev>:noethingScript-Interpreter.ts 取回源码编译后,用当前基准脚本在参考环境重跑即可。注意:347d7c3 之后基准脚本才加入自动打印环境(printEnv()),更早提交无环境记录,故统一以上述参考环境为准。
NoethingScript/
├── noethingScript-Interpreter.ts # 解释器源码 (含 NSVM 字节码编译器与执行器)
├── benchmarks/ # 性能基准 (合成基准 + 2048 端到端 + 模块化差异, 支持基线对比; npm run bench*)
├── doc.md # 语言规范手册 (含运行前参数 cmdargs、模块系统章节)
├── bytecode-vm/ # 字节码VM文档: design.md 设计蓝图 + guide.md 实现说明
├── module-system/ # 模块系统设计: design.md 完整设计 (定稿) + module-system-conclusions.md 讨论结论记录 + implementation-deviations.md 实现偏差记录 + self-host-repo-guide.md 自托管模块仓库指南 (nsm/nsmp)
├── modules/ # 模块目录 (三分类来源: main/extra/custom), use 语句按此定位
├── module-test/ # 模块系统专项验证 (main.ns 主入口 + baseline 基线, min.ns 最小验证)
├── tests/ # 功能测试用例 (.ns) 与目标清单 (tests_goals.md), 含 input 演示 (tests/input_demo.ns, tests/input_browser_demo.html)
├── .test-baseline/ # 26 项回归测试的逐字节预期输出基线 (对应 tests/*.ns, 回归比对用)
├── examples/ # 演示项目: 2048 命令行游戏 (examples/2048.ns) 与网页版 (examples/2048_web.html, 浏览器中直接打开)
├── vscode-extension/ # VSCode 语法高亮扩展 (NoethingScript Language Support)
├── README.md # 本文件
├── package.json # npm 脚本 (build/bench/bench:2048/bench:module) 与依赖
├── package-lock.json # npm 依赖锁定 (npm install 生成)
├── CHANGELOG.md # 版本历史 (按版本倒序)
├── roadmap.md # 发展计划 (路线图/里程碑, 语言锁定期内的方向决策记录)
├── tsconfig.json
└── LICENSE
注:上表为仓库内容(git 跟踪文件)。
dist/(编译产物)与node_modules/由.gitignore排除、不入库,npm install && npm run build后生成本地使用。
完整语法规则见 doc.md。
字节码VM 设计蓝图见 bytecode-vm/design.md,实现说明见 bytecode-vm/guide.md。
模块系统完整设计见 module-system/design.md,专项验证见 module-test/(main.ns 主入口,基线 module-test/baseline/main.out)。
官方模块仓库:GitHub LinuxMint-User/NoethingScriptModules(主)+ Gitee epix-xhan/NoethingScriptModules(镜像,按序回退)——nsm -- install <包名> 安装官方模块(解释器已内置默认双镜像,无需任何配置),包列表与维护流程见该仓库 README。
当前版本 2.8.0。
版本策略:2.7.x 为不稳定版本系列(patch 版本可携带破坏性变更,攒批发布),2.8.0 起模块系统全量上线,恢复"破坏性变更只在 minor 升级时发布"的稳定策略。升级时请关注 CHANGELOG.md 中每个版本的变更说明。
完整变更记录见 CHANGELOG.md。