标签: brainfuck

Brainfuck Hello World如何实际运作?

有人把它寄给我,并声称这是Brainfuck的一个问候世界(我希望如此......)

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Run Code Online (Sandbox Code Playgroud)

通过移动指针并递增和递减东西,我知道它的基本功能......

但我仍然想知道它是如何运作的?它首先如何在屏幕上打印任何内容?它如何编码文本?我根本不明白......

esoteric-languages brainfuck

111
推荐指数
5
解决办法
6万
查看次数

脑卒中翻译的优化

作为一个帮助我学习口译和优化的练习,我都不知道,我用C编写了一个脑筋解释器.到目前为止它看起来完美无缺,尽管与其他快速相比,它在执行速度方面表现不佳口译.

有哪些方法可以改变这个解释器以提高性能(或其他方面)?

我的解释器的一个有趣的方面(虽然大多数其他人也可能这样做)是我运行一个循环,读取源输入并将每个指令转换为

struct { long instruction; long loop; }
Run Code Online (Sandbox Code Playgroud)

loop值是匹配的索引]指令,如果该指令是[,和匹配的索引[指令,如果该指令是],允许快速跳跃.我想这个'解析'过程(不需要很长时间)可以改善执行时间,而不是每次需要时进行冗余重新分析以找到匹配的方括号.

这个程序是一个有趣的测试brainfuck解释器的速度:

++++++++[->-[->-[->-[-]<]<]<]>++++++++[<++++++++++>-]<[>+>+<<-]>-.>-----.>
Run Code Online (Sandbox Code Playgroud)
  1. 解释器的第一个版本
  2. 实现Jerry Coffin的答案之后的解释器,它通过使instructionstruct instruction成为操作函数的直接指针来消除运行时循环中的巨型开关- 这比前一版本运行得慢(函数调用开销?)
  3. 解释后,扭转了以往的变化和增加的优化,以"崩溃"多个连续的非循环操作,减少循环周期- 这将运行比原来稍快

c optimization interpreter brainfuck

32
推荐指数
4
解决办法
4457
查看次数

编译器C到Brainfuck(用于骚扰教授)?

我的一位教授说他会接受我们想要使用的任何语言的家庭作业.我的条款足够好,我想与他混淆一点并使用brainfuck,空格或一些同样"有用"的语言提交有效的家庭作业.

我有一些简单的数值分析例程的C源代码,以及它们生成的编译输出和汇编文件.

有没有人知道一个反编译器(或C-> brainfuck翻译器)可以给我一些类似于"brainfuck源代码"的东西?

c brainfuck decompiler

26
推荐指数
2
解决办法
9094
查看次数

在brainfuck程序中检测无限循环

我用MATLAB脚本语言编写了一个简单的brainfuck解释器.它被随机的bf程序执行(作为遗传算法项目的一部分).我面临的问题是,程序在相当多的情况下都会出现无限循环,因此GA会陷入困境.
所以,我需要一种机制来检测无限循环并避免在bf中执行该代码.
一个明显的(微不足道的)案例是我有的时候

[]
Run Code Online (Sandbox Code Playgroud)

我可以检测到这一点并拒绝运行该程序.
对于非平凡的情况,我发现基本思想是:确定循环的一次迭代如何改变当前单元格.如果变化为负,我们最终将达到0,所以这是一个有限的循环.否则,如果更改是非负的,则它是无限循环.
对于单个循环来说,实现这一点很容易,但是使用嵌套循环会变得非常复杂.例如,(在下面的(1)中指的是单元格1的内容等)

++++ Put 4 in 1st cell (1)
>+++ Put 3 in (2)
<[   While( (1) is non zero)
    --   Decrease (1) by 2
    >[   While( (2) is non zero)
        -    Decrement (2)
        <+   Increment (1) 
    >]   
    (2) would be 0 at this point
    +++  Increase (2) by 3 making (2) = 3
<]   (1) was decreased by 2 and then increased by 3, so net effect is increment
Run Code Online (Sandbox Code Playgroud)

因此代码会一直运行.然而,对单元格1上的+和 - 的完成次数的天真检查会说-s的数量更多,因此不会检测到无限循环. …

algorithm interpreter infinite-loop halting-problem brainfuck

22
推荐指数
4
解决办法
5731
查看次数

C to brainfuck编译器?

我有一个C语言的基本程序,我希望转换为语言brainfsck,但无法找到关于这个主题的任何内容.我发现许多"脑力转向C"转换器,但不是相反.我找到了C2BF,但不明白如何使用它,或者这是我需要的.

c brainfuck

19
推荐指数
1
解决办法
1万
查看次数

端口dos2unix到brainfuck

在SuperUser.com上讨论了无用的答案,并发现自己挑战另一张海报来回答brainfuck中的问题.他并没有接受我,但现在我很好奇.

所有程序需要做的是将CRLF行结尾转换为LF(dos-style到unix).周围的任何bf编码器可以帮忙吗?

dos2unix carriage-return brainfuck

18
推荐指数
2
解决办法
1104
查看次数

Brainfuck比较2个数字大于或小于

如何将两个数字与不等式进行比较?(大于或小于)

我想比较一位数例如

1 2
5 3
9 2
Run Code Online (Sandbox Code Playgroud)

等等

brainfuck

16
推荐指数
2
解决办法
5422
查看次数

如何在brainfuck中读取多位数字

我想用bf读取任意数字的数字.如果我手动设置,我知道如何读取正确的位数,如下所示:

,>,>, 2 Read in 3 digits
<< 0
--------
--------
--------
--------
--------
-------- 45 decrements
> 1
--------
--------
--------
--------
--------
--------
> 2
--------
--------
--------
--------
--------
--------

[>+<-]< 1 Copy digit 3 to cell 3

[>>++++++++++<<-]< Copy 10 * digit 2 to cell 3

Copy 100 * digit 1 to cell 3
[>>>>++++++++++ 4
    [<++++++++++>-] 4
<<<<-]>>> 3

>++++++++++..< Add 2 line breaks

., Print and Pause
Run Code Online (Sandbox Code Playgroud)

但我宁愿能够设置一个数字cell 0然后自动乘以每个数字的正确次数.我最好做什么?

math brainfuck

15
推荐指数
1
解决办法
2962
查看次数

在brainfuck中打印一个号码?

我已经搜索了一段时间,但我找不到任何可以帮助我的东西.

假设第一个单元格(或值等)等于165.我如何打印"165"?

我的想法是将数字分成单独的部分:1,6和5.打印它们不是问题.

注意:我不只是想打印"165".我想打印第一个单元格的值.无论是165,255,0,1还是其他任何东西.

brainfuck

15
推荐指数
2
解决办法
6146
查看次数

制作JIT编译器

我写了一个像这样工作的Brainfuck实现(C++):

  1. 读取输入的brainfuck文件
  2. 做一些微不足道的优化
  3. 将brainfuck转换为VM的机器代码
  4. 在VM中执行此机器代码

这是非常快的,但现在瓶颈在于VM.它是用C++编写的,并且读取一个令牌,执行一个动作(如果你知道Brainfuck就不会有很多动作)等等.

我想要做的是剥离VM并动态生成本机机器代码(基本上是一个JIT编译器).这可以很容易地加速20倍.

这意味着步骤3将被JIT编译器替换,步骤4将被执行生成的机器代码.

我不知道从哪里开始,所以我有几个问题:

  1. 这是如何工作的,生成的机器代码如何执行?
  2. 是否有用于生成本机机器代码的C++库?

c++ jit brainfuck

13
推荐指数
2
解决办法
6944
查看次数