4

有一个bf 的扩展版本,它有一条goto指令,?.

我知道,理论上,应该可以在 bf 的经典 8 指令版本中模拟 goto。我怎么能在实践中做到这一点?是否有现有的 bf goto 模式或算法?有没有办法将 goto?指令转换为没有 goto 指令的 bf 版本?

4

3 回答 3

2

据我所知,没有简单或微不足道的方法可以做到这一点。这是将语言编译成 Brainfuck 的主要挑战之一。

正如您所说,这在理论上当然是可能的,但它要求您通过实现堆栈或堆或一些类似的数据结构以非常有纪律的方式构建代码。

C2BF项目是一个从 C 到 Brainfuck 的部分编译器,它正是这样做的。它通过将 Brainfuck 细胞解释为五个重复模式来模拟堆栈,即,

1) 堆栈
2) 堆
3) 堆栈位置标记/顶部标记
4) 步行
5) 携带

如果您对执行此类操作的更具体的实现细节感兴趣,您可能有兴趣查看BrainFix的描述,它更全面地描述了如何进行简单的流程和内存控制。

于 2014-11-16T19:04:17.980 回答
0

其实没那么复杂。您要制作的伪代码是这样的:

goflg := 1
while goflg do begin

  // repeat this for each section
  if goflg <> 0 then begin
    goflg := goflg - 1
  end else begin
    // run your code in here and at the end
    // set goflg to get to the section you want next.
  end
  // to here

  // repeat this for each section
  if goflg <> 0 then begin
    goflg := goflg - 1
  end else begin
    // run your code in here and at the end
    // set goflg to get to the section you want next.
  end
  // to here


end

如果您想在没有副本的情况下执行 IF 部分,则必须添加一个标志来执行 ELSE 部分和另一个标志,但这非常可行。

于 2015-03-06T21:52:20.460 回答
0

我能想到的唯一方法是使用用brainfuck编写的brainfuck解释器来运行程序(如dbfi)。通过一些修改,您可以添加新指令,例如 LBL 和 GOTO。

唯一的问题是它会很慢。另一个问题是您必须将实际的brainfuck 程序存储在内存磁带上(最简单的方法是输入程序,就像dbfi 一样)。对于更“干净”的方式,您将不得不制作一个脑力激荡的程序,将实际程序放在存储磁带上,以便解释器可以读取和运行它。

这当然不是一个非常优雅的方法,但我认为它实际上可能工作得很好,尽管它肯定会很慢。

于 2016-06-28T15:33:16.247 回答