📜 GRJS 解释器
引擎 · 在 C# 中运行的 JavaScript 解释器,为「反射宿主对象」特化。
📌 技术定位
GRJS(General Reflection JavaScript)是一个把 JavaScript 字符串编译为后缀表达式、由栈机执行的 C# 解释器。 它不是通用的浏览器 JS 引擎,而是为反射特化:可以低成本地与宿主 C# 对象高频通信, 直接操作宿主对象而不存在序列化过程。语法上是 ECMAScript ES5 的超集(并已实现多数现代语法), 但不追求适配 ES6 及更晚版本。
✨ 核心特性
🪜 三层递进版本
同一套源码继承出三个版本,按场景取「性能—功能」甜点:
· GRJSExpression:表达式 / 运算符 / 短路,适合过滤器与配置;
· GRJSConditional:增加 if / while / for / let / function / return;
· GRJSClosure:增加闭包、箭头函数、async/await 与解构。
🔌 为反射特化
弱类型读、强类型写(如把 "123" 赋给宿主 float 字段会自动转换); 可直接迭代宿主的 List<int> 而无需先转成 JS 数组。
🧩 反射扩展运算符
in 可做子串检查;as / is 右侧可接宿主类名字符串;import 导入的是 C# 类。
🛡️ 受限反射安全模型
未显式设置解析器时,只允许值类型 / string / 已注入对象的属性访问与方法调用,其余引用类型被拒; 显式设置后才获得完整反射能力。
💉 两级注入
运行时变量可随时替换;编译期常量会内联进产物,性能更好。内置类不默认加载,按需注入。
🤖 对 AI Agent 友好
借助大模型庞大的 JS 语料,只需极少约束即可生成可用的反射脚本,是 AI 驱动自动化的理想入口语言。
🔧 关键技术点
- 执行管线:Profile(运算符注册 / 优先级 / 词法)→ Parser → 后缀表达式,由栈机执行;栈机使用对象池复用。
- 闭包语义:使用「环境链」替代栈式 let 管理,使闭包捕获具备引用语义;function 返回方法闭包供宿主稍后回调。
- 异步:async/await 借用宿主 Task(解释器内无 Promise)。
- 可裁剪:实现统一的表达式接口,可被 GS2 虚拟机 / 汇编器消费。
- 基础运行时:与自研的 AS3 运行时库共享基础设施(数组 / 动态对象 / 方法闭包 / 正则等),GS2 亦复用同一套运行时。
🧪 示例
// 一行过滤器(表达式版本即可胜任)
this.num > 10 && this["name"].length < 3
// 反射:以宿主类名字符串做类型判断
obj is "System.Collections.IList"
obj as "System.Collections.IList"
// 闭包:返回给宿主稍后回调
var handler = function (x) { return x * 2; };