10 个稳定版本
4.1.0 | 2024 年 5 月 13 日 |
---|---|
4.0.1 | 2023 年 12 月 2 日 |
3.0.3 | 2023 年 9 月 18 日 |
2.2.2 | 2023 年 9 月 12 日 |
#258 在 命令行界面
25KB
440 行
边缘
边缘是一个优化的大脑* 解释器,尽管如此,它仍然努力变得非常愉悦和易于使用。
特性
详细信息
边缘支持两种类型的磁带:30000 长的环绕,或非环绕动态宽度。前者是默认的;后者通过功能 dynamic_array
实现。
单元格本身有三个可定制的功能:环绕、宽度和有符号性。默认情况下,单元格是无符号字节且环绕。然而,通过组合以下功能,您可以实现多种不同的单元格:- nowrap
:禁用增减时的环绕 - wide_cell
:将单元格更改为 64 位 - signed_cell
:将单元格更改为有符号
调试
如果以调试模式编译,或带有功能标志 debug
,边缘将识别字符 ;
。这将输出有关信息(磁带、磁带指针和三个上下文指令)到提供的输出。
文件 I/O
使用 -i | --input
和 -o | --output
标志,边缘可以读取/写入到文件而不是 stdin/stdout。
无论来源或目的地如何,所有 I/O 都会进行缓冲,以提供快速且可靠的体验(输出在每行结束时刷新,并在退出时刷新)。
优化
边缘内部使用基于标记的中间结构来执行代码。首先,它将加、减、左移和右移指令分组在一起以消除重复的循环(以及丢弃冗余指令)。
然后,它执行多个宏优化以将常见操作减少到单个“指令”。目前,它识别
- 清除单元格(
[-]
) - 将单元格设置为值(
[-]++++
) - 将一个单元格移动到另一个单元格(
[->+<]
/[>+<-]
)- 还识别乘法(
[->+++<]
)
- 还识别乘法(
- 从另一个单元格减去一个单元格(
[->-<]
) - 扫描零单元格(
[>>>]
) - 复制一个单元格(
[->+>+<<]
)- 还识别乘法(与移动一样)
基于令牌的结构使得这些操作很容易识别,因为重复的指令已经合并为一个。
最后,它遍历每个括号([
/]
)并预加载其目标,因此执行它们不需要查找时间(它只是覆盖IP)。
这些都是在缓冲I/O环境中运行的,如上所述。
导入
这个crate也作为库提供。可执行文件只是提供了一个到库的CLI接口。值得关注的是parse
和optimize
函数,以及Token
枚举。
路线图
Brim还没有完成!我对未来的希望包括
- 更多的宏优化
- 通过功能特性进行磁带自定义
- 通过功能特性进行单元格行为变体
贡献
总是欢迎贡献,尤其是优化。请在创建pull request之前,运行cargo fmt
和cargo clippy
。
如果您想实现一个新功能,考虑将其置于功能标志之后。这可以减小代码大小并略微提高运行时间。它并不适用于所有添加,但值得考虑。
依赖
~58KB