extended version of bf有一条goto
指令,?
。
我知道,从理论上讲,应该可以在bf的经典8指令版本中模拟goto。我怎么能在实践中做到这一点?有existing bf goto pattern or algorithm吗?有没有办法在不使用goto ?
指令的情况下将goto ?
指令转换为bf版本?
答案 0 :(得分:2)
我知道,没有简单或琐碎的方法可以做到这一点。这是将语言编入Brainfuck的主要挑战之一。
理论上,正如您所说,它当然是可能的,但它要求您通过实现堆栈或堆或类似的数据结构以非常规范的方式构建代码。
项目C2BF是从C到Brainfuck的部分编译器。它通过将Brainfuck细胞解释为五个重复模式(即
)来模拟堆栈1)堆栈
2)堆 3)堆叠位置标记/顶部标记
4)走路 5)携带
如果您对执行此类操作的更具体的实现细节感兴趣,您可能有兴趣查看BrainFix的此描述,它更全面地描述了如何进行简单的流和内存控制。
答案 1 :(得分: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部分without a copy,您必须添加一个标记来执行ELSE部分和另一个部分,但它非常可行。
答案 2 :(得分:0)
我能想到的唯一方法是使用brainfuck编写的brainfuck解释器来运行程序(如dbfi)。通过一些修改,您可以添加新指令,如LBL和GOTO。
唯一的问题是它会很慢。另一个问题是你必须将实际的brainfuck程序存储在内存磁带上(最简单的方法是输入程序,就像dbfi一样)。为了更清洁&#39;这样做你将不得不制作一个brainfuck程序,将实际程序放在内存磁带上,以便解释器可以读取和运行它。
这当然不是一种非常优雅的方法,但我认为它实际上可能效果很好,但它肯定会非常慢。