Entwickler-Ecke
Open Source Projekte - Brainfuck-Interpreter
Martok - Fr 23.03.07 19:32
Titel: Brainfuck-Interpreter
Also....
nachdem
Backslash 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
Martok 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:
| ++++[>++++<-]>[>++++>++++++>+++++++>++++>++++>+++<<<<<<-]>++.>+++++.>--.>++.>+++++.>--... |
@
Christian 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
BenBE 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.)
BenBE hat folgendes geschrieben: |
Ach ja: Weiter Bugs:
In der While-Schleife muss es prg<=Length(Program) heißen. |
Ditto.
BenBE 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:
- Beim Schrittweisen debuggen, sollten Zeichen, die net BF Zeichen sind (also kommentare) einfach übersprungen werden, das wäre extrem praktisch.
- Breakpoints (zumindest einer) wäre(n) cool, dann kann man sehen, an welcher stelle man in welchem feld ist.
- und das formular sollte auf screen zentriert werden
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
Martok 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
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,
FinnO hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3:
| public destructor Destroy; override; end; |
dürfte helfen.
|
Danke. Jetzt ist es ok.
FinnO hat folgendes geschrieben : |
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 ;-)
BenBE'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
jaenicke - Do 29.08.13 10:00
glotzer hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!