Brainfuck

Fra DAMNWiki
Spring til navigationSpring til søgning

Brainfuck er et meget minimalistisk, esoterisk programmeringssprog. Sproget blev udviklet i 1993 af Urban Müller og var et forsøg på at lave et Turing-komplet programmeringssprog med en meget lille compiler.

Sammenlignet med programmeringssprog til almene formål er Brainfuck svært at skrive programmer i fordi det tilbyder meget få instruktioner. Det begrænsede instruktionssæt er lige præcis tilstrækkeligt for at gøre sprogets teoretiske udtrykskraft universelt (Turing-komplet).

Sproget er derfor ikke tiltænkt som et praktisk anvendeligt sprog, men i stedet som en form for underholdning.


Brainfuck-fortolker

Nedenstående java-kode kan eksekvere brainfuck programmer. Programmet er skrevet af Andreas.

  package bf;
  
  import java.io.*;
  
  public class Brainfuck {
  
      public static void main(String[] args) throws IOException {
          if (args.length < 1) {
              System.out.println("Usage: java bf.Brainfuck file.bf");
              return;
          }
          
          String program;
          try (BufferedReader rdr = new BufferedReader(new FileReader(args[0]))) {
              program = "";
              String line;
              while ((line = rdr.readLine()) != null) {
                  program += line;
              }
          }
  
          
          int i = 0;
          char[] data = new char[30000];
          final char[] commands = program.toCharArray();
          int count = 0;
          
          for (int pos = 0; pos < commands.length; pos++) {
              char c = commands[pos];
              switch (c) {
                  case '>':
                      i++;
                      break;
                  case '<':
                      i--;
                      break;
                  case '+':
                      data[i]++;
                      break;
                  case '-':
                      data[i]--;
                      break;
                  case '.':
                      System.out.print(data[i]);
                      break;
                  case ',':
                      try (BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in))) {
                          char[] in = new char[1];
                          rdr.read(in);
                          data[i] = in[0];
                      }
                      break;
                  case '[':
                      if (data[i] == 0) {
                          count = 1;
                          while (count > 0) {
                              pos++;
                              if (commands[pos] == '[') {
                                  count++;
                              }
                              if (commands[pos] == ']') {
                                  count--;
                              }
                          }                        
                      }
                      break;
                  case ']':
                      if (data[i] != 0) {
                          count = 1;
                          while (count > 0) {
                              pos--;
                              if (commands[pos] == '[') {
                                  count--;
                              }
                              if (commands[pos] == ']') {
                                  count++;
                              }
                          }
                      }
                      break;
              }
          }
          
          System.out.println();
      }
  }

Programmer

Hello World

   >+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]
   <.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.

Ovenstående program giver følgende output:

   Hello world!

Sierpinski trekant

   [ This program prints Sierpinski triangle on 80-column display. ]
                                   >
                                  + +
                                 +   +
                                [ < + +
                               +       +
                              + +     + +
                             >   -   ]   >
                            + + + + + + + +
                           [               >
                          + +             + +
                         <   -           ]   >
                        > + + >         > > + >
                       >       >       +       <
                      < <     < <     < <     < <
                     <   [   -   [   -   >   +   <
                    ] > [ - < + > > > . < < ] > > >
                   [                               [
                  - >                             + +
                 +   +                           +   +
                + + [ >                         + + + +
               <       -                       ]       >
              . <     < [                     - >     + <
             ]   +   >   [                   -   >   +   +
            + + + + + + + +                 < < + > ] > . [
           -               ]               >               ]
          ] +             < <             < [             - [
         -   >           +   <           ]   +           >   [
        - < + >         > > - [         - > + <         ] + + >
       [       -       <       -       >       ]       <       <
      < ]     < <     < <     ] +     + +     + +     + +     + +
     +   .   +   +   +   .   [   -   ]   <   ]   +   +   +   +   +
    * * * * * M a d e * B y : * N Y Y R I K K I * 2 0 0 2 * * * * *

Ovenstående kode giver følgende output (eksekveret direkte på serveren, refresh gerne mange gange!):