4个版本
使用旧的Rust 2015
0.1.2 | 2017年2月4日 |
---|---|
0.1.1 | 2017年1月29日 |
0.1.0 | 2017年1月28日 |
0.0.1 | 2017年1月22日 |
#7 in #brainfuck-interpreter
77KB
2K SLoC
brain
brain是一种高级编程语言,编译成Brainfuck。它使用Rust编程语言实现。
brainfuck 是一种非常简单的8条指令的图灵完备语言。不幸的是,Brainfuck代码很难理解和编写。Brain允许你使用更熟悉的语法编写Brainfuck程序,使编写Brainfuck程序变得更容易。编译器旨在尽可能优化生成的Brainfuck代码。
优化目标
- 生成小的Brainfuck文件(尽可能少用指令)
- 生成内存高效的代码(尽可能少用Brainfuck单元)
当项目达到1.0.0版本时,这些目标将更明显地体现在程序的编译输出中。
brain语法
有关完整示例,请参阅examples/
目录。某些示例在编译器中尚未完全实现。
以下示例都是有效的语法
cat
程序(examples/cat.brn)
// cat program
// while condition can be an `in` statement, or valid expression of size 1 byte
// Continues so long as the given byte is not zero
while in ch[1] {
out ch;
}
使用brain examples/cat.brn
编译。
这将编译成以下Brainfuck代码
,[.,]
使用brainfuck cat.bf < someinputfile.txt
运行。
读取输入(examples/input.brn)
// input requires explicit sizing
// always reads exactly this many characters or panics if EOF is reached before then
// if this many characters aren't available yet, it waits for you to send that many
in b[5];
out "b = " b "\n";
c[1] = "c";
in c;
out "c = " c "\n";
// You can reuse allocated space again
in b;
out "b = " b "\n";
// Error because we don't support dynamic length strings
//in input[];
// Error because you can't redeclare an existing name
//in b[5];
// Error because you aren't requesting any characters
//in zero[0];
这编译成以下Brainfuck代码
,>,>,>,>,>++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++.-----------
----------------------------------------
---------------.++++++++++++++++++++++++
+++++.-----------------------------.----
----------------------------<<<<<.>.>.>.
>.>++++++++++.++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++,>+++++++++++++++
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
++++.-----------------------------------
--------------------------------.+++++++
++++++++++++++++++++++.-----------------
------------.---------------------------
-----<.>++++++++++.----------<<<<<<,>,>,
>,>,>>++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++.---------------
----------------------------------------
-----------.++++++++++++++++++++++++++++
+.-----------------------------.--------
------------------------<<<<<<.>.>.>.>.>
>++++++++++.----------<<<<<<
安装
对于只想使用Brain的人来说,现在获取Brain的最简单方法是首先安装Rust编程语言的Cargo包管理器。
然后在终端运行
cargo install brain
如果您是从旧版本升级,请运行
cargo install brain --force
用法
对于只想用编译器编译的人来说
- 按照上面的安装说明操作
- 运行
brain yourfile.brn
编译您的Brain代码 - 运行
brainfuck yourfile.bf
运行Brainfuck解释器,它将运行您生成的Brainfuck代码
您还可以指定输出文件名。运行 brain --help
获取更多信息。
对于想要构建源代码的人来说
此项目包含 brain 编译器和基本的 brainfuck 解释器。
请确保您已安装 rust 和 cargo(随 rust 一起安装)。
brain 编译器
要将 brain (.brn) 文件编译成 brainfuck (.bf)
cargo run --bin brain -- filename.brn
其中 filename.brn
是您想要编译的 brain 程序
使用 --help
查看更多选项和附加信息
cargo run --bin brain -- --help
如果 brain 编译器看起来耗时过长或“挂起”,请先尝试运行 cargo build
,以查看 rust 编译器是否由于某种原因耗时过长。
brainfuck 解释器
brain 编译器仅正式针对此 brainfuck 解释器。您可能会在使用其他 brainfuck 解释器/编译器时遇到不同的结果。由于 brainfuck 的行为规范并不明确,因此有一个静态编译目标是更容易的,这样它的行为就不会变化。
要运行 brainfuck 程序
cargo run --bin brainfuck -- filename
其中 filename
是您想要运行的 brainfuck 程序
示例
在 examples/
目录中存在各种 brain 示例,您可以使用上述使用说明将它们编译成 brainfuck。
依赖关系
~1.5MB
~20K SLoC