娱乐一下,介绍一种语言——brainfuck
语言一共只有8个符号
+-><.,[]
brainfuck的程序全部都由这8个符号构成
初始化的时候,有一个连续的两个方向都无限长的内存,内存的每个字节值是0。
有一个指针p,指向其中一个字节。
每个符号的意义如下:
+ 指针指向的这个字节自加
- 指针指向的这个字节自减
> 指针向右移一个字节
< 指针向左移一个字节
. 输出指针指向的这个字节
, 输入这个字节,存在指针指向的这个字节
[ 如果指针指向的这个字节,则进入循环节
] 回到匹配的[(比如[--.[++>.[+]---].-],^指着的两个是匹配的])
^ ^
以下程序输出我的ID
- ++++++++++[>++++++++++[>+<-]<-]>>-.+++++++.---------.++++++++.
- >>++++[<++++[<+>-]>-]<<+.-------..
复制代码
自举编译器在39楼
C语言写的解释器在42楼
[ 本帖最后由 cjaizss 于 2008-6-9 17:05 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
以下是用sed写的一个编译器:
复制代码
我写的C语言解释器:
复制代码
[ 本帖最后由 cjaizss 于 2008-6-7 12:36 编辑 ]
准备写个brainfuck自举编译器,但是写的过程中才意识到并非那么容易。要解决一个看起来其实很微小的东西——分支,但是想不出如何解决,今天放弃,明天继续
[ 本帖最后由 cjaizss 于 2008-6-1 04:19 编辑 ]
终于写成了一个,可是我并不是很满意。我写的这个程序只接受bf语言的8个符号,如果有别的符号过来,编译的结果会是错误的,即使进来的字符是\n,\t和空格
另外就是编译器实际所需内存与源码长度成正比(在规则如此简单的语言里不应该存在这种问题,但我暂时只能想到这个办法)
假如把我那个C语言的bf解释器编译之后定为/usr/local/bin/mybf
以下编译器文件为/usr/local/bin/bf2c.bf
源文件为1.bf
则编译1.bf为1.c的命令为
bf2c.bf <1.bf >1.c
如果1.bf中含有8个符号之外的符号,一般编译则可以如下:
cat 1.bf|tr -dC '<>[]+.,-'| bf2c.bf >1.c
则bf的自举编译器如下:
复制代码
[ 本帖最后由 cjaizss 于 2008-6-7 19:24 编辑 ]
c版在深入计算理论?
呵呵,做这个纯属娱乐
优化之后的bf解释器程序bf
复制代码
[ 本帖最后由 cjaizss 于 2008-6-7 12:37 编辑 ]
楼主的工作很棒!
cjaizss真是牛X啊!不愧版主,呵呵