Zum Inhalt springen

Brainfuck

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 29. April 2004 um 21:14 Uhr durch 80.134.252.182 (Diskussion) (Restdivision hinzugefügt, Mehrfachmultiplikation in Potenzierung umbenannt, Add. u. Sub. Code vereinfacht, etc.). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Brainfuck ist eine außergewöhnliche Programmiersprache, die ursprünglich um 1993 von Urban Müller für den Amiga entwickelt wurde.

Die Sprache arbeitet mit einem Datenarray aus einer interpreterabhängigen Anzahl von Parzellen (in der Regel 10.000 - 30.000) und besteht aus einem Befehlssatz von acht Befehlen, die zur Navigation innerhalb der Zellen, zu deren Manipulation und als Schleifenkonstrukte dienen:

 +	inkrementiert die aktuelle Zelle
 -	dekrementiert die aktuelle Zelle
 >	verschiebt den Parzellenzeiger auf die nachfolgende
 <	bzw. vorherige Zelle
 .	gibt das Zeichen der aktuellen Zelle auf der Standardausgabe aus
 ,	liest ein Zeichen von der Standardeingabe 
       und speichert dessen ASCII-Wert in der aktuellen Zelle
 [	Schleifenkonstrukt: Anfang
 ]	Schleifenkonstrukt: Ende

Diese Limitierung macht das Programmieren in Brainfuck recht aufwendig, weshalb (wie auch schon der Name indiziert) die Sprache eigentlich nur eine Spaßsprache ist, aber gerade deshalb doch gerne in der IT-Welt verwendet wird, allerdings meist nur für Signaturen oder ähnliches.

Grundlagen der Programmierung in Brainfuck

Schleifen

Ohne die wär Brainfuck sinnlos (ist es auch so). Schleifen beginnen mit [ und enden mit ]. Die Schleife wird solange ausgeführt, wie der Wert der aktuellen Zelle (wo die [ steht) ungleich Null ist. Die einfachste Form ist die Nullschleife, die die aktuelle Zelle dekrementiert, bis diese Null ist:

 [-]

Rechenoperationen

  • Verschieben des Wertes einer Zelle in die nächste (Inkrementierung der Folgezelle, gleichzeitige Dekrementierung der aktuellen):
 [>+<-]
  • Kopieren eines Wertes erfolgt durch das verschieben in 2 Folgezellen und anschließendes Zurückverschieben:
 [>+>+<<-]  // verschiebe Inhalt von Zelle n nach Zellen n+1 und n+2
 >>[<<+>>-] // verschiebe Inhalt von Zelle n+2 nach Zelle n
 <<         // gehe wieder auf Zelle n
 [<+>-]
 [<->-]
  • Multiplikation mit einer Konstante: Es wird eine normale Verschiebung durchgeführt, wobei die Zielzelle nicht jeweils um eins, sondern um den entsprechenden Faktor erhöht wird:
 p[1] = p[0] * 5
 [>+++++<-]
  • Multiplikation mit einem Zellenwert: Hier wird der 2. Faktor wiederholt zum Produkt mittels obriger Kopierfunktion addiert:
 p[2] = p[0] * p[1]
 [>[>+>+<<-]>>[<<+>>-]<<<-]
  • Potenzieren: Eine Zahl mit +++ in eine Zelle zu schreiben, wird spätestens ab zweistelligen Zahlen mehr als aufwendig. Also behilft man sich mittels Potenzen:
 p[0] = 5^3 = 125
 +++++[>+++++[>+++++<-]<-]
  • Division funktioniert am einfachsten als restlose Division, alles andere resultiert in dem Fall in einer Endlosschleife. Die Idee ist ansonsten die selbe wie bei der Multiplikation:
 p[1] = p[0] / 5
 [>+<-----]
  • Restbehaftete Division in Brainfuck ist hingegen etwas komplizierter:
 while(p[0]--)
 {
   p[1]--; 
   p[2]++;
   if(p[1] == 0)
   {
     p[3]++;
     p[1] = p[2];
     p[2] = 0;
   }
 }
 // p[2] = p[0] % p[1]
 // p[3] = p[0] / p[1]
 [->>+<-[>>>]>[[<+>-]>+>>]<<<<<]
 

Beim Erstellen von Texten und Brainfucksignaturen kommt es dann nur noch darauf an, durch geschickte Verkettungen von Addition und Multiplikation, die ASCII-Werte der Ausgabezeichen möglichst effektiv zu bestimmen.

Siehe auch: Esoterische Programmiersprachen