Brainfuck Interpreter

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

feider

ehemals "Decelion"

Betreff: Brainfuck Interpreter

BeitragMi, Jan 18, 2012 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
So, von mir gibts auch mal wieder was zu hören.
Nicht mehr in Blitz Basic (meiner Meinung nach trotz der Einschränkungen im Bereich Objektorientierung aber immer noch eine schöne Sprache), sondern in C++, deswegen auch kein Thread im Projekte-Bereich.
Dennoch, wen es interessiert:
Hier gibt es einen von mir in C++ geschriebenen Brainfuck-Interpreter mit zwei Beispielen. Ohne Binarys, kompilieren müsst ihrs selbst.. aber ist eh nur eine Sourcecode-Datei und es gibt eine Makefile Wink

Viel Spaß beim rumprobieren
Dece (feider)

EDIT:
"Ohne pics saug ich nix" (Das kommt sicher früh genug Wink )
Nun.. es ist ein Kommandozeilenprogramm. Die komprimierte Datei ist 1,8 Kilobyte groß und enthält noch 2 Beispiele. Der Quellcode ist einsehbar, insofern kann es keine Schadsoftware sein. Ich wüsste nicht, was ich da als Bilder hochladen sollte Wink

hazumu-kun

BeitragDo, Jan 19, 2012 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Du redest auf deiner Homepage von einem Compiler, aber es ist ja doch nur ein Interpreter. (Hatte mich schon ein wenig auf selbstgehacktes Assembler gefreut Sad)

Ansonsten bin ich sehr beeindruckt wie schön strukturiert und simpel ein BF-Interpreter ausschauen kann. Der Code ist in die Sammlung aufgenommen, danke!
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

feider

ehemals "Decelion"

BeitragDo, Jan 19, 2012 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, stimmt.. Sollte eigentlich Interpreter stehen. Peinlich.
Das Endziel ist zwar ein Compiler, aber das dauert noch etwas Wink
(Soll eine Übung für mich werden, mit ELF und Windows Binaries umzugehen)

Freut mich aber, dass er dir gefällt!

Sollte dich etwas Brainfuck-Wahn überfallen, könntest du uns hier deine Ergebnisse präsentieren Wink

darth

BeitragDo, Jan 19, 2012 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ein BF-Interpreter ist so etwa das Standardbeispiel für Interpreter. Findet man im Internet zu Hauf. Ist ja eigentlich auch ziemlich einfach :/ Den schreibt man (selbst in BB) in 100 Zeilen..

BlitzBasic: [AUSKLAPPEN]
Const MEM_SIZE = 256

Function bfInterprete(s$)
Local mem[MEM_SIZE]
Local char$

Local i = 1
Local mPos = 0
Local sp = 0, spTmp

Local out$ = ""

While i <= Len(s)
char = Mid(s, i, 1)

Select char
Case "+"
mem[mPos] = mem[mPos] + 1
Case "-"
mem[mPos] = mem[mPos] - 1
Case ">"
mPos = mPos + 1
Case "<"
mPos = mPos - 1
Case "["
If mem[mPos] = 0
spTmp = 0

Repeat
char = Mid(s, i, 1)

If char = "["
spTmp = spTmp + 1
EndIf

If char = "]"
spTmp = spTmp - 1
EndIf

i = i + 1

If i > Len(s)
Exit
EndIf

If spTmp = 0
Exit
EndIf
Forever
Else
sPos = sPos + 1
EndIf
Case "]"
If mem[mPos] <> 0
spTmp = 0

Repeat
char = Mid(s, i, 1)

If char = "["
spTmp = spTmp + 1
EndIf

If char = "]"
spTmp = spTmp - 1
EndIf

i = i - 1

If i < 0
Exit
EndIf

If spTmp = 0
Exit
EndIf
Forever
Else
sPos = sPos + 1
EndIf
Case "."
If mem[mPos] = 10
Print out

out = ""
Else
out = out + Chr(mem[mPos])

If i = Len(s)
Print out
EndIf
EndIf
End Select

i = i + 1
Wend
End Function

bfInterprete("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")

WaitKey()


Was meiner Meinung nach viel interessanter wäre, ist das Gegenteil. Eine Funktion die einen String in einen möglichst effizienten BF-Code umsetzt. Sowas habe ich bisher noch nicht gesehen, wäre aber wesentlich interessanter.
Würde mich mal interessieren, ob jemand sowas kennt?

MfG,
Darth
Diese Signatur ist leer.

Propellator

BeitragDo, Jan 19, 2012 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sass mal eine Zeit lang an einem optimierenden Brainfuck-Compiler, jedoch gab ich es nach zig Segfaults des Outputs irgendwann auf. Es kompilierte von BF nach Assembler in AT&T Syntax, und benutzte dann den GNU-Assembler um das ganze zu assemblen.
Die Optimierungen waren aber wirklich sehr einfach gestrickt.

Schwieriger ist meiner Ansicht nach Schleifen wegzuoptimieren, welche einfach nur eine gewisse Anzahl an Zahlen in eine Zelle schreiben. Immerhin kennt BF keine Konstanten, was dem Compiler also schon mal keinen Hinweis auf solche Konstrukte bietet.

Interpreter ist aber wahrlich easy. Jemand hat mir letztlich einen gezeigt, welcher in C geschrieben war, etwa 20 Zeilen lang und keine einzige If-Condition oder Switch-Dingsbums benutzte. Das sah krank aus.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Thunder

BeitragDo, Jan 19, 2012 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt ja auch Versuche ans Limit von C zu gehen und einen Brainfuck-Compiler mit so wenig Zeichen wie möglich zu programmieren. Die sind dann nur noch drei Zeilen lang und sehr unüberschaubar.

Ich habe Mal eine Art JIT-Compiler für Brainfuck geschrieben. Der den Code in x86 opcodes umwandelt, die auf den Heap schmeißt und dann ausführt (ich weiß: nicht besonders schön Very Happy ). Damit erreicht man schon eine Geschwindigkeit, die man sonst nur durch Compiler erreicht (das vorkompilieren zieht nicht viel Zeit). Leider ist es mir nicht gelungen Schleifen zu optimieren - daher sind auch nur sehr einfache Optimierungen drinnen (immer den einfachsten Opcode nehmen - x86 ist ja CISC, mehrere +/- oder </> zusammenfassen ...).
Vielleicht interessiert es ja den einen oder anderen: https://docs.google.com/?pli=1...ollections
Edit: Mein Code ist nicht C++, sondern reines C.

Übrigens: Beispiele zum Testen findet man einige im Brainfuck Archive und viele interessante auf bf-hacks.org. Am besten testet man auch "The Lost Kingdom", ein Textadventure in Brainfuck, das aus 2 Megabyte Brainfuck-Code besteht - um die Geschwindigkeit zu testen: http://jonripley.com/i-fiction...domBF.html
Natürlich sind die 2 MB nicht handgeschrieben Wink , sondern durch einen BASIC-Compiler entstanden.

Übrigens 2.0 (zu deinem Code):
1. Beim Brainfuck-Interpreter passt der Rekursive Abstieg besonders gut, um Schleifen zu implementieren. Vielleicht hätte ich in meinem Artikel eher einen Brainfuck-Interpreter statt einen Matheparser vorstellen sollen Smile
2. Ich denke, du bist da bei strcpy(filename, argv[1]) nicht gegen Pufferüberläufe abgesichert ^^ Das dürfte im Moment nichts heißen, weil du nur eine main-Funktion hast, aber da sollte man aufpassen Wink
3. In C(++) haben for-Schleifen, im Gegensatz zu BASIC, viel mehr Möglichkeiten und würden auch deinen Code kürzen. Kurz heißt in dem Fall nicht, schwieriger lesbar. Ich wette, wenn man in C/C++ gut eingelesen ist oder oft damit zu tun hat, fällt es einem sogar leichter, die Zusammenhänge zu verstehen, wenn für Zählschleifen for-Schleifen verwendet werden.

Alles natürlich nur Tipps und kein Muss. Weiterhin viel Erfolg und Spaß beim C++-Programmieren. Und nicht zuviel von BB/BMax fernbleiben Wink

mfg Thunder

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group