Skip to content

Gox用 Go 从零实现的 JavaScript 运行时

自研 lexer → parser → 字节码 VM 整条编译管线。单二进制、零 cgo、零外部依赖,自带软件光栅化 GUI 渲染层 —— 写完的 JS 还能打包成独立可执行文件直接分发。

Gox —— 用 Go 从零实现的 JavaScript 运行时

三十秒跑起来 ​

gox — REPL / 运行脚本 / 创建工程
$ npm i -g @goxjs/goxjs
$ gox
Gox REPL (ES6 subset)
Type :exit to quit, :help for help
 
> let x = 10
> let y = 20
> x + y
  30
> [1, 2, 3].map(v => v * 2)
  [2, 4, 6]
>

也可以不装:npx goxjs app.js;或从源码 go build。详见安装与创建工程。

它到底是什么 ​

是什么

一个用 Go 写的、从词法分析到字节码虚拟机全部自己实现的 JavaScript 运行时。不是 V8 的绑定,也不是把 JS 翻译成 Go。

能做什么

跑 ES6+ 脚本、写 CLI 工具、写带窗口的桌面程序、把脚本打包成单个可执行文件发给别人,以及拿它学习编译器与虚拟机实现。

不做什么

不追求替代生产环境的 Node 生态:没有 npm 兼容、没有 require、没有 JIT,也不实现 DOM。当作一门独立的小语言 + 自带 UI 框架来用。

编译管线 ​

一条清晰的管线,每一层都可以单独阅读和测试。

.js 源码UTF-8 文本
→
lexer词法分析 → Token 流
→
parser语法分析 → AST
→
compiler符号表 + 字节码生成
→
vm栈式帧执行 + 事件循环

关键设计:无 GC 的显式内存管理(循环引用有专门处理)、单线程 VM + 跨 goroutine 调度(网络回调回投,JS 永远单线程无需加锁)、定长指令编码(解码即取即用)。

16 行写一个桌面 GUI 应用 ​

js
import { createSignal } from "gx/solid";
import { h, render } from "gx/gfx";

const [count, setCount] = createSignal(0);

render(
  <window title="Counter" width={400} height={300}>
    <column gap={8} padding={16}>
      <text font={20}>{() => `count: ${count()}`}</text>
      <button onClick={() => setCount(c => c + 1)}>加一</button>
    </column>
  </window>
);
bash
gox counter.js          # 直接运行,弹出 400x300 窗口
go run ./packager counter.js --gui -o counter.exe   # 打包成独立 GUI 程序

属性或文本传函数即为响应式绑定:信号更新 → 依赖节点标脏 → 脏矩形合并后只重绘受影响区域。更多见GUI 桌面应用教程。

能力总览 ​

层面内容去哪看
语言ES6+ 子集:let/const、箭头函数、class、async/await、解构、模板字符串、可选链、ES 模块、JSX教程 · 语言基础
标准库Object / Array / String / Map / Set / Proxy / Promise / TypedArray / Temporal …API · 标准内建
宿主模块(免 import)console / fs / path / process / http / fetchAPI · 宿主模块
响应式GetX 风格 obs / computed,SolidJS 风格 gx/solid 信号教程 · 响应式
GUI44 个内置元素 + JSX + 脏矩形局部重绘、路由、多窗口组件参考
多端桌面 Windows / Linux / macOS(win32 / X11 / cocoa)与移动 Android / iOS / 鸿蒙 —— 平台壳工程驱动同一渲染内核,界面逻辑一份 JS 通用教程 · GUI 应用
内置模块(需 import)gx/solid · gx/gfx · gx/view · gx/router · gx/screen · gx/dialog · gx/storage · gx/dev 与原生能力层六模块API · 内置模块
工具链REPL、gox create 脚手架、gox dev 热更新、jsbuild 打包、五平台 npm 预编译二进制教程 · 安装

版本与现状 ​

当前版本 v0.10.0,完整条目见 GitHub Releases。

版本内容
0.9.0table / tree / list-item 数据展示组件、tabs 选项卡、tooltip 悬停提示;设计 token 与主题系统(32 项颜色 token、暗色预设、运行时切换);gx/update v1.1 自动更新(流式下载 / 断点续传 / 进度回调 / pre 通道);gox create --ts TypeScript / TSX 模板;var 声明与 class 表达式;运行时错误带源码帧定位
0.8.0Test262 合规率流水线(定时跑 language 套件、徽章自动回写);gox vs node 性能基准 harness;压力与帧预算测试(万级定时器风暴 / 并发 fetch / 489 节点渲染预算);3 个示例应用(TODO / 仪表盘 / 贪吃蛇);计算属性名;滚动条可拖拽与横向滚动
0.7.0gox cert 一键生成各平台签名证书、gox build android 自动接入签名、gox create 生成 certs/ 目录;gox build macos --arch universal(amd64+arm64 合并);iOS 相册多选保序与 media.preview 多文件预览
0.6.0macOS 窗口后端 cocoa(桌面 GUI 三平台齐);gox dev 热更新、gox.json 项目配置、gox build 统一构建入口
0.5.0原生能力层六个内置模块(gx/device · gx/app · gx/geo · gx/media · gx/permission · gx/viewport)
0.4.0脚手架 gox create;路由 gx/router 与屏幕 gx/screen 成为内置模块

已知缺口

富文本(行内混排样式)尚未封装(虚拟化长列表已在 <scroll vlist> 落地) —— 表格 / 树 / tooltip / 图标 / spinner / tabs 等数据展示与反馈类组件已在 0.9.0 落地;原生能力层里依赖真机的部分(相机 / 定位 / 相册 / 权限)在桌面上诚实报 unsupported,移动端则由平台壳工程提供(Android 已模拟器实测、iOS 待验收、鸿蒙仍是桩)。逐项见限制与常见误区。

Apache License 2.0 · 用 ❤ 和 Go 编写