我对PyPy项目非常感兴趣,但对于下面列出的第一个(但不太知名)的目的:
在以下博文中,http://morepypy.blogspot.com/2011/04/tutorial-writing-interpreter-with-pypy.html和http://morepypy.blogspot.com/2011/04/tutorial-part -2-adding-jit.html有关于如何使用RPython实现脑力叉解释器的详细教程,并添加了一个JIT.
但是我在其他地方读过RPython可能很麻烦 - 为动态类型创建的语法突然限制为推断的静态类型导致难以理解的编译错误.
所以我的问题是,是否有任何其他项目可以让你像上面的教程一样编写脑力翻译/ JIT?或者PyPy是这么简单的唯一选择吗?
(旁白):如果存在,一般来说RPython有什么意义?是否只是为了表明Python的子集可以是类型安全的,并且在该子集中实现了Python?在现有的翻译创建工具中做"PyPy"会更有意义吗?
我正在尝试编写一个解析和执行Brainfuck代码的小脚本,以了解GHC的优化选项,我正在尝试优化代码以便更快一些并了解正在发生的事情.
在部分是BF代码的内部represantation,我使用一个特殊的数据类型.这是源代码,包括正在进行转换的两个函数:
data BFinstruction
= AdjustValue Int
| MovePointer Int
| GetChar
| PutChar
| Loop BFcode
deriving (Eq)
type BFcode = [BFinstruction]
unsafeCompileBrainfuck :: String -> BFcode
unsafeCompileBrainfuck = fst . parse [] where
-- arguments: input string, built code; output: output code, rest of input
parse :: BFcode -> String -> (BFcode,String)
parse c ('+':s) = parse (AdjustValue 1 :c) s
parse c ('-':s) = parse (AdjustValue (-1):c) s
parse c ('>':s) = parse (MovePointer 1 :c) s …Run Code Online (Sandbox Code Playgroud) 有没有一个来源,我可以为brainfuck编程语言获得多个简单的程序,如加法,阶乘,斐波纳契和其他?
我知道此前发布了一个问题:https://stackoverflow.com/questions/3554670/tutorials-for-brainfuck
但我希望有一个简单的程序列表,简短的程序,以熟悉该语言.欢迎任何帮助.谢谢.
作为我的brainf*ck实现的调试器/测试程序,我创建了以下计数循环:
+[[>+]+]
Run Code Online (Sandbox Code Playgroud)
使用单字节,包装单元格和带有环绕的30k单元格,这将创建一个无限计数循环.它将每个单元格设置为1,然后将每个单元格设置为2,等等.
我的问题是,当它达到255时,内部循环将单元格递增为0,然后外部循环立即将其递增为1.当它溢出时,它就像一个"双步",而不是一步.这是我可以通过这个紧凑的程序让循环无限继续的唯一方法.
每个单元格的计数 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...
虽然我希望它去 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...
当前单元格为零时,很难继续循环.我玩过相同主题的变体,但没有一个能够恰到好处.
这个特殊的程序只是一个简单的测试计数程序,但是对我未来的程序真正有用的是知道如何反转循环条件,就像我需要使这个计数循环工作一样.
Brainfuck以其极小的编译器而闻名.我有一个非常小的设备,可能无法适应其数据中最小的脑圈编译器.是否有一种深奥的编程语言甚至比brainfuck更小的编译器并且是一种图灵完整的语言? 这已经老了,但是请随时提出自己的答案,我会检查
所以我正在研究一个读取文件然后再将其输出的程序,但是我无法让程序在文件末尾停止输入.我希望它停在特定的字符,如'0'或'$'或任何真正的因为一个字符NULL无法读入我的brainf解释器.这是迄今为止的代码:
>+[>,][<.]
Run Code Online (Sandbox Code Playgroud)
问题始于此,[>,]因为输入永远不会为NULL,此循环永远不会结束.
那么如何插入if语句,如果它到达预先指定的结束字符,它将终止此循环?
我在Brainfuck尝试了这个hello world程序.如何多次打印文本?这是我的代码:
+++++++[>++++++++++ <- ] >++.>++++++[>++++++++++ <- ] >+++++++++.>+++++++[>++++++++++ <- ] >++++++..>+++++++[>++++++++++ <- ] >+++++++++.>+++[>++++++++++ <-]>++. >++++++++[>++++++++++<-]>+++++++.>+++++++[>++++++++++<-] >+++++++++.>++++++++[>++++++++++ <-]>++.>+++++++[>++++++++++ <- ] >++++++.>++++++[>++++++++++ <-]>++++++++.>+++[>++++++++++<-]>++.>+++[>++++++++++<-]>+++.>+++[>++++++++++<-]>+++.
Run Code Online (Sandbox Code Playgroud) 以下代码片段来自维基百科,是标准的Hello World的序言!在Brainfuck的程序...
1. +++++ +++++ initialize counter (cell #0) to 10
2. [ use loop to set the next four cells to 70/100/30/10
3. > +++++ ++ add 7 to cell #1
4. > +++++ +++++ add 10 to cell #2
5. > +++ add 3 to cell #3
6. > + add 1 to cell #4
7. <<<< - decrement counter (cell #0)
8. ]
Run Code Online (Sandbox Code Playgroud)
我理解这里发生的事情的要点,但我不明白的是第3到第6行发生的事情的机制.如果+++++ +++++在值中a[0]加10 ,为什么将指针递增1并执行++*ptr7次会导致a[1]等于70?不应该a[1] = 7 …
如何检查单元格 #0 中的值是否等于单元格 #1 中的值?我正在尝试编写相当于以下内容的代码:
if(a == b)
{
//do stuff
}
else
{
//do something else
}
Run Code Online (Sandbox Code Playgroud)
我读过Brainfuck 比较 2 个数字大于或小于,第二个答案让我大致了解了我需要做什么,但我无法弄清楚。(该解决方案给出if a < b, else。)
我想我需要做一些事情来减少这两个值,如果它们同时达到 0,那么它们就是真的。但每次我想到这个问题时,我总是被困在同一个出口点。
如何检查 Brainfuck 中两个细胞是否相等?
我刚刚发现了一种编程语言,叫做 Brainfuck。
我的问题是如何在 Brainfuck 中编写 if-else 语句?
是通过比较两个单元格来完成的吗?如果是,那么我如何比较这个程序中的两个单元格?
谢谢