Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Brainfuck-Compiler in Brainfuck
oreissig Offline
Maître Modérateur

Beiträge: 12.021
Registriert seit: Jul 2008
Beitrag #1
Brainfuck-Compiler in Brainfuck
Vorweg: wers nicht kennt: Brainfuck ? Wikipedia (one programming language to rule em all!!!!!111)

So, um mal das Niveau in ungeahnte Höhen zu katapultieren, dachte ich mir, dass ich doch mein tolles Brainfuck-Projekt von vor kurzem mal präsentieren könnte. Der Titel ist etwas verwirrend, es ist kein echter compiler, sondern nur ein to-C-Converter. hatte mal überlegt, zumindest x86-assembercode zu erzeugen, aber eigentlich find ich das ganz praktisch, da meine Hauptentwicklungsmaschine der Jornada 720 ist und ich von ARM-Assembler absolut 0 ahnung hab (x86 hab ich zumindest vor urzeiten mal ein helloworld gemacht).

Also here we go:


Hier mal, um das ding erstmalig zu Compilieren, mein Compiler in C davon. Danach ist der Brainfuck-Compiler (das war mein Ziel) self-hosting =)


ich werd mal bisschen kommentieren:
Das Programm besteht aus 3 großen Blöcken:

  1. Header erzeugen (also #include blabla...)
  2. Befehlskodierung
  3. Assemblierung
Die letzten beiden sind etwas tricky, hatte als allererste Version (und zur verifikation meines C-Codes) das gleiche in C geschrieben, was einfach nur die 8 instruktionen switcht, problem dabei ist, dass es unter Brainfuck kein "if x=FOO then ..." gibt. die einzige möglichkeit verzweigungen zu machen ist mit den Schleifen, welche quasi "while a != 0 { ... }" sind. Damit könnte man zwar leicht ein "if a != FOO then ..." machen, aber um damit ein "=" erzeugen zu können müsste man 255 solcher abfragen schachteln :D

Ich habs so gelöst, dass ich ne große Herde Flags gemacht hab, ich sag pro-forma, dass alle befehle abzubilden sind (jeweils eine Zelle aufm Band, 1 dort heißt "der aktuelle Befehl ist +/-/...", 0 eben nicht) und geh dann der reihe nach alle möglichkeiten durch und entferne die flags, deren befehle nicht zutreffen, quasi "if x != '+' then entferne_flag('+')".
Diese If-Abfrage ist etwas overkill, aber eigentlich zu verstehen. pro befehl kopiert er den Wert der aktuellen Zelle erst in die Zelle rechts davon (zuerst verschiebt ers in die beiden zellen rechts von sich, dann verschiebt ers von der 2. in die ursprüngliche zurück. anders kann man nicht kopieren), dann zieht er den FOO-wert von der kopie ab und schaut dann, ob das ergebnis 0 ist (d.h. x=FOO), wenn das nicht so ist wird die Schleife ausgeführt und das Flag entfernt

Das war die Befehlskodierung, Assemblierung war dann easy, musste nur eben auf den Flags langgehen und die entsprechenden Ausgaben in nen Schleifenblock setzen

Am Ende das "@" hat übrigens eine wichtige Funktion, nämlich zeigt es das Programmende an. Diese "Befehlserweiterung" musste ich vornehmen, da Brainfuck ja nicht merkt, wenn das Programm zuende ist. Wenn man einfach nur Quellcode reinpiped und der zuende ist wird er sonst einfach warten, bis mehr Zeichen kommen (die aber ja nicht kommen, da die datei zuende ist).


Also, ihr seid herzlich aufgerufen, dran rumzubasteln, macht mit dem Quellcode was ihr wollt, aber ich würde mich freuen, wenn ihr mir davon berichtet.
Wer möchte könnte ja das Ding so modifizieren, dass er x86-Assemblercode erzeugt oder so, fänd ich jedenfalls cool.


Anmerkungen:
  • zum Compilieren einfach folgendes machen (c-basierter compiler genauso)
    Code:
    ./bfc < $1.bf > $1.c
    gcc $1.c -o $1 -Os
  • irgendwie muss man die erzeugten Programme zumindest mit -O1 compilieren lassen, ohne optimierung lief zumindest der Compiler irgendwie nicht (keine große einschränkung, aber mal genannt werden sollte es)
  • hatte überlegt, wie man das ding weiter optimieren kann und mir kamen spontan 2 Ideen:

  1. sobald man einen Befehl "erkannt" hat, kann man die Dekodierung theoretisch abbrechen und direkt zur assemblierung springen. Ganz ehrlich: Wär cool, aber ich hab keinen Dunst wie man das annähernd gut umsetzen könnte, das würde das Programm wahrscheinlich doppelt so lang machen!
  2. man könnte von allen ASCII-Werten der Befehle den kleinsten nehmen, und diesen direkt nach dem Einlesen "," schon abziehen, damit würde man später bei der Dekodierung sparen 8x diesen immer gleichen Wert subtrahieren zu müssen. Das wäre umsetzbar, hab ich aber nicht gemacht, denn:
  • Man mags kaum glauben, das programm ist overkill und reduntantes rechnen³ (allein pro stelle 9x den wert kopieren und die befehlsoffsets abziehen, und der compiler selbst hat 3877 stellen!), aber er ist echt schnell! Ich habs ja bei mir aufm 206MHz StrongARM laufen (laut nbench etwas schneller alsn 90er P1) und das self-hosten des compilers dauert keine sekunde, gcc danach dauert um ein vielfaches länger

EDIT: hier mal noch ein kleines Programm zum testen, gibt alle ASCII-Zeichen und danach einen Zeilenumbruch aus:
Code:
+[.+]
++++++++++.@
(Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2009 01:54 von oreissig.)
30.01.2009 01:49
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #2
Brainfuck-Compiler in Brainfuck
Wow!

Das rockt ja mal derbe :D
Habs jetzt noch nicht all zu genau angeschaut, fürn Hirnfick ist es mir noch zu früh, aber werd ich noch. Respekt!
30.01.2009 08:53
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.737
Registriert seit: Jul 2008
Beitrag #3
Brainfuck-Compiler in Brainfuck
Jetzt meien ich mal das wir das schon mal hatten... und ihr beiden habt daran schon teilgenommen:
http://www.winhistory-forum.net/coding/1...lcode.html

Aber das wars irgendwie nicht. ich kenne brainfuck. nen dozent hat das mal vorgestellt. ist einfach abartig...

30.01.2009 10:16
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
klemmi Offline
Erfahrener Benutzer

Beiträge: 901
Registriert seit: Jul 2008
Beitrag #4
Brainfuck-Compiler in Brainfuck
coole Aktion. ich habs mir nun selbst auch noch nicht so genau angeschaut, aber sieht echt nteressant aus!

Ich werde in nem blauen Moment drauf zurückkommen!

30.01.2009 11:38
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
huttERic Offline
Yet Another Vostro User

Beiträge: 1.969
Registriert seit: Jul 2008
Beitrag #5
Brainfuck-Compiler in Brainfuck
Ich missbrauche den Thread hier mal :oO3:
(Wenns nicht passt, soll ein Mod den Beitrag ausgliedern)

Ich habe mal kurz einen Brainfuck to .NET 2.0 Compiler geschrieben. Ist eigentlich selbsterklärend das Teil.
bsc quelldatei zieldatei[.exe wird angehängt]
bsc.exe (20,48 KB)
Vielleicht hat ja jemand Interesse dran...
02.02.2009 15:52
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste