2 个版本

0.1.1 2022年9月6日
0.1.0 2022年1月12日

#781 in 开发工具

MIT 许可协议

99KB
3K SLoC

strop

Build Status crates.io

Rust 编写的超优化器

该程序随机生成计算给定函数的汇编语言程序。思路是您提供一个要计算的函数以及指定要使用的寄存器和相关内容,strop 将生成并输出一个相当不错的程序,以完成指定的工作。

当我意识到用 C 实现的类似工具 stoc 太难操作时,我就放弃了它。我需要学习 Rust 的借口,而且我需要一个可以针对 6502 以外的目标进行优化的超优化器,所以 strop 诞生了,这是一个用 Rust 编写的 stochastic optimizer。

支持的指令集

Strop 的指令集包括布尔操作(如 AND、OR 等)、加减法、比较、加载/存储指令、条件和无条件跳转等。某些操作未被包含,因为预计最终用户会主要使用 strop 生成计算密集型事物,如循环体和函数体。这意味着我不打算让 strop 生成 push/pops、中断返回等类似操作。

Strop 当前支持以下指令集,如徽章状态所示

  • 构建状态 stm8
  • 构建状态 6502 65n02 65c02
  • 构建状态 kr580vm1

工作原理

基本思路是生成比传统优化编译器更好的代码。以下是实现此目的的几个原因:

  • 我们可以进行穷举搜索,而优化编译器通常采用贪婪上升。这意味着Strop将找到全局最大值,而不是局部最大值。

  • 我们可以在输出变量上放置错误范围和无关紧要的位,这可以为代码优化提供更多机会。这就像说,“哦,我不在乎程序是否100%正确计算,只要它足够快”,我相信这可能会有些用处。

  • 我们可以给每个测试案例添加不同的权重。这就像说,“哦,我不在乎程序在一般情况下的次优,只要它在这些特定测试案例中更优。”

  • 运行完所有测试案例后,我们可以进行一些测量,如分支预测等,并针对这些进行优化。

(最后三个尚未实现,但这是我最终想做的事情)

我们将如何做到这一点?Strop生成代码的方式是通过将代码序列与一组测试案例(这些可能由Strop本身生成或由用户提供)运行。代码被突变并在测试案例中反复运行。当所有测试案例都通过时,我们知道程序是好的。随着代码的运行,我们可以分析其速度和大小等特征,这些信息可以反馈到我们突变或选择代码序列的方式。

依赖关系

~335–460KB