Heim >Backend-Entwicklung >C++ >Der kleinste Transpiler, den Sie jemals sehen werden

Der kleinste Transpiler, den Sie jemals sehen werden

DDD
DDDOriginal
2024-12-17 21:28:15527Durchsuche

The tiniest transpiler you

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.

Was ist Brainf**k?

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.

Warum? Nur warum?

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.

Warum C?

Viele Gründe:

  • Ich möchte mehr Übung damit
  • Es geht schnell
  • Es ist größtenteils tragbar
  • Es ist weit verbreitet
  • Ich brauchte sowieso nicht viel Code.

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.

Wie?

Eine übergeordnete Übersicht:

  • Code aus einer Datei oder von stdin in den Speicher lesen
  • Konvertieren Sie jedes Zeichen in C-Code
  • Drucken Sie den fertigen C-Code aus.

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 wird

Falls 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Warum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?Nächster Artikel:Warum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?

In Verbindung stehende Artikel

Mehr sehen