C语言到Brainfuck语言的编译器?

20

我有一个用C编写的基本程序,想要将其转换为语言brainfsck,但是找不到相关资料。我发现许多“brainfuck to C”的转换器,但没有相反的情况。我找到了C2BF,但不知道如何使用它或者是否需要使用它。


3
我希望你能将它实际转换为源代码,而不是在中间步骤重新编译它。 - MyNameIsKhan
6
这仍然是一个编译器,你所输出的是BF代码。需要注意的是,由于BF比C语言限制得多(尽管它也是图灵完备的),因此这将是一项相当困难的任务,“指针”的概念并不是很适用,例如。 - Kristopher Micinski
你最好将汇编转换为Brainf*ck语言,将C代码编译为汇编。 - Claudiu
2
我知道如何将C编译成汇编,但是如何将汇编编译成brainfsck呢? - MyNameIsKhan
4
顺便提一下,C2BF以源代码形式分发(因为您提到不知道如何使用它)。您必须自己编译才能使用它。下载源代码并阅读README文件和makefile,了解有关编译和使用的信息。 - bta
显示剩余2条评论
2个回答

13

C2BF 是一个以 C 源代码方式分发的 C 程序。

要构建 C2BF,您需要安装 svnGnu Make,以及 yacc 和 flex 工具。在您自己编译 C2BF 之后,它应该会按照您的期望执行。

如果您使用的是某种 Linux 系统:

cd ${HOME}
svn co https://c2bf.svn.sourceforge.net/svnroot/brainfuck/c2bf/trunk c2bf
cd c2bf
sudo apt-get install bison flex # or yum install bison flex
YACC=bison make

应该会在${HOME}/c2bf/cc/c2bf-cc中提供编译器。

如果你使用的是Windows,你需要安装类似于MinGW或cygwin这样的工具来编译这个东西。


-1

我只能推荐使用https://brainfuck.antosser.xyz/
这是一个可以将易于阅读的代码编译成Brainfuck的网站。它不是C语言,但有非常容易学习的语法。

例如,在十进制系统中打印所有可被3整除的1到100的数字将是:

var i 3
var newl 10

#while i
  printdec i
  print newl

  add i 3

  #if i num 102
    set i 0
  #end
#end
#end

编译器非常优化,可以生成高度压缩的代码,就像这样

>>>>>>>>>+++>++++++++++<[<<<<<<<<<[-]>>[-]>>>>>[-]<<<[-]>>>>>[-<<<+>>>]<<<[->>>+<<<<<<<+>>>>]<<<<<[-
]>[-<+>]<[->>>>>>+[-<+>]<[->+>+<<]<++++++++++>>>[-<<<->>>]<<<[->+<]>[[-]<+>]<-[[-]>>[-]<<<<<+>>>]<<<
<]>[->>>>+<<<<]>>>>>[-<<<<<+>>>>>]<[->+<]>>[-]<[->+<]>[-<<<<+[->>+<<]>>[-<<+<+>>>]<++++++++++<<[->>-
<<]>>[->+<]>[[-]<+>]<-[[-]<[-]>>>+<<]>>>]<[-<+>]<<<[->>>+<<<]>>[-<<+>>]<<[->>+<<]>>[-<<+>>>>+<<]>>[-
<<+>>]<<[->>+<<<+>]<[[-]>++++++++[<<++++++>>-]<<.>]>>[-<+>]<[->+>+<<]>>[-<<+>>]<<[->>+<<<+>]<[[-]>++
++++++[>++++++<-]>.<<]>>>[-]<<++++++++[<<<<++++++>>>>-]<<<<.>>>>>>>>.<+++[-<<<+>>>]<<<[->>>+<<<<<<+>
>>]++++++++++[<++++++++++>-]<++<<[->>-<<]>>[->+<]>[[-]<+>]<-[[-]>>>>[-]<<<<]>>>>]


我制作了编译器,让你可以在2分钟内编写一些代码,然后非常容易地将其编译成Brainfuck。该片段的工作原理是通过将所有操作转换为二进制,然后将它们转换为十进制来实现的,这实际上非常慢。您看到的所有低效都是因为代码只有11行。相反,您可以手动创建3个变量以获得十进制位数,那样的代码将非常高效。我称之为高度压缩,因为有一个非常聪明的算法可以最小化指针移动。简而言之:如果您想要更有效地编写它,那么可以这样做。 - Antosser
我不会称这为“高度压缩”; 像大多数机械生成的脑交通代码一样,它的长度是它需要的长度的四到五倍。(生成良好的脑交通代码很难。) 一些可能改进的迹象:将已经为零的东西归零。(一个小问题,表现出更大的问题。) 来回移动而不是按最有效的顺序执行任务。过多地移动和复制变量。近似重复的代码:两个循环,每个循环超过80个命令,用于“从1s进位到10s”和“从10s进位到100s”;三份“添加48并输出”的副本。 - Daniel Cristofani
主要问题不在于您将i存储在单元格中,然后使用“printdec”代码将其转换为十进制进行输出;而是您的printdec代码超过了500个字节,而它本可以只有100或120个字节。 - Daniel Cristofani
@DanielCristofani 重点是它很容易。你仍然可以编写更有效率的代码,但会牺牲可读性。 - Antosser
一个更高效的printdec实现(例如https://dev59.com/j9X8oIgBc1ULPQZFAyFa#75543158)不会降低可读性,也不会使“printdec i”这一行变得不易读。我知道你想让生成brainfuck程序变得容易。这是一个流行的冲动,但我从来没有理解过它。如果有人对在brainfuck中编程的体验不感兴趣,无论是作为一个谜题还是为了发展技能和创造美丽的事物,那么为什么不直接用高级语言编码并将其编译成高效的机器代码呢?如果你不喜欢brainfuck,为什么要折腾brainfuck呢? - Daniel Cristofani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接