Dies basiert auf einem Vortrag über Compiler, die ich vor einiger Zeit gehört habe, aber ich kann mich leider nicht erinnern, wann oder wo.
Erstellen Sie den kürzesten Compiler in einer Sprache, die sich selbst kompilieren kann. Greifen Sie auf alle vernünftigen ISA-Systeme (68 KB, x86, MIPS, ARM, SPARC, IBM BAL usw.) zu, die keine Anweisung zum Kompilieren von Programmen enthalten (dies kann einige Versionen von VAX ausschließen). Quellprogramme auslesen stdin
und generierten Code ausdrucken stdout
. Sie können die Standard-C-Bibliothek für die E / A- und String-Verarbeitung verwenden (z _printf
. B. ). Sie müssen nicht die gesamte Sprache kompilieren, sondern nur eine Teilmenge, die den Compiler enthält (dh das Ausdrucken einer Assembler-Quine ist zwar beeindruckend, zählt jedoch nicht als Lösung).
#!/usr/local/bin/tcc -run
in die erste Zeile Ihrer C-Quelle ein und führen Sie es direkt über die Befehlszeile aus." Das ist ziemlich cool.Antworten:
Haskell-Teilmenge → C-18926 Zeichen
Dadurch wird eine kleine Teilmenge von Haskell zu C kompiliert. Unterstützte Funktionen:
Die größten fehlenden Merkmale sind verschachtelte Variablen (dh kein Lambda / let / where / case), Typüberprüfung und Typklassen. Resultierende Programme verlieren Speicher und die Selbstkompilierung nimmt ungefähr 200 Megabyte auf meinem System in Anspruch (der Böhm-Garbage-Collector hilft sehr, aber nur, wenn der Compiler die Schwanzrekursion gut optimiert).
Zum Booten die ersten drei Zeilen auskommentieren (in der Partitur nicht mitgezählt) und mit GHC kompilieren. Der Compiler verwendet Haskell-Subset-Code für stdin und erzeugt C-Code für stdout.
Es ist lange nicht, weil die Sprache komplex ist, sondern weil ich faul bin.
Derzeit ist es jedoch die kürzeste Lösung.Nicht mehr. Ich glaube, dieses Wochenende wird mir nicht langweilig.quelle
Eigene Sprache → C - (7979)
Da die Frage das Erstellen meiner eigenen Sprache nicht ausschließt, dachte ich, ich würde es versuchen.
Die Umgebung
Die Sprache hat Zugriff auf zwei Stapel, den Aufrufstapel und den Datenstapel. Der Aufrufstapel wird für die Sprungbefehle
{
und verwendet}
, während der Datenstapel von den meisten anderen Befehlen verwendet wird. Der Call Stack ist für Anwendungen undurchsichtig.Der Datenstapel kann drei verschiedene Arten von Werten enthalten: Ganzzahl, Text und Leer. Ganzzahlen sind vom Typ intptr_t, während Text als Zeichenfolgen im C-Stil gespeichert wird.
Die
^
Anweisung hat Zugriff auf das Array. Das Array ist ein konstantes Array der Länge 17 von Textelementen. Sie sollten wahrscheinlich die Quelle für das Indexierungsschema sehen, da es ein wenig wackelig ist.Die Sprache
Der Compiler
Dies ist der Compiler. Es wird nicht golfen und ich gehe davon aus, dass es erheblich reduziert werden könnte. Es sollte möglich sein, Maschinencode direkt zu verwenden und eine dos COM-Datei auszugeben, aber ich bin noch nicht dazu gekommen. Ich weiß, dass dies wie ein C-Programm aussieht, aber die eigentliche Compiler-Implementierung ist am Ende ausgefallen.
Derzeit generiert der Compiler viele Debugging-Informationen zu stderr.
So kompilieren Sie den generierten C-Code:
Der Zeichensatz ist erforderlich, da der Compiler Sonderzeichen durch Hinzufügen von 128 vermeidet.
Der Bootstrap
Um den ersten Compiler zu kompilieren, habe ich einen Python-Interpreter für die Sprache geschrieben.
Alles zusammenfügen
Angenommen, Sie haben den Compiler als
compiler.cmp
und den Bootstrap als gespeichert.bootstrap.py
So erstellen Sie den Compiler und kompilieren ihn anschließend selbst:Ich bin also kein großer C-Programmierer und auch kein großer Sprachdesigner. Vorschläge zur Verbesserung sind daher sehr willkommen!
Beispielprogramme
Hallo Welt!
quelle
Extended Brainfuck v0.9: 618 Bytes (ohne unnötige Zeilenvorschübe)
Dies ist eine Golf-Version meiner allerersten Version von EBF mit entfernter Unterstützung für Kommentare und toten Code, um das Entfernen von Variablen zu unterstützen.
Im Grunde ist es also BrainFuck mit Variablen.
:x
Erzeugt Variablen x. Der Compiler weiß, wo Sie sich befinden,$y
und erstellt <und>, um an diese Position zu gelangen. Manchmal benötigen Sie asymmetrische Schleifen, und dann müssen Sie dem Compiler mitteilen, wo Sie sich befinden@x
. Als aktuelles EBF kompiliert es nach Brainfuck.Diese erste Version hatte nur einen char Variablennamen, aber ich habe diese Version verwendet, um die nächste Version zu kompilieren und so weiter bis zur aktuellen Version, die einen beeindruckenden Funktionsumfang hat. Beim Kompilieren aus der Github-Quelle wird die handkompilierte Binärdatei tatsächlich auf Bootstrap 6-Zwischen-Ebf-Versionen heruntergeladen, um die aktuelle Version zu erstellen.
Zum Booten können Sie diese erste und einzige Binärdatei im EBF-Git-Repository verwenden, die nach einigen Versuchen von Hand erfolgreich kompiliert wurde.
Brainfuck hat einige Hardware-Implementierungen, z. dies , dies und das um nur einige zu nennen. Meistens ist die Implementierung jedoch so einfach, dass Sie einen Interpreter praktisch auf jedem System implementieren können. Ich scherze , dass Zozotez LISP , das in EBF geschrieben ist, wahrscheinlich das portabelste LISP ist, das es je gab.
quelle
Hex, 550 Bytes
Dies betrifft speziell x86_64-Systeme, auf denen Linux ausgeführt wird.
In dieser Sprache besteht der Quellcode aus Bytes, die als zwei hexadezimale Kleinbuchstaben dargestellt werden
[0-9a-f][0-9a-f]
. Diese Bytes können beliebig viele umgebende Leerzeichen enthalten, zwischen den Ziffern, die ein einzelnes Byte bilden, darf jedoch nichts auftreten. Außerdem'!'
ist es ein Zeilenkommentar: Es wird ignoriert, ebenso alles zwischen ihm und dem nächsten'\n'
Zeichen.Wenn Sie mit x86-Assembly vertraut sind, finden Sie hier eine viel besser lesbare Version des Quellcodes:
Wenn Sie die Assemblersprache aus den Kommentaren unten extrahieren
! Program Code
, können Sie den Hex-Compiler zusammenstellen und ausführen. Ein- und Ausgabe verwenden stdin und stdout.quelle
Hex
ist keine Sprache.Javascript-Teilmenge -> Java, 504 Bytes
quelle
05AB1E , 2 Bytes (möglicherweise nicht konkurrierend)
Probieren Sie es online!
Code in der ersten Eingabezeile, Eingaben in den folgenden Zeilen.
quelle
Lumber , 0 Bytes
Lumber ist eine vollständige esoterische Programmiersprache, die von Unrelated String erfunden wurde und in nur 10 Zeilen Prolog-Code geschrieben wurde.
Kannst du es nicht glauben? Bei diesen Programmen wurden Kommentare entfernt, wodurch die Interpreterquelle übersichtlicher wird.
lumber_corefuncs.pl:
lumber_types.pl
lumber_corefuncs.pl nimmt die Bibliothek lumber_types auf; Diese Bibliothek definiert wiederum ein Modul, in dem sich nichts befindet. Daher führt Lumber bei willkürlichen Eingaben nichts aus, was wiederum ein Selbstcompiler ist.
quelle
Null , 0 Bytes
quelle