# InterpreterWindow **Repository Path**: sky0535/InterpreterWindow ## Basic Information - **Project Name**: InterpreterWindow - **Description**: 这是一个结合了自定义脚本解释器和实时窗口渲染的 Rust 演示项目。它展示了如何设计一种简单的脚本语言,并在后台线程中运行它,同时通过共享内存在前台窗口中实时可视化脚本的执行状态。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-19 - **Last Updated**: 2025-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Interpreter Window 这是一个结合了**自定义脚本解释器**和**实时窗口渲染**的 Rust 演示项目。它展示了如何设计一种简单的脚本语言,并在后台线程中运行它,同时通过共享内存在前台窗口中实时可视化脚本的执行状态。 ## ✨ 功能特性 (Features) * **自定义脚本解释器**: * 从零实现的解释器,支持整数运算、布尔逻辑、变量管理。 * 支持控制流:标签定义 (`.label`)、无条件跳转 (`jump`) 和条件跳转 (`if ... jump`)。 * 基于普拉特解析 (Pratt Parsing) 处理运算符优先级。 * **实时可视化**: * 使用 `winit` 进行跨平台窗口管理。 * 使用 `pixels` 进行高性能的硬件加速像素缓冲渲染。 * **双向数据绑定 (Two-way Binding)**: * **脚本 -> 窗口**: 脚本计算变量 `x`, `y` (坐标) 和 `r`, `g`, `b` (颜色),窗口每帧读取并渲染。 * **窗口 -> 脚本**: 窗口大小改变时,自动将 `w`, `h` (宽高) 写回解释器变量,脚本逻辑可立即响应(如调整碰撞边界)。 * **多线程架构**: * 解释器在独立线程中无限循环执行。 * 渲染循环在主线程运行,通过 `Arc` 和内部可变性 (`RwLock`) 安全共享数据。 ## 🚀 快速开始 (Quick Start) ### 1. 环境准备 确保你已经安装了 Rust 编程语言和 Cargo 包管理器。 如果尚未安装,请访问 [rust-lang.org](https://rust-lang.org/tools/install/)。 ### 2. 运行项目 在项目根目录下运行以下命令: ```bash cargo run --release ``` > **注意**: 推荐使用 `--release` 标志,因为解释器循环和渲染十分密集,Release 模式能提供更流畅的帧率。 ### 3. 体验交互 * **观察动画**: 窗口中会有一个方块在移动,碰到边界会自动反弹。 * **动态背景**: 背景颜色会根据方块距离窗口中心的远近产生渐变效果。 * **调整窗口**: 尝试拖动改变窗口大小,你会发现方块的运动范围和背景颜色计算会自动适应新的尺寸(因为 `w` 和 `h` 变量被实时同步了)。 ## 📂 项目结构 (Project Structure) * **`src/main.rs`**: * 程序入口点。 * 负责初始化 `Interpreter` 和 `Window`。 * 定义关键的回调函数,将解释器的变量映射到绘图指令。 * **`src/lib_interpreter.rs`**: * 解释器的核心实现。 * `Lexer`: 将源代码转换为 Token 流。 * `Parser`: 将 Token 流解析为 AST (抽象语法树)。 * `Interpreter`: 遍历 AST 并执行指令,管理变量作用域。 * **`src/window.rs`**: * 封装了 `winit` 和 `pixels` 的复杂性。 * 提供简单的 `set_background` 和 `set_rect` 绘图 API。 * 处理窗口事件循环。 * **`script.txt`**: * 运行时加载的脚本文件。 * 包含控制方块运动和颜色计算的所有逻辑。 ## 📝 脚本语法 (Script Syntax) 本项目使用一种类似汇编的简单脚本语言,存储在 `script.txt` 中。 * **注释**: 使用 `;` 开头。 * **变量赋值**: `var = value` (支持整数)。 * **算术运算**: `+`, `-`, `*`, `/`, `%`。 * **标签**: `.label_name`。 * **条件跳转**: `if condition jump .label`。 * **无条件跳转**: `jump .label`。 **示例**: ```text ; 初始化速度 dx = 3 .loop ; 更新位置 x = x + dx ; 边界检测 (假设 w 是窗口宽度) if x > w jump .bounce ; 继续循环 jump .loop .bounce ; 反转速度 dx = 0 - dx jump .loop ``` ## 🛠️ 修改与实验 你可以直接修改 `script.txt` 文件并重新运行程序,无需重新编译 Rust 代码(除非你修改了 `src` 下的源码)。尝试修改初始速度 `dx` 或颜色计算公式,看看会发生什么! ## 📚 参考资料 * [Bilibili: 编译与解释代码如何共处同一程序中](https://www.bilibili.com/video/BV1LUmQBtE6W)