NOTE: This post includes some funky spacing things so if it doesn't show up properly I'll try to fix it.
So I'm taking a short interlude with this post because I'm currently talking about dynamic languages, but my schedule has been a bit crazy and I thought this language would make an interesting (though mostly useless) topic.
Brainf**k is a
Turing-complete language implemented with 8 symbols: ">", "<", "+", "-", ".", ",", "[", "]". This means that it is "theoretically capable of computing any computable function or simulating any other computational model, if given an unlimited memory store" [
Wikipedia]. However, it only uses 8 characters, so it tends to be a bit unreadable
What does it look like? Basically, any character except one of the 8 symbols (including whitespace) above is considered a comment. This makes it an extremely concise language.
BF (as it is commonly acronymed) programs run in a simple virtual machine that contains an array of 30,000 bytes, each one initialized to zero and a single pointer that can point to a slot in that array initialized to point to the first element in the array. The commands have the following meanings:
Character - Meaning
- '>' - increment the pointer (to point to the next cell to the right).
- '<' - decrement the pointer (to point to the next cell to the left).
- '+' - increment (increase by one) the byte at the pointer.
- '-' - decrement (decrease by one) the byte at the pointer.
- '.' (dot) - output the value of the byte at the pointer.
- ',' (comma) - accept one byte of input, storing its value in the byte at the pointer.
- '[' - jump forward to the command after the corresponding ] if the byte at the pointer is zero.
- ']' - jump back to the command after the corresponding [ if the byte at the pointer is nonzero.
(Source: Wikipedia)
If you are familiar with C, then these C equivalents may be more understandable (where 'ptr' is of type 'unsigned char*' and points to the first element in an array of 30,000 zeroed bytes)
brainf**k command - C equivalent
- '>' - ++ptr;
- '<' - --ptr;
- '+' - ++*ptr;
- '-' - --*ptr;
- '.' - putchar(*ptr);
- ',' - *ptr=getchar();
- '[' - while (*ptr) {
- ']' - }
(Source: Wikipedia)
So, what does a BF program look like? Here's the hello world program:
++++++++++
[>+++++++>++++++++++>+++>+<<<<-] The initial loop to set up
useful values in the array
>++. Print 'H'
>+. Print 'e'
+++++++. Print 'l'
. Print 'l'
+++. Print 'o'
>++. Print ' '
<<+++++++++++++++. Print 'W'
>. Print 'o'
+++. Print 'r'
------. Print 'l'
--------. Print 'd'
>+. Print '!'
>. Print newline
Remember that only the 8 symbols are considered by the interpreter, so this program is equivalent to the one below which is in a more compact form:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>
++.<<+++++++++++++++.>.+++.------.--------.>+.>
So, why does anyone write programs in BF? Because they can! Writing programs in BF is purely a matter of pride, since they are quite inefficient (due to only having increment/decrement operations) and difficult to read. Some programmers even write BF interpreters when they are learning new languages because its so simple to write, but a little more complicated than a "Hello, World!" application.
Well, thats Brainf**k, an extremely concise and useless language *grin*. I'm hoping to get a post on Python out soon. Until next time, keep learning languages!