有人把它寄给我,并声称这是Brainfuck的一个问候世界(我希望如此......)
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Run Code Online (Sandbox Code Playgroud)
通过移动指针并递增和递减东西,我知道它的基本功能......
但我仍然想知道它是如何运作的?它首先如何在屏幕上打印任何内容?它如何编码文本?我根本不明白......
作为一个帮助我学习口译和优化的练习,我都不知道,我用C编写了一个脑筋解释器.到目前为止它看起来完美无缺,尽管与其他快速相比,它在执行速度方面表现不佳口译.
有哪些方法可以改变这个解释器以提高性能(或其他方面)?
我的解释器的一个有趣的方面(虽然大多数其他人也可能这样做)是我运行一个循环,读取源输入并将每个指令转换为
struct { long instruction; long loop; }
Run Code Online (Sandbox Code Playgroud)
该loop值是匹配的索引]指令,如果该指令是[,和匹配的索引[指令,如果该指令是],允许快速跳跃.我想这个'解析'过程(不需要很长时间)可以改善执行时间,而不是每次需要时进行冗余重新分析以找到匹配的方括号.
这个程序是一个有趣的测试brainfuck解释器的速度:
++++++++[->-[->-[->-[-]<]<]<]>++++++++[<++++++++++>-]<[>+>+<<-]>-.>-----.>
Run Code Online (Sandbox Code Playgroud)
instructionstruct instruction成为操作函数的直接指针来消除运行时循环中的巨型开关- 这比前一版本运行得慢(函数调用开销?)我的一位教授说他会接受我们想要使用的任何语言的家庭作业.我的条款足够好,我想与他混淆一点并使用brainfuck,空格或一些同样"有用"的语言提交有效的家庭作业.
我有一些简单的数值分析例程的C源代码,以及它们生成的编译输出和汇编文件.
有没有人知道一个反编译器(或C-> brainfuck翻译器)可以给我一些类似于"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
我有一个C语言的基本程序,我希望转换为语言brainfsck,但无法找到关于这个主题的任何内容.我发现许多"脑力转向C"转换器,但不是相反.我找到了C2BF,但不明白如何使用它,或者这是我需要的.
我在SuperUser.com上讨论了无用的答案,并发现自己挑战另一张海报来回答brainfuck中的问题.他并没有接受我,但现在我很好奇.
所有程序需要做的是将CRLF行结尾转换为LF(dos-style到unix).周围的任何bf编码器可以帮忙吗?
我想用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然后自动乘以每个数字的正确次数.我最好做什么?
我已经搜索了一段时间,但我找不到任何可以帮助我的东西.
假设第一个单元格(或值等)等于165.我如何打印"165"?
我的想法是将数字分成单独的部分:1,6和5.打印它们不是问题.
注意:我不只是想打印"165".我想打印第一个单元格的值.无论是165,255,0,1还是其他任何东西.
我写了一个像这样工作的Brainfuck实现(C++):
这是非常快的,但现在瓶颈在于VM.它是用C++编写的,并且读取一个令牌,执行一个动作(如果你知道Brainfuck就不会有很多动作)等等.
我想要做的是剥离VM并动态生成本机机器代码(基本上是一个JIT编译器).这可以很容易地加速20倍.
这意味着步骤3将被JIT编译器替换,步骤4将被执行生成的机器代码.
我不知道从哪里开始,所以我有几个问题:
brainfuck ×10
c ×3
interpreter ×2
algorithm ×1
c++ ×1
decompiler ×1
dos2unix ×1
jit ×1
math ×1
optimization ×1