2014-11-16 22 views

回答

1

有没有简单的方法可以做到这一点,我知道。这是将语言编译为Brainfuck的主要挑战之一。

正如您所说,它理论上当然是可行的,但它需要您通过实现堆栈或堆或一些类似的数据结构,以非常自律的方式构造代码。

项目C2BF是从C到Brainfuck的部分编译器,完全是这样做的。它通过解释Brainfuck细胞进入的五种,即重复图案模拟堆叠,

1)堆栈
2)堆
3)堆栈位置标记/顶部标记
4)走
5 )贯彻

如果你有兴趣做这样的事情的更具体的实施细则,你可能会感兴趣的看着这说明对BrainFix,它描述了更充分怎么办简单˚F低和内存控制。

+0

谢谢,BF的编译器正是我想到的。不仅要实现goto,还要实现通用递归和指向函数的指针,我需要一个goto指令。 – vz0

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 

你必须添加一个标志做ELSE部分,另一个,如果你想要做的IF部分without a copy但它是相当可行的。

0

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

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

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