代码长度或磁带大小:brainf ...(munged)

Code length or tape size: brainf... (munged)

用 brainfuck 最好让磁带大小比程序大小长吗?还是反过来更好?

还有,相互之间有多大关系?

我正在尝试为 Arduino 制作一个 brainfuck 解释器。我知道以前有人这样做过,但我正在添加诸如 Adafruit Display 和代码编写能力之类的东西。

因此,代码很长,特别是因为我将代码和磁带都存储在数组中:

char code[] = {};
byte tape[] = {};

Memory should consist of at least 30000 cells, some existing brainfuck programs do need more so this should be configurable or unbounded.

我知道我永远不会将 30000 个单元装入一个 Uno,但动态内存似乎是充分利用它的方法 space。任何方式都表示赞赏。

目前,char code[512] = {};byte tape[1024] = {}; 使用“1,807 字节 (88%) 的动态内存”,但这只是解释器草图。我还需要在其中压缩更多代码。代码是 here 给任何有兴趣的人。

您可以使用 map 对象来实现它,而不是创建有限的数组。将索引用作 keys,将该单元格中的值用作 value(如果等于零则删除它,并在如果该单元格的值现在上升到 1 或更大,或者下降到小于零,则映射。

这样你只存储不为 0 的值(节省内存和分配注意事项),并且你有一个理论上无限的磁带(更纯粹的实现).

operation    map
----------------------------
#code_start  <>
+            <0 : 1>
+            <0 : 2>
-            <0 : 1>
-            <>
-            <0 : -1>
>+           <0 : -1, 1 : 1>
<<-          <-1 : -1, 0 : -1, 1 : 1>

地图可以通过包含 #include <map> 来使用,并由 std::map<int, int> map_name 或您想要使用的任何类型创建。

在此处查看文档:http://www.cplusplus.com/reference/map/map/