3 个版本

0.1.2 2023 年 8 月 27 日
0.1.1 2023 年 2 月 19 日
0.1.0 2023 年 2 月 3 日

#376 in 编程语言

GPL-3.0-only

125KB
3K SLoC

BrainOxide

[ 在 crates.io 上 ]

一个用于 Rust 的优化 Brainfuck 解释器/编译器到 C。

作为一个学习 Rust 的项目。代码肯定不是惯用的,有些地方相当混乱。

特性

  • 优化
  • 模糊测试
  • 回归测试套件
  • 两种后端模式:解释或生成 C 代码

为什么?

世界还需要另一个 BF 实现?其实不需要。制作它的过程中我好玩吗,学到了东西吗?是的。

优化

BrainOxide 执行以下优化

  • 指令合并
  • 循环降低:while → if,while → 方程 / 集合
  • 常量折叠
  • IO 操作合并:将常数输出合并到单个字节数组输出中。
  • 死存储消除
  • 窥孔优化:[>][>], [>][>][>], ... → 各种搜索

BrainOxide 在内部区分平衡和不平衡代码部分。这指的是 > 与 < 的数量。在平衡代码部分,我们知道所有偏移量,因此可以更好地优化。在不平衡部分,我们优化能力非常有限。

对于平衡代码部分,BrainOxide 构建一个有向无环图(DAG),并在 DAG 上执行优化。

优化愿望清单

  • 部分评估直到第一个输入指令

    这可以将大型程序常量折叠成一个单个的 fputs() 调用。它必须是 opt-in。此外,它仅适用于代码生成模式。

  • 更好的方程处理

    目前将循环降低到方程相当有限且简单。代码不能降低已包含方程的循环,例如,只支持循环索引步长为 -1

  • 循环/If 展开循环

    如果我们知道迭代次数是静态的,并且这样做有意义,则展开循环。需要一个启发式方法。

代码稳定性

该代码库没有稳定的API。它不打算用作库。命令行标志也不稳定,因为我想要进行一些更改以允许更灵活的日志记录选项。

该软件仅在最新的Arch Linux x86-64安装上进行过测试。如果它在非Linux系统上工作,那是一个意外的惊喜。

最小支持的Rust版本(MSRV)

因人而异。截至撰写时,它在rustc 1.67.0上工作。它应该在最新的稳定Rust版本上继续工作(除了需要nightly进行模糊测试)。我不会在比当时最新稳定版本更旧的版本上进行测试。

总结来说:没有MSRV政策。

许可证

BrainOxide在GPL 3.0下发布(仅此版本,而不是“或更高版本”)。

依赖项

~5–15MB
~173K SLoC