Brainfuck
- Appeared in:
- 1993
- Influenced:
- Paradigm:
- Typing discipline:
- File extensions:
- .bf
- Dialects:
- Versions and implementations (Collapse all | Expand all):
Brainfuck is a minimalistic esoteric programming language.
Brainfuck was created in 1993 by Urban Müller, and his implementation remains a de facto standard. Its specification is as simple as 8 commands, so it hasn’t passed standardization, and it has lots of amateur implementations, none of which are of commercial value.
However, Brainfuck has spawned lots of dialects, varying in the set of commands, in the way they are written or in minor implementation details like cell size or erroneous behavior.
Brainfuck was invented in an attempt to create a Turing-complete programming language with the smallest possible compiler. The original compiler was as small as 240 bytes, and some later implementations are smaller than 200 bytes.
Brainfuck is probably the most famous of esoteric programming languages. It is indeed Turing-complete and thus theoretically capable of executing any real-life task. However, this language is absolutely unfit for any real-life development: doing even the simplest things turns out to be a challenge for the programmer, so it is used only as math model or a kind of puzzle.
Brainfuck creation was inspired by False. Its six commands (except for I/O related ones) are exactly the same as the ones used in P”, but it’s unknown whether this language influenced Brainfuck development.
Brainfuck uses a machine model similar to Turing machine, consisting of the following elements:
- program is a sequence of one-character language commands and (optionally) other characters which are ignored;
- instruction pointer points at the command to be executed on the next step, and moves to another (typically next) command afterwards;
- memory is modeled with a one-dimensional array of cells, each cell stores one byte and is initialized with 0;
- data pointer points at the current memory cell; is initialized to point to the leftmost cell of the array, and can move or modify the value stored at the cell it points to (in accordance to the commands);
- input and output streams are sequences of bytes in ASCII encoding.
The commands of the language are the following:
-
+: increment the value stored in the current cell; -
-: decrement the value stored in the current cell; -
>: increment the data pointer (move it to the next cell to the right); -
<: decrement the data pointer (move it to the next cell to the left); -
[: “begin loop”: if the value in the current cell is positive, increment the instruction pointer (move it to the next command to the right), otherwise move it to the next command to the right of the matching]command; -
]: “end loop”: if the value in the current cell is zero, increment the instruction pointer, otherwise move it to the next command to the right of the matching[command. Can also be interpreted as unconditional jump to the matching[command, since[performs an extra check itself; -
.: print the value stored at the current cell to the output stream as a character with corresponding ASCII-code; -
,: read the character from the input stream and store its ASCII-code to the current cell.
Note that due to language specifics [ and ] commands are used not only for implementing loops but in most actions which are elementary in other languages (like value assignment, mathematical and logical operations, if-then-else constructs etc.).
All characters other than these eight are ignored, so the comments can be added freely as long as they don’t contain command characters.
Examples:
Hello, World!:
Example for versions EsCo 0.511 (Brainfuck), Müller's Brainfuck 2.0There are lots of ways to say “Hello, World!” in Brainfuck. Here is the simplest one: use only one memory cell, and change its value to ASCII-code of each letter in row. Each line of the example prints one letter.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+++++++++++++++++++++++++++++.
+++++++.
.
+++.
-------------------------------------------------------------------.
------------.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++.
+++.
------.
--------.
-------------------------------------------------------------------.
Hello, World!:
Example for versions EsCo 0.511 (Brainfuck), Müller's Brainfuck 2.0In this example we use three memory cells — first for uppercase letters ‘H’ and ‘W’, second for lowercase letters and third for special characters ‘,’, ‘ ‘ and ‘!’ — and three index cells to shorten the notation of ASCII-codes changes. The memory used looks like this:
(index cell 1) (uppercase letters cell) (index cell 2) (lowercase letters cell) (index cell 3) (special characters cell)
++++++[>++++++++++++<-]>.
>++++++++++[>++++++++++<-]>+.
+++++++.
.
+++.
>++++[>+++++++++++<-]>.
<+++[>----<-]>.
<<<<<+++[>+++++<-]>.
>>.
+++.
------.
--------.
>>+.
Fibonacci numbers:
Example for versions EsCo 0.511 (Brainfuck), Müller's Brainfuck 2.0This example uses iterative definition of Fibonacci numbers. A high-level description of what it does is: store two last numbers in variables c4 and c5 (initially c4=0, c5=1), print the number stored in c5 (this operation takes the major part of the code), calculate next number (c6 = c5+c4), and move the numbers sequence one number back (c4 = c5, c5 = c6). A low-level description is given in the comments, notation “cXvY” meaning that after execution of the commands in the line the data pointer is at cell X, and the value at this cell is Y. A total of 12 memory cells is used.
This example uses one minor cheat: classic Brainfuck interpreter uses byte variables to store values of memory cells, so Fibonacci numbers 14 through 16 will cause overflow. Writing long arithmetics in Brainfuck is a bit of overkill, so in this example we assume that memory cells can store integer values.
++++++++++++++++++++++++++++++++++++++++++++ c1v44 : ASCII code of comma
>++++++++++++++++++++++++++++++++ c2v32 : ASCII code of space
>++++++++++++++++ c3v11 : quantity of numbers to be calculated
> c4v0 : zeroth Fibonacci number (will not be printed)
>+ c5v1 : first Fibonacci number
<< c3 : loop counter
[ block : loop to print (i)th number and calculate next one
>> c5 : the number to be printed
block : divide c5 by 10 (preserve c5)
> c6v0 : service zero
>++++++++++ c7v10 : divisor
<< c5 : back to dividend
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<] c5v0 : divmod algo; results in 0 n d_n%d n%d n/d
>[<+>-] c5 : move dividend back to c5 and clear c6
>[-] c7v0 : clear c7
>> block : c9 can have two digits; divide it by ten again
>++++++++++ c10v10: divisor
< c9 : back to dividend
[->-[>+>>]>[+[-<+>]>+>>]<<<<<] c9v0 : another divmod algo; results in 0 d_n%d n%d n/d
>[-] c10v0 : clear c10
>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]c12v0 : print nonzero n/d (first digit) and clear c12
<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c11v0 : print nonzero n%d (second digit) and clear c11
<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-] c8v0 : print any n%d (last digit) and clear c8
<<<<<<<.>. c1c2 : print comma and space
block : actually calculate next Fibonacci in c6
>>[>>+<<-] c4v0 : move c4 to c6 (don't need to preserve it)
>[>+<<+>-] c5v0 : move c5 to c6 and c4 (need to preserve it)
>[<+>-] c6v0 : move c6 with sum to c5
<<<- c3 : decrement loop counter
]
<<++... c1 : output three dots
Factorial:
Example for versions EsCo 0.511 (Brainfuck), Müller's Brainfuck 2.0This example uses iterative definition of factorial. Last calculated factorial is stored in variable c6 and on each step it is multiplied by next number (stored in c5). A low-level description is given in the comments, notation “cXvY” meaning that after execution of the commands in the line the data pointer is at cell X, and the value at this cell is Y. A total of 13 memory cells is used.
This example uses one minor cheat: classic Brainfuck interpreter uses byte variables to store values of memory cells, so 6! and further will cause overflow. Writing long arithmetics in Brainfuck is a bit of overkill, so in this example we assume that memory cells can store integer values. Besides, factorial length grows fast along with execution time of Brainfuck program, so the above code is limited to calculating and printing first 7 factorials.
+++++++++++++++++++++++++++++++++ c1v33 : ASCII code of !
>++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++ c2v61 : ASCII code of =
>++++++++++ c3v10 : ASCII code of EOL
>+++++++ c4v7 : quantity of numbers to be calculated
> c5v0 : current number (one digit)
>+ c6v1 : current value of factorial (up to three digits)
<< c4 : loop counter
[ block : loop to print one line and calculate next
>++++++++++++++++++++++++++++++++++++++++++++++++. c5 : print current number
------------------------------------------------ c5 : back from ASCII to number
<<<<.-.>.<.+ c1 : print !_=_
>>>>> block : print c6 (preserve it)
> c7v0 : service zero
>++++++++++ c8v10 : divizor
<< c6 : back to dividend
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<] c6v0 : divmod algo borrowed from esolangs; results in 0 n d_n%d n%d n/d
>[<+>-] c6 : move dividend back to c6 and clear c7
>[-] c8v0 : clear c8
>> block : c10 can have two digits; divide it by ten again
>++++++++++ c11v10: divizor
< c10 : back to dividend
[->-[>+>>]>[+[-<+>]>+>>]<<<<<] c10v0 : another divmod algo borrowed from esolangs; results in 0 d_n%d n%d n/d
>[-] c11v0 : clear c11
>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]c13v0 : print nonzero n/d (first digit) and clear c13
<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c12v0 : print nonzero n%d (second digit) and clear c12
<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-] c9v0 : print any n%d (last digit) and clear c9
<<<<<<. c3 : EOL
>>+ c5 : increment current number
block : multiply c6 by c5 (don't preserve c6)
>[>>+<<-] c6v0 : move c6 to c8
>> c8v0 : repeat c8 times
[
<<<[>+>+<<-] c5v0 : move c5 to c6 and c7
>>[<<+>>-] c7v0 : move c7 back to c5
>-
]
<<<<- c4 : decrement loop counter
]
Hello, World!:
Example for versions Müller's Brainfuck 2.0This example is a Brainloller translation of this example. Since Brainloller is a fully graphical language, no source code is available, see screenshots instead.
"Hello, World!" example in Brainloller
"Hello, World!" example in Brainloller (10x scale)
Fibonacci numbers:
Example for versions Müller's Brainfuck 2.0This example is a Brainloller translation of this example. Since Brainloller is a fully graphical language, no source code is available, see screenshots instead.
Fibonacci numbers example in Brainloller
Fibonacci numbers example in Brainloller (10x scale)
Hello, World!:
Example for versions Müller's Brainfuck 2.0The program itself is too large, so it is given in shortened way. This example is a translation of second Brainfuck example.
A string of
118813560323277653191662803047326384277538345326678115429767453537450
292866914557015460910172702778221910307831726746340921263104469613504
59705393993241449826477775919360678577399889787062444 zeroes (approximately 1*10^190).
Fibonacci numbers:
Example for versions Müller's Brainfuck 2.0The program itself is too large, so it is given in shortened way. This example is a translation of Brainfuck example.
A string of
16796766510573119855705549663938594333227880389793569753609943882819766524140316
01658808636224315827845952687692681839402697562101473056557040257629116072440686
91728105306566342622386432823429136972542304655647901781271798433263001837026612
85134526403156217403965780274824570539852823799332052094272023959754058353693422
00296265734064700887574273931430009663106112490375879932163659938041861650976201
68960460854977571944373603975793034586829061577464233522714007498991416860375267
53519364863679509647278920372950503488700163496668142058963746864990825740726092
35908317763083566843266577745921100986433613244261564318644379427814959795559606
08253552679248495326880775320385281559763269974848026839024530519989287202261977
27237772362250247980917413250583764864103356994590618251889214221970648391775710
80865227632803889157724447272384838119234564403632606105714710341397363129762551
422883794119894049017738035
zeroes (approximately 1.7*10^906)
Hello, World!:
Example for versions EsCo 0.511 (Brainfuck)This example is Ook! translation of second Brainfuck example.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook?
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook! Ook! Ook? Ook!
Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook?
Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook? Ook! Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.
Hello, World!:
Example for versions EsCo 0.511 (Brainfuck)This example is Spoon translation of second Brainfuck example. Note that the intended way of coding in Spoon allows writing commands without delimiters, but current version of EsCo requires that commands are space-separated.
1111110010001011111111111101100000110100010100101111111111001000101111111111011000001101
0100101011111110010100010101110010100101111001000101111111111101100000110100010100111110
0100010000000000000011000001101000101001101101101101111100100010111110110000011010001010
0100100010101110010100000000000000000000010100000000000000000000000000010100100101001010
Comments
]]>blog comments powered by Disqus
]]>