Brain-o-Zap

BrainF_ck-interpreter (Win 98)

Comments to
Gottfried Helms,
Uni Kassel
mailto:helms@uni-kassel.de

Screenshot     Einführung        Download         Tech-defs        Versions/Techinfo(english)

Einführung:

Brainf_ck Engine und integrierte Entwicklungsumgebung (IDE)
mailto:helms@uni-kassel.de
Jan 2004, Kassel
 

1) First Glance

BrainFuck ist eine "esoterische" Programmiersprache entwickelt von Urban Müller.
Sie ist ein Modell eines minimalistischen, gleichwohl Turing-vollständigen  Prozessors.

Brainfuck enthält nur 4 Instruktionen mit jeweils zwei symmetrischen Versionen, wobei
die Instruktionen durch jeweils 1 simples Zeichen auf der Tastatur angegeben wird:

Eingabe/Ausgabe eines Zeichens :
     "," =1 Zeichen vom Anwender erhalten 
     "." =1 Zeichen über Outputkanal ausgeben

Datenpointer setzen:
    ">" = 1 Adresse hochzählen
    "<" = 1 Adresse herunterzählen

Daten verändern:
    "+" = am Datenpointer 1 hinzuzählen
    "-" =  am Datenpointer 1 abziehen

Programmfluss:
    "[" = wenn am Datenpointer 0, hinter zugehörige "]" springen
    "]" = wenn am Datenpointer>0, hinter zugehörige "[" springen


Mit diesen 4*2 Operationen kann man offensichtlich beliebig komplexe
Programme schreiben, sofern man mit einem Input/Output-System,
das nur einzelne Zeichen transmittiert auskommt. Insbesondere gibt
es in Brainfuck selbst geschriebene Brainfuck-Compiler - eine wahnsinnige
Programmier-Aufgabe (so sie per Hand erfolgte), die aber die als ehrgeiziges
Projekt verstanden werden kann, das die Turing-Komplettheit ausreizt und belegt.

 

2) Programmieren

Dem minimalistischen Konzept entsprechend erfordert ein Brainfuck-Interpreter/
Compiler nur eine spartanische Eingabe. Ein Programm zur Eingabe einer Zahl,
addierens von 2 und Wiederausgabe ist einfach die Textsequenz:

   ,++.

Üblicherweise ignorieren BrainFuck-Interpreter/Compiler alle Zeichen, die nicht
Token der Programmiersrache sind; daher kann man gut kommentierten Quell-
text schreiben und der Engine diesen Programmcode samt der Kommentare als
Eingabe geben. Beispiel aus einem in Brainfuck geschriebenen Compiler, der
direkt Linux-Executable erzeugt. Der Autor kann die Kommentare, solange sie
keine Brainfuck-Tokens enthalten, frei in den Code streuen:

I *believe* the following code snippets catches all three possibilities above
so that the program ends on either a null or a 0xff byte

>-                                    set character to 0xff
,                                     read a character
[<+>->+<]                             copy byte to previous and next field
>[+<]>                                if byte is not zero
                                        add one to it
[                                     if it is still not zero
  [-]<                                clear the copy
  +++++[<-------->-]<---              subtract plus from input
  [                                   if char is not plus
    -                                 subtract 1 from char

;(...)  // Program cutted here
For questions and comments you can reach me at
vissers@theochem dot kun dot nl
You will forgive me for not typing the dots :)

Ge Vissers
17 april 2003

  

Da Kommentare dann aber keine Punkte, Kommas, Plus etc enthalten dürfen,
ist in dieser Version der IDE ein zusätzliches Kommentarverhalten implementiert:
erscheint auf  einer Zeile ein Semikolon, wird der komplette Rest dieser Zeile
als Kommentar ignoriert, bevor der Codestring an die Engine durchgereicht
wird.
Das klassische Hello-World-Programm sieht bspw so aus:

;BrainF*ck : Hello World!
;
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[ 
-]>++++++++[<++++>-]<.>+++++++++++[<++++++++>-]<-.--------. 
+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.

und gibt simpel den Text "Hello World" über die Standardausgabe aus.
 

3)  Speicher

Übliche Implementierungen dimensionieren den Speicher sparsam.

 

4)  Input/Output

Die Input/Output-Kanäle sind ursprünglich single-character-Kanäle; d.h.
es kann 1 8-Bit-Zeichen entgegengenommen werden, das direkt in
die aktuelle Speicherzelle gestellt wird. Dies kann eine IDE z.B. als
simple Tastatureingabe (z.B. Taste P (=byte 80) ) implementieren oder
als Nummerneingabe; in dieser Version ist die Tasteneingabe Standard;
Zahlen, denen keine Taste entspricht (oder die eine Sonderfunktion auslösen)
können als Nummer mit einem #nnn eingegeben werden.
Also kann die Zahl 80 entweder

  (Taste) P (drücken, dann Eingabetaste)

oder
  #80  (ins Eingabefeld schreiben, dann Eingabetaste)

eingegeben werden. (Das Zeichen # selbst muß dann durch ## eingegeben
werden)
Andere Implementationen bieten hier Eingabe-Speicher als normale Text-
felder oder als Daten-Appendix nach dem Programmcode ( durch das
Zeichen "@" abgetrennt.) Möglicherweise wird diese Option in der
nächsten Version  ebenfalls ermöglicht.
 

5)  Engine und IDE separat verfügbar

Das BrainF_ck-System ist strikt in die zwei Komponenten BF-Engine
und BF_IDE geteilt; die BF_Engine kann auch von anderen Programmier-
sprachen genutzt werden, und muß nur den Programmcode als einfachen
zusammenhängenden String übergeben bekommen, sowie die zwei Prozeduren
zum Zeicheneingeben und Zeichenausgeben ("Channels"). Eine IDE kann
dies bspw durch Ein-und Ausgabefelder unter Windows implementieren,
oder aber als Ein- und Ausgabe per Dateieinlesen. D.h. die BF-Engine kann
auch mit Konsolenprogrammen betrieben werden, oder als Software-
Prozessor in beliebige Anwendungen eingebunden werden.


6) Debugger

Ab der Version V1.2 der Engine gibt es für Entwickler die Möglichkeit,
einen visuellen Debugger zu implementieren, da die BF-Engine einen
zusätzlichen Debugger-Channel zur Verfügung stellt. Dieser Channel
gibt die Möglichkeit, vor und nach jeder Prozessor-Instruktion den
kompletten Datenbestand und die Programmzustände auszulesen und
anzuzeigen. In der aktuellen IDE ist aber ein solches Debugger-Fenster
noch nicht implementiert.


7) Disassembler

Ab der Version V1.3 gibt es als neue Option den BF-Disassembler, der
vorhandenen BrainF_ck-Code in besser lesbare Tokens umsetzt.
Vorhandene Programme können somit besser analysiert werden, ohne
daß aber der passende Assembler bereits verfügbar wäre.
Die Bezeichnungen des Disassemblers sind konfiguerierbar (siehe Tech-Def)
Der Disassembler sieht einige Optimierungen vor: so werden z.B. alle
aufeinanderfolgenden Inkrementierungen zu einer Inkrementierung mit
einem bestimmten Betrag zusammengefaßt.
Ein Stück Disassembler sieht bspw so aus

  ++++[>,+.<-]

Disassembliert

 INC 4
 WHILE [FOC]>0 BEGIN
   FOC +1
   GET
   INC
   PUT
   FOC -1
   DEC
 END

Da der Disassembler sprachlich (zZt. noch) konfigurierbar ist, sieht dasselbe
Programm in der Sprach-Einstellung meiner Tochter z.Zt. so aus:
 

 Raufzählen 4

 Nun, solange [SpSt]>0 mach
   Speicherstelle +1
   Bitte, Eingabe
   Raufzählen
   Ausspucken
   Speicherstelle -1
   Runterzählen
 bis hier, Danke

und scheint in dieser Form mehr Verständnis zu begegnen...


8) Credits


Alle Rechte an dieser BrainFuck-IDE und Engine vorbehalten; es ist
eine Freigabe an die Public Domain unter GNU-Lizenz intendiert



Verbesserungsvorschläge an:

Gottfried Helms, Uni Kassel

mailto://helms@uni-kassel.de