Entwickler-Ecke

Open Source Projekte - Brainfuck-Interpreter


Martok - Fr 23.03.07 19:32
Titel: Brainfuck-Interpreter
Also....

nachdem user profile iconBackslash so eine tolle Brainfuck [http://de.wikipedia.org/wiki/Brainfuck]-Signatur hat, wollte ich mal wissen, was da drin steht, und hab mir einen kleine BF-Interpreter gebastelt.

Ist alles etwas Quick'n'Dirty, einen Preis für das kleinste Programm würde ich auch nicht gewinnen... aber egal. Zum Angucken sicherlich ganz brauchbar.
EDIT: mittlerweile ist es mehr als das...


Ein paar Programme:

"Hello World"
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<
+++++++++++++++.>.+++.------.--------.>+.>.

Backslash's Signatur

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

BenBE:
++++[>++++<-]>[>++++>++++++>+++++++>++++>++++>+++<<<<<<-]>++.>+++++.>--.>++.>+++++.>--...


EDIT 2013-08-29:
Das SVN von damals existiert mittlerweile nicht mehr, der letzte Stand existiert jetzt in Form eines Git-Repos hier:
https://github.com/martok/brainfuck


konbom - Sa 24.03.07 12:59
Titel: Re: Brainfuck-Interpreter
user profile iconMartok hat folgendes geschrieben:

Bei Backslash fehlt allerdings am Ende das 'h'. Keine Ahnung, ob das an mir oder der Sig liegt....

Ich glaub, das liegt an dir ;). Es werden nämlich zumindest 9 Zeichen ausgegeben (9 mal '.').
Tolle Programm-Idee! Hat mich erstmal dazu gebracht auch son Ding zu schreiben (Bei mir ist Backslash übrigens vollständig ;) ). Irgendwie finde ich Brainfuck cool :).

MfG


Martok - Sa 24.03.07 13:39

EDIT: jetzt gehts auch..... sehr seltsam...

Das Interessante ist ja, dass es so gut wie keine Hochsprachen-BF-Interpreter gibt (zumindest hab ich keine gefunden). In Assembler ist sowas ja relativ einfach...


Backslash - Mo 26.03.07 01:03

Ich such gerade nach meinem Namen im Forum und was sehe ich da? Ich bin ein Trendsetter :lol: Hab ich wohl mal wieder nen Trend creiert? *LOOL* :rofl: Das ist übrigens mein erstes Brainfuck programm in meiner Signatur. Im wesentlichen hab ich von Hello World kopiert. Also über wikipedia findest du unter "brainfuck" einen coolen Freeware-Compiler.

Gruß

Backslash

PS: Ich hab irgendwann in der Ausbildung von Brainfuck gehört und wusste eigentlich nie so genau wie der Code aussieht. Erst die Signatur anderer Member die mit "Geek" geschrieben wurde, hat mich neugierig gemacht.

Meine Signatur bedeutet compiliert "Backslash"


F34r0fTh3D4rk - Sa 07.04.07 15:00

irgendwie bekomme ich es net hin, text ins fenster reinzukopieren ^^ strg+v versagt ;)
ich wusste garnet, dass der bf interpreter so unkompliziert ist ;) (hab grad mal spasseshalber irgendwas eingegeben und es wurde ne note angezeigt und ein ton ausgegeben ;) )

kA wie ich das gemacht habe :P

mfg


BenBE - Sa 07.04.07 17:11

Folgendes Programm crasht deinen Interpreter:

Quelltext
1:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.].                    

Im besten Fall würde er die schließende Klammer ignorieren, im Worst-Case ne Syntax-Fehlermeldung ausgeben.

Ach ja: Weiter Bugs:
In der While-Schleife muss es prg<=Length(Program) heißen.

Weiterer Testcase:

Quelltext
1:
++++[>++++<-]>[>++++>++++++>+++++++>++++>++++>+++<<<<<<-]>++.>+++++.>--.>++.>+++++.>--...                    


@user profile iconChristian S.: Wie sieht das eigentlich mit einem Highlighter für Brainfuck aus? :mrgreen:

Nächster Bug: Die Zeicheneingabe funktioniert nur bedingt??? Oder ist das Absicht, dass man nicht das Zeichen sondern die Zeichennummer eingeben soll???


Martok - Sa 07.04.07 17:42

user profile iconBenBE hat folgendes geschrieben:
Folgendes Programm crasht deinen Interpreter:

Quelltext
1:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.].                    

Im besten Fall würde er die schließende Klammer ignorieren, im Worst-Case ne Syntax-Fehlermeldung ausgeben.

Behoben (ignoriert Rücksprünge ohne gepushte Adresse.)
user profile iconBenBE hat folgendes geschrieben:
Ach ja: Weiter Bugs:
In der While-Schleife muss es prg<=Length(Program) heißen.

Ditto.

user profile iconBenBE hat folgendes geschrieben:
Nächster Bug: Die Zeicheneingabe funktioniert nur bedingt??? Oder ist das Absicht, dass man nicht das Zeichen sondern die Zeichennummer eingeben soll???

Na klar! Damit foltere ich die User :twisted:

Nee, mal im ernst: behoben.


Chryzler - Sa 07.04.07 18:22

Wenn du jetzt aus dem Interpreter noch nen Compiler machst, wär's perfekt ;)


BenBE - Sa 07.04.07 19:04

Nächster Bug:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
,>,
[<+>-]<
>>>>>>+++++
[
 <<<<+++
 [
  <+++>-
 ]
 <+<
 >>[-]
 >[-]
 >[-]
 >[-]
 <<<<<
 [
  ->->+>>
  [-]+<<<
  [
   >>>>+<<<<-
  ]
  [
   >>>-<<<[-]
  ]
  >>>>
  [
   <<<<->>>>+
  ]>>>
  [
   <<
   [
    -<+>
   ]
   >+>
  ]
  <<<<
 ]
 [-]>
 [-]++++
 [-<++++>]<
 [->+++<]>>
 [<+>-]<.
 [-]<
 [-]>>
 [-]>
 [<<<+>>>-]
 >>>
]


Hängt sich aus unerfindlichen Gründen bei der Zahleneingabe auf. (Benötigt Version mit ReadLn für Zahlen).

Add: Vielleicht , für Zeichen und # für Zahlen???

//Edit: Source etwas formatiert.
//Anmerkung: Soll wenn's mal funzt n Programm werden, was zwei Zahlen einliest und addiert und das Ergebnis ausgibt.


Martok - So 08.04.07 14:31

So, neue Version ist oben.

Neu ist eine IDE mit Step by Step-Debugger.
Das Script aus Bens letztem Post läuft immer noch nicht ganz, aber es ist kein Interpreter-Fehler mehr drin ;)

Außerdem haben wir jetzt wirklich # zur direkten Zahleneingabe und , für ASCII-Zeichen.


F34r0fTh3D4rk - So 08.04.07 17:18

hi, zur ide hab ich noch einige vorschläge:



EDIT: und eine funktion, eine lauffähige exe zu erstellen. machst du einfach so, dass du eine konsolen anwendnung mit dem kompletten interpreter schreibst, den BF code aus der ressource ausliest, dann beim kompilieren, diese exe an den zielordner verschiebst und den BF Code in die ressource injizierst.


Quelltext
1:
++++++++++[>+++++++>++++++++++<<-]>--.>+.+++++++.++++.--------.+.                    


und backslash hat auch viel zu viel feldverbrauch ;) liegt noch an den Hello World Resten, so:


Quelltext
1:
++++++++++[>+++++++>++++++++++<<-]>----.>---.++.++++++++.++++++++.-------. -----------.++++++++++++++++++.-----------.                    


ist das besser :P


mfg


BenBE - So 08.04.07 19:09

Einsteins berühmteste Feststellung:


Version 1:
1:
2:
++++[>++++[>++++>++++>+++++++>++++++<<<<-]<-]>>
+++++.[-]>---.-[<+++>-]<-->>---.>+++.<<<.


Version 2:
1:
2:
++++++[>++++++[>++>++>+++>+++<<<<-]>>-->>-<<<<<-]>>
---.[-]>+.-[<+++>-]<-->>+.>---.<<<.

(Benötigt die IDE, da die Konsole nen anderen Zeichensatz hat)

Bug:
Wenn man bei der Zeicheneingabe nichts eingibt und Enter drückt, bekommt man ne AV. Um das Enterzeichen zu simulieren sollte für eine leere Eingabe #10 oder #13 angenommen werden, oder alternativ der ASCII-Code auch wählbar sein.

Edit:
Hab mein BenBE-Programm von oben noch einmal kurz optimiert:

Quelltext
1:
+++++[>++++[>+++>+++++>+++++<<<-]>+>>++<<<<-]>>+.>+.>.<<.+++.                    

Ist sogar noch um ein Zeichen kürzer, als mein Optimierungs-Versuch davor (und führt das gleiche in ~40 Taketen weniger aus ^^

Edit 2:
Hier noch eins für Martok:

Quelltext
1:
++++++++[>++++[>++>+++>+++<<<-]>++>>++<<<<-]>>---.>+.>++.++.-----.----.                    


F34r0fTh3D4rk - So 08.04.07 19:37

die anzahl der zeichen auszugeben wäre auch noch ein kleines nettes feature, falls man was optimieren möchte.

mfg


JayEff - So 08.04.07 23:13

user profile iconMartok hat folgendes geschrieben:
EDIT: jetzt gehts auch..... sehr seltsam...

Um das letzte Zeichen zu interpretieren, muss ich immer ein weiteres anfügen, weshalb der . für das h flöten geht... :| Fehler in der interpretier-Schleife?
Edit: Eine Leertaste ans Ende des Programms genügt! => Deine Schleife muss bis length(code)-2 gehn oder soetwas :gruebel:


BenBE - So 08.04.07 23:20

Der Bug ist in der aktuellen Version bereits gefixt ... Kannst Du gern mit den ganzen Programmen von mir ausprobieren ;-)


JayEff - So 08.04.07 23:25

Holla! :oops:


andras - Mi 09.05.07 13:39

hi!
super proggi, hätte nur einen wunsch:
wenn ich in einer endlosschleife hänge, wäre es super irgenwo einen stoppbutton zu haben, der das ganze abbricht.
ansonsten passt alles bei mir!


F34r0fTh3D4rk - Mi 09.05.07 14:27

(ich hab schonmal auf das thema geantwortet, irgendwie ist das wohl net angekommen ^^)

bei endlossschleifen klicke ich zweimal auf "schrittweise", dann hält er an.

mfg


andras - Do 10.05.07 13:44

o.........dürft ich wohl beim überfiegen übersehen haben :oops:
Thx!!


F34r0fTh3D4rk - Do 10.05.07 15:56

damit meinte ich, dass mein post hier irgendwie net steht, obwohl ich ihn abgeschickt habe


Mathematiker - Mi 28.08.13 20:12

Hallo,
jetzt hole ich auch mal ein altes Thema wieder hervor.
Beim Stöbern in der EE bin ich auf Martoks Brainfuck-Interpreter gestoßen, der mich gleich begeistert.
Das Konzept von Brainfuck kannte ich noch nicht und finde es einfach genial.

Beim ersten Ausprobieren bin ich auf Speicherlecks gestoßen. Daraufhin habe ich in der TBF-Klasse

Delphi-Quelltext
1:
    destructor destroy;                    

mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
destructor TBF.destroy;
begin
  Setlength(Daten,0);
  Setlength(Stack,0);
  inherited destroy;
end;

eingefügt. Es gibt zwar keinen Laufzeitfehler, aber es bringt auch gar nichts. Offensichtlich habe ich das destructor-Prinzip nicht verstanden.
Die Warnung des Compilers lautet:
Zitat:
[Warnung] bfcore.pas(33): Methode 'Destroy' verbirgt virtuelle Methode vom Basistyp 'TObject'

Kann jemand helfen? Danke.

Beste Grüße
Mathematiker


FinnO - Mi 28.08.13 21:45

Gratulation zur Ausgrabung :mrgreen:. Ich schlage vor, das hier vorher abzutrennen und in ein neues Thema zu verschieben, aber das soll ein Moderator entscheiden.

Die Antwort auf deine Frage:


Delphi-Quelltext
1:
2:
3:
public
  destructor Destroy; override; 
end;


dürfte helfen.

Aber gut, dass Martok nochmal für sechs Jahre alten Code Schelte kriegt...


Mathematiker - Mi 28.08.13 21:52

Hallo,
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
public
  destructor Destroy; override; 
end;

dürfte helfen.

Danke. Jetzt ist es ok.

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Aber gut, dass Martok nochmal für sechs Jahre alten Code Schelte kriegt...

Wenn meine Anfrage so aufgenommen wird, dann vergesst es. :?
Für mich ist es damit erledigt. :evil:

Beste Grüße
Mathematiker


Martok - Do 29.08.13 00:02

Hihi. Ich hatte ja auf die andere Frage (aus einer PN) gehofft, die ist nämlich wirklich interessant ;-)

user profile iconBenBE's Additions-Programm hängt sich zwischendurch auf, in der hier geposteten Version ist das Zeile 26. Das Subversion von damals gibt's nicht mehr, ich werde das bei Gelegenheit mal in ein Git-Repo werfen, damit das nicht verloren geht. Wäre schon mal interessant zu wissen, woran das liegt ;)

Edit: und warum ich eigentlich geantwortet hab: seltsam, dass das hilft. Eigentlich werden Felder doch automatisch abgeräumt... oder war das in D5 noch nicht?


glotzer - Do 29.08.13 01:08

Ja normalerweiße werden sie das, aber NICHT wenn sie per "Hand" angelegt wurden (mit setLength)

Edit: DAS IST FALSCH! Danke an jaenicke


Lemmy - Do 29.08.13 09:13

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Aber gut, dass Martok nochmal für sechs Jahre alten Code Schelte kriegt...

Wenn meine Anfrage so aufgenommen wird, dann vergesst es. :?


von meiner Seite ein ganz klares nein!


jaenicke - Do 29.08.13 10:00

user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
Ja normalerweiße werden sie das, aber NICHT wenn sie per "Hand" angelegt wurden (mit setLength)
Tut mir leid, aber das ist falsch, ein Array wird automatisch freigegeben. Die Länge des Arrays ist ja auch bekannt, genau diesen Wert setzt ja SetLength auch.

SetLength auf 0 bringt rein gar nichts. Entweder sind darin einfache Datentypen, dann kann man es sich sparen oder darin sind Objekte, dann muss man die freigeben. Aber auch bei Objekten braucht man nach deren Freigabe kein SetLength auf 0 mehr.


glotzer - Do 29.08.13 15:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
Ja normalerweiße werden sie das, aber NICHT wenn sie per "Hand" angelegt wurden (mit setLength)
Tut mir leid, aber das ist falsch, ein Array wird automatisch freigegeben. Die Länge des Arrays ist ja auch bekannt, genau diesen Wert setzt ja SetLength auch.

SetLength auf 0 bringt rein gar nichts. Entweder sind darin einfache Datentypen, dann kann man es sich sparen oder darin sind Objekte, dann muss man die freigeben. Aber auch bei Objekten braucht man nach deren Freigabe kein SetLength auf 0 mehr.


Gerade nochmal getestet, stimmt da hast du recht. Frag mich nur warum ich das so im Kopf hatte..