Brain-o-Zap
BrainF_ck-interpreter (Win 98)
|
|
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.
- Codebereich : unbekannt, in dieser Implementierung: beliebig (nur durch den
verfügbaren Hauptspeicher begrenzt)
- Datenbereich: in verschiedenen Implementierungen 256~30000
Adressen , hier 65565 Adressen
- Datentyp: Byte, manchmal Word , hier: Byte; Überlauf möglich 255+1 = 0
- Klammerverschachtelungstiefe : 1000
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
- Urban Müller (unbekannterweise) als Pionier der
Brainfuck-Idee
- Chaos-Computer-Club Kongreß Not A Number Berlin 12' 2003
- Kölner Chaos-Computer-Club (Internetadresse)
- verschiedene BF-Liebhaber im Internet
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