Brainfuck - Compiler, IDE und Interpreter

  • Hi!


    Hier mal meine Variante einer echten Brainfuck Entwicklungsumgebung. Es können die normalen Brainfuck Befehle + , . - [ ] genutzt werden, aber auch die erweiterten Autofuck Befehle ; : / _


    Mal eine kleine Übersicht:



    + Erhöht den Zellenwert um 1
    - Verringert den Zellenwert um 1
    > Pointer auf die nächste Zelle
    < Pointer auf die vorherige Zelle
    . Ausgabe des Zellenwertes als umgewandeltes ASCII Zeichen
    : Ausgabe des absoluten Zellenwertes
    , Input der umgewandelt in ASCII Code in die Zelle geschrieben wird
    ; Input der absolut in die Zelle geschrieben wird
    _ Ausgabe eines Leerzeichens
    / Ausgabe eines Zeilenumbruchs
    [ "START" Schleifen Anfang
    ] "BACK" Schleifen Ende


    Mit F5 wird der Inhalt der Codebox ausgeführt. Es gibt einen Livetime-Debugger, sollte ein Fehler (z.B. Nicht beendete Schleifen) auftreten wird dieser in der Konsole angezeigt und das Skript gestoppt.

    Ich hab ein Beispielskript angehängt, einen Taschenrechner. Wenn man dieses Skript startet, so wird zuerst eine Division mit Rest durchgeführt. Dazu gibt man zuerst den Divident (z.B. 10) ein, dann den Divisor (z.B. 3). Darauf wird in der ersten Konsolenzeile das Ergebnis ausgegeben (z.B. "3 1"), in der Form "Ergebnis Rest". Danach folgen 2 Absätze und die Multiplikation. Man gibt nun die beiden Faktoren an und erhält das Produkt in der Konsole. Danach wieder 2 Absätze. Jetzt die Addition. Nach weiteren 2 Absätzen dann die Subtraktion. Erst Minuend, dann Subtrahend. Das Ergebnis wird geliefert und das Skript ist beendet.


    Sollte noch Nachfrage bestehen, wie der TR funktioniert, dann mache ich gern ein Tut.


    Download der neuen Version mit Compiler.


    Bis die Tage

    Dateien

    • Autofuck.zip

      (299,51 kB, 194 Mal heruntergeladen, zuletzt: )

    5 Mal editiert, zuletzt von minx ()

  • Hi,

    Zitat

    Naja, ich schau mal ob ich noch nen Compiler mache

    mein letzter Compilerbau ist zwar schon bestimmt 15 Jahre her (jede Wette, die Disketten sind nicht mehr lesbar....btw, wo ist an den neuen Rechnern überhaupt das Diskettenlaufwerk^^), aber wenn du Hilfe brauchst....melden :thumbsup:

  • Meld!


    Zu den Laufwerken: Mein Chinakracher USB Floppy ist mein treuer Begleiter :love: .
    Ich bin auch ein absoluter Neuling auf dem Gebiet Compilerbau.


    Bis die Tage

  • Also den Lexer und Parser hast du ja schon in AutoIt geschrieben....
    Diesen Codeteil müsstest du nur in eine compilierende Sprache übersetzen, zur Not geht auch AutoIt^^


    Ich würde das auf Kommandozeilenebene machen:
    Textdatei mit Brainfuck-Code an den "Compiler" übergeben und von diesem eine EXE generieren lassen....wenn das in AutoIt klappt, transferiere den Compiler nach C oder C++ und du hast eine sehr kleine EXE.

  • Cool:thumbsup:
    Also da kann mein IDO-Ding nicht mithalten. ;)


    Also ich find' das echt nicht schlecht, weiter so. Vielleicht bekommt ihr ja wirklich einen Compiler in ASM hin. ;)


    lg chess


    Edit: Grad was gefunden, was mir persönlich garnicht gefällt:
    HotKeySet.
    Öffne mal dein Programm im Hintergrund, mit dem TR-Source geladen, und probier dann mal im Browser zu aktualisieren.;)


    lg chess

  • Respekt, richtig geil!
    Mit ":" und ";" kannte ich das bisher noch nicht. Echt gute Idee, die Konvertierung ist ja alles andere als simpel...
    Was das ganze noch bisschen besser machen würde, wäre wenn man ein File in das Fenster hineinziehn könnte und es dann geöffnet wird, ist ja sehr einfach.
    Keep up the good work!


    EDIT: Ich bin von anderen Brainfuck-Interpreter gewohnt einen ganzen String einzugeben, wobei dann jedes Zeichen einzeln abgearbeitet wird. Das wäre vielleicht auch noch ganz schön:)

  • EDIT: Ich bin von anderen Brainfuck-Interpreter gewohnt einen ganzen String einzugeben, wobei dann jedes Zeichen einzeln abgearbeitet wird. Das wäre vielleicht auch noch ganz schön

    Ich weiß jetzt nicht was du damit meinst. Meinst du vielleicht den Zeilenumbruch in den Skripten, die werden sowieso ignoriert, du kannst auch hier einfach den Code als String eingeben.


    MfG

  • wobei dann jedes Zeichen einzeln abgearbeitet wird. Das wäre vielleicht auch noch ganz schön


    Wenn du tatsächlich jedes Zeichen einzeln interpretierst, kannst du kaum optimierten Code erstellen und erhältst ellenlange Codeschlangen. Es gibt ja bekanntlich kaum die Möglichkeit, dass zwei Menschen (od. verschiedene Interpreter) zu einem Ablauf denselben BF-Code generieren. :D
    Der Reiz bei der BF-Geschichte liegt m.M. nach darin, effiziente Algorithmen zu entwickeln, die minimalen Code hervorbringen. Das ist eine Anforderung, die schon etwas von dir verlangt. Denn wer würde sonst schon freiwillig in BF programmieren. :whistling:

  • Eigentlich meinte ich einen String als Input. Dass man, statt nur einzelne ASCII-Zeichen einen ganzen String eingeben kann, so wie das bei Brainfuck Developer der Fall ist...

  • Das ist ja unsinnig. Eine Zelle kann nur einen Code halten, und wenn du automatisch die nächsten mit überschreibst, dann verhunzt du dir vielleicht noch die Pufferzellen wenn du irgendwo nen Fehler hast.

  • Hmm irgendwie kann ich mich nich klar ausdrücken... :(
    Also wenn du ein stink normales Echo-Programm hast wie ",[.,]", dann wird bei jedem "," solange die Zeichenkette abgearbeitet, bis sie zuende ist und erneut ein Input gemacht werden kann. Wenn du dann zum Beispiel "Hallo Welt" eingibst, dann wird das auch so nach und nach ausgegeben.
    Das macht dann zum Beispiel einfache StringFunktionen möglich. Ich hoff ich konnte mich bisschen deutlicher ausdrücken...

  • Ne Programmiersprache macht ohne Abfragen (meist IF) keinen Sinn. Ich hab hier mal zwei Beispiele geschrieben. Der Kürze halber ist "0" hier WAHR und alles andere "FALSCH".


    Beispiel 1: IF x = True


    Wir müssen also überprüfen ob eine Zelle, die wir hier einfach mal "x" nennen "0" ist. Für dieses Programm benötigen wir 2 Pufferzellen, die in etwa so funktionieren wie ein Arbeitsspeicher im Programm. Ich habe hier mal Zelle 0 und Zelle 1 als Pufferzelle, und Zelle 2 als "x" definiert:


    Programm = [Puffer, Puffer, x]


    "x" lasse ich den Benutzer definieren, mit der Benutzereingabe ";" gibt er eine Zahl ein. Ist diese "0" wird ein vorgegebener Code ausgeführt, wenn nicht nicht. Der Code ist in diesem Beispiel ">>>>++++<<<<", also in Zelle 4 "4" zu schreiben.


    Bei Übereinstimmung: [Puffer, Puffer, x, 4]
    Bei x <> 0 : [Puffer, Puffer, x, 0]


    Der Code kann natürlich beliebig sein. Zum Beispiel ne Textausgabe o.ä.
    Das Skript ist im Anhang!


    Beispiel 2: IF x = y


    Wenn man dem Benutzer sagt "Gib 0 ein, sonst..." guckt der irgendwann so 8| . Im folgenden Skript überprüfen wir ob die Benutzereingabe eine anderen Zelle entspricht. Dazu der Programmaufbau: [Puffer / Eingabe, Puffer / Konstante / x]


    Jetzt denkt man sich: dafuq? Eine Zelle als Puffer, Konstante und x? Nun ja, hört sich schwieriger an als es ist.
    Zunächst schreibt der User seinen Wert in Zelle 0. Dann wird eine Subtraktion von Zelle 1 und Zelle 0 durchgeführt. So denn der Wert von Zelle 1 und 0 übereinstimmt (Benutzer = Konstante), sollte in Zelle 1 das Ergebnis der Subtraktion stehen. Das ist bei Übereinstimmung "0", also WAHR. Dann folgt der gewohnte IF-Algorhythmus und alles ist wie oben.


    Auch bei diesem Beispiel ist der Code, der ausgeführt wird, sobald es eine Übereinstimmung gibt, in die 4. Zelle 4 zu schreiben. Wer will oder es braucht, kann jetzt noch mit "[-]" jeden Puffer leeren. Aber das ist Sache des Programmierers. Auch dieses Skript ist im Anhang!


    MfG