Schreiben Sie ein Programm, das ein Brainfuck-Programm aufnimmt und es zu ausführbarem Maschinencode kompiliert. Sie können x86, x86_64, jvm (Java-Bytecode) oder armv6 als Ziel festlegen und eines der folgenden ausführbaren Formate verwenden: ELF, a.out, Klassendatei, exe, com. Die ausführbare Datei sollte unter Linux oder Windows (oder Java auf beiden) funktionieren.
Weder Ihr Programm noch die generierte ausführbare Datei dürfen ein externes Programm (z. B. einen anderen Compiler, Assembler oder Interpreter) ausführen.
Kürzester Code gewinnt.
Antworten:
C
866783 BytesDa mein Code eine ausführbare 32-Bit-ELF-Datei ausgibt, kann ich nicht versprechen, dass er auf jedem Setup funktioniert. Es dauerte genug, bis die ausführbare Datei nicht mehr auf meinem Computer fehlerhaft war.
Für alle, die versuchen, dies auszuführen:
Ein Brainfuck-Programm wird aus stdin gelesen und die kompilierte ELF wird in stdout geschrieben.
Ungolfed
In der ungolfed-Version des Codes können Sie eine bessere Vorstellung davon bekommen, was los ist. Das Zeichenfeld am Ende des Golf-Codes ist eine Codierung der ELF und des Programm-Headers im Golf-Code. Dieser Code zeigt auch, wie jede Brainfuck-Anweisung in Bytecode übersetzt wird.
Selbstmodifizierender BrainFuck
Um Bytes zu sparen, ist das Band für meinen Compiler nicht in einem
.bss
Abschnitt oder etwas Ähnlichem zugeordnet. Stattdessen besteht das Band aus 30.000 Nullbytes, die direkt nach dem kompilierten Bytecode des Brainfuck-Programms geschrieben werden. Wenn Sie dies wissen und wissen, welcher Bytecode von meinem Compiler generiert wird, können Sie Bytecode zur Laufzeit generieren oder ändern. Ein einfaches Beispiel für diese Funktion ist ein Brainfuck-Programm, das seinen eigenen Exit-Wert festlegt.Das Programm geht vom linken Bandrand in den Byte-Code bis zu dem Punkt über, an dem der Exit-Code normalerweise auf 0 gesetzt ist. Durch Inkrementieren dieses Bytes wird der Exit-Code beim Beenden des Programms auf 1 anstatt auf 0 gesetzt. Mit Beharrlichkeit kann dies zur Programmierung auf Systemebene in Brainfuck verwendet werden.
quelle
long long int
anstatt von zu codierenchar
. Es gibt definitiv Raum für mich, einige meiner variablen Deklarationen auszuprobieren. Ich werde sehen, wie viel ich dort bekommen kann und meine Antwort aktualisieren.Python, 1974 Zeichen
Unten finden Sie die Übersetzungen in Java-Bytecode. local 0 ist ein Byte-Array, das das Band darstellt, local 1 ist der Datenzeiger.
Das
xx xx
sind Versätze, um die passende Klammer zu erreichen. # 2 istSystem.in
, # 3 istread()
, # 4 istSystem.out
, # 5 istwrite()
und # 6 istflush()
.Die Präambel weist ein 30000-Byte-Array zu und initialisiert die Bandposition auf 0.
Der Riesen-Wrapper am Ende wurde generiert, indem eine Dummy-
B.java
Datei mit Code für jeden Opcode kompiliert wurde (um die Erzeugung der korrekten Konstantentabellen und anderer Junk-Dateien auszulösen) und anschließend eine heikle Operation durchgeführt wurde.Führen Sie es wie
Zerlegen mit
Ich bin sicher, es könnte noch etwas mehr golfen werden. Ich bin nur froh, dass es funktioniert ...
quelle
16-Bit-x86-Assemblycode, 104 Byte
Dieser Code stammt aus dem Jahr 2014, aber ich habe gerade die Aufgabe gefunden.
quelle