Wednesday, 16 March 2011

Brainfuck Programming language.

The brainfuck programming language is an esoteric programming language noted for its extreme minimalism. It is a Turing tarpit, designed to challenge and amuse programmers, and is not suitable for practical use. Its name has been variously bowdlerized, sometimes appearing as brainf***, brainf*ck, brainfsck, b****fuck or BF. The name of the language is generally not capitalized except at the start of a sentence, although it is a proper noun.


Brainfuck is created by Urban Muller, whose goal was apparently to create a Turing-complete language for which he could write the smallest compiler ever, for the Amiga OS 2.0. His compiler was 240 bytes in size.
A Brainfuck program has an implicit byte pointer, called "the pointer", which is free to move around within an array of 30000 bytes, initially all set to zero. The pointer itself is initialized to point to the beginning of this array. The Brainfuck programming language consists of eight commands, each of which is represented as a single character.

>   Increment the pointer.
<   Decrement the pointer.
+   Increment the byte at the pointer.
-    Decrement the byte at the pointer.
.    Output the byte at the pointer.
,    Input a byte and store it in the byte at the pointer.
[    Jump forward past the matching ] if the byte at the pointer is zero.
]    Jump backward to the matching [ unless the byte at the pointer is zero.

The semantics of the Brainfuck commands can also be succinctly expressed in terms of C, as follows (assuming that p has been previously defined as a char*):

>   becomes ++p;
<   becomes --p;
+   becomes ++*p;
-    becomes --*p;
.    becomes putchar(*p);
,    becomes *p = getchar();
[    becomes while (*p) {
]    becomes }

The following program prints "Hello World!" and a newline to the screen:

+++++ +++++  initialize counter (cell #0) to 10
[       use loop to set the next four cells to 70/100/30/10
> +++++ ++      add 7 to cell #1
> +++++ +++++     add 10 to cell #2
> +++   add 3 to cell #3
> +   add 1 to cell #4
<<<< -   decrement counter (cell #0)
]

> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'

For readability, this code has been spread across many lines and blanks and comments have been added. Brainfuck ignores all characters except the eight commands +-<>[],. so no special syntax for comments is needed (as long as the comments don't contain the command characters).

The code could just as well have been written as:

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

No comments:

Post a Comment