BrainF - A Complete Guide
So, I bet you've all seen in BrainF in Repl.it's list of languages and wondered, "what on Earth's this?" You clicked on it, and opened up the examples. There's a load of horribly confusing-looking code, using only 8 characters. Well, here's a tutorial to teach you how to use the programming language which is true to its name.
1. How the language works
BrainF works using memory cells. Repl.it's BrainF IDE, like most, has 30,000 memory cells, each of which can hold a single byte (some have fewer, most commonly mobile apps, like BrainFudge for Android which only has 300). There is a pointer, which always selects a single cell. The language works by moving the pointer and changing the value of the current cell - you can only ever handle the cell that is selected. When the program starts, every cell holds 0 and the pointer points to cell 0.
2. The characters
As I mentioned earlier, BrainF uses only 8 characers: > < + - [ ] , .
- > <
- Move the pointer right and left
- + -
- Increment and decrement the value of the current cell. If the value is lowered below 0 or raised above 127, the program will still function and the cells will retain their values, but they will not be printable.
- Take the value of the current cell, and print the ASCII character with that value
- Take an input of a single character, and store that character's ASCII value to the current cell, overwriting any existing data in that cell. If more than one character is provided, the Repl.it IDE will ignore any after the first.
- [ ]
- This is where it gets more complicated: these two characters are what allow you to create a loop in BrainF.
- When [ is reached, if the value of the current cell is 0, the program will skip to the corresponding ]; if the value of the current cell is not 0, the program will keep running
- When ] is reached, if the value of the current cell is 0, the program will keep running. If the value of the current cell is not 0, the program will jump back to the corresponding [.
- This means that [ ] is effectively
while current_cell != 0. There are, however, 2 main things to be careful of when creating loops:
- 99 times out of 100, you want to finish an iteration of the loop with the pointer at the same place as it started
- You also need to make sure the cell in question is actually decreasing towards 0: the program doesn't do this automatically, you need to make sure you do it, otherwise you will end up with an infinite loop, which most BrainF IDEs don't like.
There are a few little handy hints you might find useful when actually writing programs in BrainF:
- Say you want to print the character
H, which has an ASCII value of 72. Instead of doing
+s, you can do something like this:
What this does:
>at the beginning moves the pointer to the second cell
+s puts a value of 8 into the second cell
- We then enter into a loop:
<takes the pointer back to the first cell, we then add 9 to the first cell, before going back to the second cell (
>) and subtracting one (
-). This loop means we add 9 to the first cell a total of 8 times, resulting in a total value of 72.
- We then move the pointer back to the first cell (
<) and print (
.) H, because H has an ASCII value of 72.
[-]sets the current cell's value to 0
Here's an example BrainF program, with comments!
4. Upvoting this tutorial
It is a strange but true scientific fact that if you upvote this tutorial, not only will you receive vee freebucks, but you will immediately find BrainF easier. All seriousness aside though, please do upvote if you enjoyed this tutorial or found it useful.
Coming (not very) soon: How to write a BrainF interpreter in Python!
One final tip: don't take my example, never put comments in your BrainF code. If you do comment it, you'll be able to come back in a month's time and actually understand your code. If this happened, the language would need renaming:
The tutorial is excellent. (wondering if the example on paragraph 3 is missing a leading greater-than sign).
BrainF is mind blowing (for me anyway!) Can a practical use be presented please. Thanks!
@rediar I really think you should get into C++. I have heard of rust as well, but C++ is more well known, has existed for longer, more machines have it, and there is more stuff made in it. so you will be able to find libraries more often in C++. ALso when you try to get something like a game engine for example, the language used on them would be C++ often. so that would be a few reasons you should learn C++. Your choice though. I dont know anything about rust
For anyone new looking at this necropost, I would actually recommend Rust.
First, I will counterargument @AustinBPark's claims
so you will be able to find libraries more often in C++
Even though C++ has more frameworks, which I will not dispute, C++ has no official package manager, while Rust has cargo (58,740 packages, 6,459,506,585 downloads overall).
more machines have it
Both Rust and C++ code are compiled languages, meaning they turn into binary files your machine can execute. More computers might come with the C++ compiler built in, but all machines can run this binary code, and shipping this software (Rust or C++) doesn't even require the end user to install anything, nullifying this claim.
like a game engine for example, the language used on them would be C++ often.
C++ is used in Unreal engine (blueprints is a better graphical alternative to C++ for Unreal though)
The thing about this is that Unreal engine's domain is TINY compared to Unity, which uses C#. If you want to get into game dev, you'll be much more successful with C#.
C++ is more well known, has existed for longer
That may be true, but how does that make a language better than another?
Now, time for my own argument.
Rust has better + safer memory management due to the fact it uses ownership instead of allocation/deallocation.
The compiler is your best friend. It is like a strict teacher, fussing about everything it can find. It encourages good coding behaviors, and makes variables immutable by default, essentially encouraging functional programming.
Personally, Rust looks cleaner than C++ in most aspects. Here are two identical pieces of code in both languages:
No wonder Rust has been the most loved programming language for 5 years in a row, while C++ took 18th most loved language (8th most dreaded language)
I wonder why +[[>+>+<<-]>+>[<<+>>-]<<.>] does what it does instead of going 1 2 3 4 5 6 7 8 9 10 11...