Heim >Backend-Entwicklung >C++ >Der kleinste Transpiler, den Sie jemals sehen werden
Ich habe heute Morgen einen Brainf**k für den C-Transpiler geschrieben. Insgesamt habe ich ungefähr eine Stunde gebraucht.
Das Ganze hat weniger als 50 C-Zeilen. Sie können es hier sehen.
Es ist eine esoterische Programmiersprache. Es wurde 1993 von einem Schweizer Studenten erfunden und ist so ziemlich das Minimum, das erforderlich ist, um als Turing-vollständig zu gelten.
Es ist auch einer der berühmtesten Esolangs, die es gibt.
Die Syntax ist äußerst minimal: Sie hat nur 8 Zeichen und der Rest wird ignoriert.
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.
Raten Sie mal, was das bewirkt. Raten Sie einfach.
Es ist ein Hallo, Welt! Programm.
Im Wesentlichen erhält man in Brainf**k ein 30.000-Byte-Array und einen Cursor. Sie können den Cursor mit > bewegen. und <. Sie können den Speicher mit und - ändern, wodurch der Wert in der Zelle erhöht oder verringert wird. Mit [ und ] können Sie Schleifen erstellen. Schließlich können Sie mit ..
ein einzelnes Byte als Eingabe lesen und den Wert der aktuellen Zelle ausdrucken
> ; Increments cursor position < ; Decrements cursor position + ; Increments cell value - ; Decrements cell value . ; Prints the current cell value as an ASCII character , ; Reads a singly byte and stores it in the current cell [ ; Opens a loop that continues until the cell value is 0 ] ; Closes a loop
Das ist so ziemlich alles über Brainf**k.
Ich habe schon früher mehr funktionale Programme in Assembly geschrieben.
Ich habe diesen Compiler ausschließlich geschrieben, weil mir langweilig war und ich eine Menge Interpreter gefunden habe, also dachte ich, die Welt braucht einen genialen Compiler.
Obwohl, zugegebenermaßen, wenn Sie einen wirklich guten Brainf**k-Compiler wollen, schauen Sie sich diesen an
dieses.
Viele Gründe:
Und noch ein letzter Grund: Ganzzahlüberlauf. Normalerweise ist das eine schlechte Sache, die die Leute hassen. Dies ist wahrscheinlich der Grund, warum Unit-Tests (ugh) erfunden wurden. Aber Brainf**k ist anders. Die Zahlen auf dem Speicherband haben eine Obergrenze von 255, und wenn sie diese überschreiten, wird erwartet, dass sie auf 0 zurückgesetzt werden. Wenn der Wert unter 0 fällt, soll er außerdem auf 255 zurückgesetzt werden. C führt dies selbstständig aus ; Ich musste dafür keinen Code schreiben.
Eine übergeordnete Übersicht:
Es liest Brainf**k-Code aus einer Datei in Code[].
Dann wird ein einfaches C-Programm eingerichtet:
#include <stdio.h> int main() {char t[30000]={0};int p=0;
Vielleicht ist Ihnen aufgefallen, dass eine schließende Klammer fehlt. Das liegt daran, dass diesem char[].
mehr Code hinzugefügt wirdFalls Sie sich fragen: char t[30000] ist der Speicher, der Ihnen gegeben wird. Ich habe t als Kurzform für „Tape“ verwendet, es aber gekürzt, da diese Programme nicht für Menschen lesbar sein sollen.
Als nächstes wird das Code-Array durchlaufen, bei dem es sich um ein Array aus einzelnen Zeichen handelt. Für jedes Zeichen wird es in C-Code konvertiert:
character | becomes |
---|---|
> | p |
< | p-- |
- | t[p]-- |
t[p] | |
. | putchar(t[p]) |
, | t[p]=getchar() |
[ | while(t[p] != 0) |
] | } |
Sie können oben sehen, um zu verstehen, was diese Symbole bewirken.
Diese Werte werden zur Programmausgabe hinzugefügt, die gültigen C-Code enthält.
Zuletzt wird dieser Code zur endgültigen Ausgabe hinzugefügt:
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.Dies ist das Ende des ausgegebenen Programms. Der Transpiler gibt diesen Code dann auf stdout aus, damit der Benutzer ihn nach Belieben bearbeiten kann.
Letzte Gedanken
Es gibt einige Verbesserungsvorschläge, die ich beim Schreiben dieses Artikels hatte. Ich glaube nicht, dass ich viel tun könnte, um es schneller zu machen, aber es gibt Dinge, die ich tun könnte, um es sicherer und besser zu machen.
Den endgültigen Code können Sie hier sehen.
Sie können auch jede Art von Beitrag leisten, wenn Sie möchten.
Danke fürs Lesen!
Das obige ist der detaillierte Inhalt vonDer kleinste Transpiler, den Sie jemals sehen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!