Brainfuck
Dieses Buch oder diese Seite wurde zur Löschung vorgeschlagen.
Dieses Buch oder diese Seite erfüllt nach Ansicht des Antragstellers die Qualitätskriterien der Wikibooks nicht – das Buch beziehungsweise die Seite sollte daher verbessert werden. Geschieht dies nicht, wird das Buch beziehungsweise die Seite nach Ablauf einer Frist von zwei Wochen gelöscht. Auf der unten angegebenen Seite kann gegen die Löschung Einspruch erhoben werden. Begründung:
|
Dieses Buch steht im Regal Programmierung.
Zusammenfassung des Projekts
[Bearbeiten]- Buchpatenschaft/Ansprechperson: Benutzer:Worthefre
Vorwort
[Bearbeiten]Brainfuck ist eine esoterische Programmiersprache. Brainfuck ist also nicht wirklich nutzbar. Das besondere an Brainfuck ist, dass es nur 8 Befehle gibt:
- +
- -
- <
- >
- .
- ,
- [
- ]
Compiler sind daher sehr klein. Trotzdem ist Brainfuck Turingvollständig, das heißt, dass jedes Programm, das zum Bsp. in C verfasst worden ist, auch in Brainfuck geschrieben werden kann.
Grundlagen
[Bearbeiten]Brainfuck besteht aus einem unendlich langem Band, welches in ein Byte große Teile aufgeteilt ist. Anfangs haben alle den Wert 0. Die Werte gehen von 0 bis 255. Startpunkt ist die Mitte. Mit den Befehlen "<" und ">" bewegt man sich hin und her auf dem Band. Mit "+" und "-" wird der aktuelle Teil um eins erhöht bzw. um ein verkleinert. Wenn 255 um eins erhöht wird, ist es 0 und umgekehrt. Mit "." und "," wird der aktuelle Teil ausgegeben bzw. eingelesen (im ASCII-Zeichensatz), wobei 255 EOF bedeutet. Die Befehle "[" und "]" bilden ein Paar und können verschachtelt werden. "[" springt, sofern der aktuelle Teil 0 ist, hinter die entsprechende "]". "]" springt vor die zugehörige "[".
Die Befehle werden einfach aneinander gereiht. Zeichen, die keine Befehle sind, werden ignoriert, womit Kommentare gebildet werden können.
Compiler
[Bearbeiten]Der hier gezeigte Compiler übersetzt erst mal in C, welches dann mittels gcc in Maschinencode compiliert werden kann:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define FELD_SIZE 512
void printHead()
{
printf("#include <stdio.h>\n");
printf("#include <stdlib.h>\n");
printf("\nunsigned char feldA[%d];", FELD_SIZE);
printf("\nunsigned char *feld;");
printf("\nint main()\n");
printf("{\n");
printf("feld = &feldA[0];\n");
printf("feld += %d;\n", FELD_SIZE / 2);
return;
}
void printFoot()
{
printf("}\n");
return;
}
void nextline()
{
int c;
while((c = getchar()) != EOF)
if(c == '\n')
return;
return;
}
int main()
{
int c;
printHead();
while((c = getchar()) != EOF)
{
switch(c)
{
case '>': printf("feld++;\n"); break;
case '<': printf("feld--;\n"); break;
case '+': printf("(*feld)++;\n"); break;
case '-': printf("(*feld)--;\n"); break;
case '.': printf("putchar(*feld);\n"); break;
case ',': printf("*feld = getchar();\n"); break;
case '[': printf("while(*feld)\n{\n"); break;
case ']': printf("}\n"); break;
}
}
printFoot();
return 0;
}
FELD_SIZE muss eventuell erhöht werden.
Beispielprogramme
[Bearbeiten]Cat
[Bearbeiten]Das Programm "cat" gibt seine Eingabe wieder aus. Das Programm:
,+[-.,+]
Das "+" ist nötig, weil EOF 255 ist und nicht 0. Wenn die Eingabe nicht einmal sondern mehrfach ausgegeben werden soll, müssen so viele Punkte wie benötigte Ausgaben statt einem geschrieben werden. Z.b:
,+[-...,+]
Hello World
[Bearbeiten]Das Standard-Hello-World-Programm schreibt man in Brainfuck so:
++++++++++[>+++++++>++++++++++>++++>+++>+<<<<<-]>++.>+.+++++++..+++.>++++.>++.<<<+++++++++++++++.>.+++.------.--------.>>>>+++[->+++++++++++<]>.>++[->+++++<]>.