用 Rust 开发 Brainfuck 解释器

项目地址:https://github.com/oosquare/brainfuck-interpreter Brainfuck 是什么就不具体介绍了,可以看这里。以下简称 bf。 这个解释器实现总体上是比较简单的,但是相比其他的大多数解释器还是有比较多的不同之处,具体如下: 更多的配置选项 内存的长度与地址范围:可配置为负数 单个内存单元的数据类型 数据溢出处理机制:wrap 或错误 读到 EOF 的处理机制:返回 0、EOF 本身或不改变 优化指令 采用类似编译为字节码的机制 这个项目可以算是学习 Rust 的练手项目,尝试着用了如 clap 这样的 crate。接下来就介绍一些技术细节。 使用方法 具体说明在项目 README. 编译、安装、执行全过程: $ git clone https://github.com/oosquare/brainfuck-interpreter.git $ cd brainfuck-interpreter $ cargo install --path ./crates/bf-exec # The program will be installed to ~/.cargo/bin $ bf-exec ./examples/helloworld.bf Hello World! ./examples/helloworld.bf: ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. 实现原理 目前,项目分为两个 crate:common 与 bf-exec,其中 common 实现了解释器的所有逻辑,而 bf-exec 是 common 的前端,负责处理输入和配置。 common 的模块树如下: complier:解析代码并转换为 IR (Intermediate Representation,中间表示) lexer:词法分析 parser:语法分析并优化,生成 AST SyntaxTree syntax:AST 生成 optimizer:AST 优化 instruction:根据 AST 生成 IR,同时也是最终执行的指令 execution:IR 的执行与相关环境 memory:按照 bf 的内存模型实现的可配置内存 strategy:基于策略模式实现的可配置组件 config:构建 Memory 的配置 stream:bf 的 IO 实现 config:构建 InStream、OutStream 的配置 context:Memory 与 InStream、OutStream 的组合 processor:运行指令,并调用 Context 实现细节 代码优化 同质代码合并 首先最简单的就是这个优化,它是指把相邻的 + 与 -、< 与 > 合并到一起并加上一个重复次数。...

January 26, 2023 · 7 min · oosquare