#brainfuck-interpreter #brainfuck #brainfuck-compiler #compiler-optimization #optimization #compiler #interpreter

bin+lib brain

Brain编程语言的编译器。将Brain编译成优化的Brainfuck代码。还包括Brainfuck解释器。

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

MIT 许可证

77KB
2K SLoC

Rust 1K SLoC // 0.1% comments JSX 598 SLoC // 0.1% comments JavaScript 167 SLoC // 0.1% comments

brain

brain是一种高级编程语言,编译成Brainfuck。它使用Rust编程语言实现。

brainfuck 是一种非常简单的8条指令的图灵完备语言。不幸的是,Brainfuck代码很难理解和编写。Brain允许你使用更熟悉的语法编写Brainfuck程序,使编写Brainfuck程序变得更容易。编译器旨在尽可能优化生成的Brainfuck代码。

优化目标

  1. 生成小的Brainfuck文件(尽可能少用指令)
  2. 生成内存高效的代码(尽可能少用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

用法

对于只想用编译器编译的人来说

  1. 按照上面的安装说明操作
  2. 运行brain yourfile.brn编译您的Brain代码
  3. 运行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