Brainfuck

From Computernewb Wiki
Jump to navigation Jump to search

Brainfuck is probably the most famous esoteric programming language that was created in 1993 by Urban Müller. It is noteworthy for being extremely minimal.

It is sometimes referred to as "Brainf**k", "Brain****", "Brainfsck", "*****fuck", or "BF", due to the latter half of the name being considered an offensive word in the English language. The language's name comes from the slang "brainfuck", which refers to something that is so complicated or unusual that it exceeds the limits of one person's understanding.

The language was created with the goal of having the smallest possible compiler. The compiler was originally written for AmigaOS 2.0. The language was inspired by another esoteric programming language named "FALSE", which had a 1024-byte compiler. The compiler's size was initially 296 bytes, but a second version was released later on which used only 240 bytes. As time grew on, smaller and smaller Brainfuck compilers have been made - one such compiler, made in x86 Assembly, is only 100 bytes. [1]

Overview[edit]

The language has eight commands, each consisting of a single character.

Command Description
> Move the data pointer to the right
< Move the data pointer to the left
+ Increment the memory cell under the data pointer.
- Decrement the memory cell under the data pointer.
. Output the character signified by the cell at the data pointer.
, Input a character and store it in the cell at the data pointer.
[ Jump past the matching ] if the cell under the data pointer is 0
] Jump back to the matching [ if the cell under the data pointer is nonzero

Examples[edit]

Hello World[edit]

++++++++               Set Cell #0 to 8
[
    >++++               Add 4 to Cell #1; this will always set Cell #1 to 4
    [                   as the cell will be cleared by the loop
        >++             Add 2 to Cell #2
        >+++            Add 3 to Cell #3
        >+++            Add 3 to Cell #4
        >+              Add 1 to Cell #5
        <<<<-           Decrement the loop counter in Cell #1
    ]                   Loop till Cell #1 is zero; number of iterations is 4
    >+                  Add 1 to Cell #2
    >+                  Add 1 to Cell #3
    >-                  Subtract 1 from Cell #4
    >>+                 Add 1 to Cell #6
    [<]                 Move back to the first zero cell you find; this will
                        be Cell #1 which was cleared by the previous loop
    <-                  Decrement the loop Counter in Cell #0
]                       Loop till Cell #0 is zero; number of iterations is 8

The result of this is:
Cell No :   0   1   2   3   4   5   6
Contents:   0   0  72 104  88  32   8
Pointer :   ^

>>.                     Cell #2 has value 72 which is 'H'
>---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
+++++++..+++.           Likewise for 'llo' from Cell #3
>>.                     Cell #5 is 32 for the space
<-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
<.                      Cell #3 was set to 'o' from the end of 'Hello'
+++.------.--------.    Cell #3 for 'rl' and 'd'
>>+.                    Add 1 to Cell #5 gives us an exclamation point
>++.                    And finally a newline from Cell #6

The above code is simply for readability and to be easier to understand - the exact same code can also be written like this:

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

The shortest way to write a Hello World (written by KSab) is as follows:

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