在线脚本计算器:用代码"指挥"数学
一款内置的数学与绘图脚本实验室。使用安全的解释型语言(不使用 eval)编写程序,支持变量、数组、函数、循环与条件语句,内置数学函数、数值导数与积分函数,以及 2D/3D 绘图命令。按 Ctrl/Cmd+Enter 运行,可加载示例脚本,同时查看控制台输出与 SVG/WebGL 图形——全部在浏览器本地执行。
脚本计算器使用说明
一种安全的沙盒语言,支持变量、函数、循环和绘图
脚本计算器在沙盒解释器中运行一门自研的小型教学语言。支持变量、函数、条件、循环、数组,以及 sin、cos、log、plot 等数学与绘图命令。解释器被解析为 AST 并完全在浏览器中执行——它从不使用 eval 或 new Function,并且步数限制可防止无限循环。按 Ctrl/Cmd+Enter 运行。
01 编写脚本
语句自上而下运行。用 = 赋值变量,用 fn name(args) {'{'} ... {'}'} 定义函数,用 if/else 分支。循环使用 for (i = 0; i < n; i = i + 1) {'{'} ... {'}'} 和 while (cond) {'{'} ... {'}'}。数组用 [1, 2, 3] 或 range(n) 创建,push/len 按预期工作。print(...) 写入输出控制台。
可用的数学函数包括 sin、cos、tan、asin、acos、atan、log、exp、sqrt、abs、min、max、pow、floor、ceil 和 round,以及常量 pi。绘图命令在控制台旁生成图形:plot(f, xmin, xmax) 绘制二维曲线;plot3d(f, xmin, xmax, ymin, ymax) 绘制曲面;param3d(x, y, z, tmin, tmax) 绘制参数曲线;scatter3d(xs, ys, zs) 绘制点云。还提供 derivative(f, x) 和 integrate(f, a, b)。
使用示例按钮加载可运行的样例,然后编辑它们。按 Ctrl/Cmd+Enter(或 Run)执行。按 Tab 时编辑器会插入两个空格以保持缩进整齐。如果脚本包含错误,控制台会显示行号和原因;如果运行时间过长,步数限制会安全地将其中止。
所有脚本保存在浏览器 localStorage 中,刷新页面后仍在。但清除浏览器数据会丢失,重要脚本请自行备份。脚本不会上传到服务器,也不会出现在任何历史记录里。
- 变量:x = 3,name = value(无需 var/let 关键字)
- 函数:fn add(a, b) {'{'} return a + b {'}'}
- 条件:if (x > 0) {'{'} ... {'}'} else {'{'} ... {'}'}
- 循环:for 和 while,循环体用大括号括起
- 数组:[1, 2, 3]、range(n)、push(arr, v)、len(arr)
- 输出:print(...);图形渲染在控制台上方
- 所有计算在浏览器本地完成,不上传数据
02 AST 解释器与安全沙箱
解释器先把你的代码解析成抽象语法树(AST),再递归遍历这棵树执行。例如 x = 1 + 2 会被解析成"赋值节点,左子树是变量 x,右子树是加法节点,左右子树分别是数字 1 和 2"。AST 让解释器可以精确控制执行顺序、做安全检查、给出准确的错误行号。
eval 和 new Function 会把字符串直接编译成 JavaScript 执行,恶意代码可以访问 DOM、发网络请求、窃取数据。本工具自研解释器,代码在沙箱中运行,只能访问预定义的数学函数,无法触碰浏览器 API。加上步数上限与内存限制,即使写出死循环也不会卡死页面。
步数上限约 100 万步,超出后解释器会强制终止并报错。这是沙箱保护机制的一部分。如果不小心写出 while (1) {'{'} {'}'},工具会安全地停下来,告诉你"步数超限"。
03 用脚本探索数学:从牛顿迭代到蒙特卡洛
牛顿法求 x² − 2 = 0 的根(即 √2):x = 1; for (i = 0; i < 10; i = i+1) {'{'} x = x − (x^2 − 2)/(2*x) {'}'}。10 次迭代后 x ≈ 1.41421356,精确到小数点后 8 位。用脚本实现算法,比看十遍公式理解更深——你会真切体会到"迭代""收敛""初值敏感"这些概念的含义。
蒙特卡洛方法估算 π:在边长 1 的正方形内随机投点,落在内切圆内的比例约等于 π/4。脚本:n = 100000; c = 0; for (i = 0; i < n; i = i+1) {'{'} x = rnd(); y = rnd(); if (x*x + y*y < 1) {'{'} c = c + 1 {'}'} {'}'}; print(4*c/n)。运行几次,结果在 3.14 附近波动。蒙特卡洛是金融工程、物理模拟、机器学习中最重要的随机算法之一。
内置 integrate(f, a, b) 用复合梯形法计算定积分,derivative(f, x) 用中心差分计算导数。你也可以自己实现:积分是"把曲边梯形切成小矩形求和",导数是"割线斜率的极限"。用脚本把定义翻译成代码,是理解微积分概念的最佳途径。
运行
- ▶ Run执行脚本。快捷键 Ctrl/Cmd+Enter。
- Ctrl/Cmd+Enter运行的键盘快捷键。
- Tab插入两个空格用于缩进。
示例加载器
- 2D加载使用 plot(...) 的二维绘图示例。
- 3D加载使用 plot3d(...) 的三维曲面示例。
- Parametric加载 param3d(...) 曲线示例。
- Scatter加载 scatter3d(...) 点云示例。
编辑器与输出
- code area在此编写脚本;行号显示在沟槽中。
- console panel显示 print(...) 输出、错误信息或“No output”。
- plot area当脚本调用绘图命令时渲染二维/三维图形。
内置命令
- plot(f, a, b)在 [a, b] 上绘制 f(x) 的二维曲线。
- plot3d(f, a, b, c, d)在矩形区域上绘制曲面 z = f(x, y)。
- param3d(x, y, z, a, b)在 t ∈ [a, b] 上绘制参数曲线。
- scatter3d(xs, ys, zs)从三个数组绘制三维点云。
- derivative(f, x)f 在 x 处的数值导数。
- integrate(f, a, b)在 [a, b] 上的数值定积分。
- 务必用大括号 {'{'} {'}'} 包裹函数体和循环体。
- 调试时使用 print(...) 检查值。
- 步数限制可保护页面免受无限循环影响——如果被中止,请简化繁重的循环。
- 从示例开始并修改它,以快速学习语法。
- 沙盒内无法访问 DOM、网络或 eval——脚本无法离开浏览器。
- 递归深度有限(约 1000 层),深度递归请改用循环。
- 脚本保存在浏览器 localStorage,刷新后仍在,但清除数据会丢失。
- 所有计算在本地完成,断网后页面已加载仍可使用。
免费的在线脚本计算工具,内置一门安全的小型编程语言。支持变量、函数、条件、循环、数组,以及 sin、cos、log、sqrt、plot 等数学与绘图命令。解释器在沙箱中运行,绝不使用 eval,设有步数上限防死循环。按 Ctrl/Cmd+Enter 运行。
这个工具能做什么
你写一段小程序,它帮你算数学、画图形。可以定义变量存储中间结果,写函数封装重复逻辑,用循环做迭代,用数组处理批量数据,最后一行命令画出 2D 曲线或 3D 曲面。所有计算在浏览器沙箱中完成,代码不会离开本机。
为什么需要"脚本"而不是"按钮"?
按钮适合固定操作,脚本适合探索过程。比如你想看"当步长从 0.1 变到 0.001 时,数值积分怎么收敛",用按钮要算几十次,用脚本只需一个 for 循环。脚本把"重复劳动"自动化,让你专注于数学结构本身。这是从"使用工具"到"创造工具"的跨越。
AST 解释器:代码是怎么被执行的
解释器先把你的代码解析成抽象语法树(AST),再递归遍历这棵树执行。例如 x = 1 + 2 会被解析成"赋值节点,左子树是变量 x,右子树是加法节点,左右子树分别是数字 1 和 2"。AST 让解释器可以精确控制执行顺序、做安全检查、给出准确的错误行号。这是与直接 eval 的本质区别。
安全沙箱:为什么不能用 eval?
eval 和 new Function 会把字符串直接编译成 JavaScript 执行,恶意代码可以访问 DOM、发网络请求、窃取数据。本工具自研解释器,代码在沙箱中运行,只能访问预定义的数学函数,无法触碰浏览器 API。加上步数上限与内存限制,即使写出死循环也不会卡死页面。
牛顿迭代:用脚本亲手实现经典算法
牛顿法求 x²−2=0 的根(即 √2):x = 1; for (i = 0; i < 10; i = i+1) { x = x − (x^2−2)/(2*x) }。10 次迭代后 x ≈ 1.41421356,精确到小数点后 8 位。用脚本实现算法,比看十遍公式理解更深——你会真切体会到"迭代""收敛""初值敏感"这些概念的含义。
蒙特卡洛方法:用随机数估算 π
在边长 1 的正方形内随机投点,落在内切圆内的比例约等于 π/4。脚本:n = 100000; c = 0; for (i = 0; i < n; i = i+1) { x = rnd(); y = rnd(); if (x*x + y*y < 1) { c = c + 1 } }; print(4*c/n)。运行几次,结果在 3.14 附近波动。蒙特卡洛是金融工程、物理模拟、机器学习中最重要的随机算法之一。
数值积分与微分:从定义到代码
内置 integrate(f, a, b) 用复合梯形法计算定积分,derivative(f, x) 用中心差分计算导数。你也可以自己实现:积分是"把曲边梯形切成小矩形求和",导数是"割线斜率的极限"。用脚本把定义翻译成代码,是理解微积分概念的最佳途径。
表达式语法
变量:x = 3。函数:fn add(a, b) { return a + b }。条件:if (x > 0) { ... } else { ... }。循环:for (i = 0; i < n; i = i+1) { ... } 和 while (cond) { ... }。数组:[1, 2, 3]、range(n)、push(arr, v)、len(arr)。数学函数:sin、cos、tan、exp、log、sqrt、abs、pow、min、max、floor、ceil、round。常数:pi、e。绘图:plot(f, a, b)、plot3d(f, a, b, c, d)、param3d(x, y, z, a, b)、scatter3d(xs, ys, zs)。
如何使用:三步上手
第一步,点 2D 示例按钮加载 plot(sin, -pi, pi),按 Ctrl+Enter 运行,看到正弦曲线。第二步,改成 plot(fn(x) { return x^2 }, -2, 2),看到抛物线。第三步,加一行 print(integrate(fn(x) { return x^2 }, 0, 1)),输出 0.333...,即 ∫₀¹x²dx = 1/3。
现实中的应用
量化交易用脚本回测策略;气象模拟用循环推进时间步;机器学习用迭代更新权重;游戏物理用数值积分计算运动轨迹。会写脚本的工程师,能把"手工试算"变成"自动探索",效率提升一个数量级。这门语言虽小,思想与 Python、MATLAB 完全相通。
局限性
本语言为教学与快速验证设计,不支持字符串操作、文件读写、递归深度过大或复杂数据结构。步数上限约 100 万步,超出会被终止。浮点精度为 IEEE 754 双精度,极端计算可能有舍入误差。需要更强大功能时,请迁移到 Python/NumPy 或 MATLAB。
常见问题
Q这门语言是 JavaScript 吗?
不是。它是一门自研的小型教学语言,语法类似 JavaScript 但更简单。被解析成 AST 后在沙箱中解释执行,无法访问 DOM、网络或浏览器 API。设计目标是"安全地学数学",而不是"写网页应用"。
Q为什么不用 eval?eval 不是更简单吗?
eval 会把字符串直接编译成 JavaScript,恶意代码可以读取页面数据、发请求、甚至操作其他标签页。自研解释器在沙箱中运行,只能访问白名单内的数学函数,从根本上杜绝了注入攻击。安全比方便更重要。
Q写了死循环会怎样?
解释器设有最大执行步数(约 100 万步),超出后会强制终止并报错,页面不会卡死。这是沙箱保护机制的一部分。如果不小心写出 while (1) { },工具会安全地停下来,告诉你"步数超限"。
Q可以在脚本里画图吗?
可以。plot(f, a, b) 画 2D 曲线;plot3d(f, a, b, c, d) 画 3D 曲面;param3d(x, y, z, a, b) 画参数曲线;scatter3d(xs, ys, zs) 画点云。图形与 print 输出一起显示在结果区,方便对比与分析。
Q如何调试脚本?
用 print(...) 输出中间变量,观察每一步的值是否符合预期。错误信息会显示行号与原因,从最后一行往上排查。建议先写小片段测试,再组合成大脚本。步数超限或语法错误都会给出明确提示。
Q脚本会被保存吗?
脚本内容保存在浏览器 localStorage 中,刷新页面后仍在。但清除浏览器数据会丢失,重要脚本请自行备份。脚本不会上传到服务器,也不会出现在任何历史记录里。
Q为什么我的递归函数报错了?
本语言对递归深度有限制(约 1000 层),防止栈溢出。深度递归请改用循环实现,或把问题拆小。阶乘、斐波那契等浅层递归可以正常运行。
Q可以处理字符串吗?
目前不支持字符串类型与字符串操作。语言专注于数值计算与数学探索,字符串处理超出了设计范围。需要文本处理时,请使用 Python 或 JavaScript 等通用语言。
Q如何学习这门语言?
从示例开始:点 2D、3D、Parametric、Scatter 按钮加载可运行样例,修改参数观察变化。参考 controls 中的内置命令列表。尝试把数学公式翻译成代码:比如等差数列求和、泰勒展开近似 e^x、用欧拉开方法解微分方程。
Q这门语言能做什么实际项目?
适合:数值实验(积分、微分、求根)、算法可视化(排序、搜索的步数统计)、数学探索(分形、混沌、数列极限)、物理模拟(抛体、振动、轨道)。不适合:网页开发、数据处理、网络请求。它是"数学实验室",不是"生产工具"。