bf语言吧 关注:12贴子:66
  • 8回复贴,共1

Brainfuck 编程指南

只看楼主收藏回复




1楼2012-04-21 10:43回复
    为什么要学习 Brain****
    你也许会问,我为什么要学习这样一门貌似古怪的语言呢,它能带来什么好处么?好吧,有两个理由:
    用如此受限的语言编写程序将充分考验你的智慧
    高级语言喜欢为程序员们提供一切,让你生活在一个安逸的环境中。但在 Brain**** 的世界里却没有对象,没有函数, 没有 IF-ELSE-THEM,甚至没有变量。它强迫你思考为了完成特定的功能,究竟什么才是不可或缺的,什么又只是起辅助作用。从某种意义上说,Brain**** 更接近真实的世界。Oh, welcome back to Zion.
    这是一件好玩的事
    外人看来那只是些密密麻麻,杂乱堆砌在一起的符号,但在 Geek 们看来,它们像就是的神秘咒语,只要被正确组合起来,就能释放有无穷的魔力。


    3楼2012-04-21 10:44
    回复
      指令
      让我们看看 Brain**** 的 8 条指令——“+ – > < [ ] . , ”。嗯,它们含义简单明了。如果你学过 C 语言的话,就会发现它们与 C 语言中的编程结构可以一一对应起来。比如 + 等价于 *ptr++,> 等价于 ptr++, [ 和 ] 则等价于 while (*ptr) {}。


      4楼2012-04-21 10:44
      回复
        指令 含义
        + 当前单元内的值加 1
        - 当前单元内的值减 1
        > 让指针指向下一个单元,即指针加 1
        < 让指针指向上一个单元,即指针减 1
        [ 如果当前单元内的值为 0,跳转至对应指令 ] 的下一个位置处执行
        ] 如果当前单元内的值不为 0,跳转至对应指令 [ 的下一个位置处执行
        . 输出当前单元内的值
        , 从标准输入读取一个字符,并存入当前单元
        


        5楼2012-04-21 10:44
        回复
          编译器
          在大脑中运行 Brain**** 程序可不是一件轻松的事,用 C 为其写个编译器(或者叫解释器更恰当些)是很有必要的。
          /* filename: brain****.c */
          #include <stdio.h>
          #define match(from, to, ptr, dir, level) \
          while(*(dir ptr)) { \
          if (*ptr == to && level == 0) break; \
          if (*ptr == from) ++level; \
          if (*ptr == to) --level; \
          }
          char code[32768] = {0};
          char data[32768] = {0};
          void exec() {
          char* pc = code;
          char* p = data;;
          int level = 0;
          int ch;
          while (*pc) {
          switch(*pc) {
          case '>': ++p; break;
          case '<': –p; break;
          case '+': ++*p; break;
          case '-': –*p; break;
          case '.': putchar(*p); break;
          case ',': *p = ((ch = getchar()) == EOF) ? 0 : ch; break;
          case '[': if (!*p) match('[', ']', pc, ++, level); break;
          case ']': if ( *p) match(']', '[', pc, --, level); break;
          default: break;
          }
          pc++;
          }
          }
          int main(int argc, const char *argv[]) {
          FILE* fp = fopen(argv[1], "r");
          char* pc = code;
          int ch;
          while ((ch=fgetc(fp)) != EOF) {
          if (ch == '>' || ch == '<' || ch == '+' || ch == '-' ||
          ch == '[' || ch == ']' || ch == '.' || ch == ',')
          *(pc++) = ch;
          }
          fclose(fp);
          exec();
          return 0;
          }


          6楼2012-04-21 10:45
          回复

            我们把下面这个程序交给这个编译器运行,看看会输出些什么。
            ++++++++++[>+++++++>++++++++++>+++>+<<<<-]
            >++.>+.+++++++..+++.>++.<<+++++++++++++++.
            >.+++.------.--------.>+.>.
            没错,这就是 Brain**** 版本的 "Hello World!"


            7楼2012-04-21 10:45
            回复


              9楼2012-04-22 16:10
              回复


                10楼2012-04-22 16:52
                回复
                  嗯!


                  来自iPhone客户端12楼2012-04-23 18:25
                  回复