Befunge

Befunge ist eine Stapel-basierte, reflektierende, esoterische Programmiersprache. Es unterscheidet sich von herkömmlichen Sprachen darin Programme werden auf einem zweidimensionalen Bratrost eingeordnet. "Pfeil"-Instruktionen leiten den Kontrollfluss nach links, das Recht oder unten, und Schleifen werden durch das Senden des Kontrollflusses in einem Zyklus gebaut. Es ist als "ein Kreuz zwischen Hervor und Lemminge beschrieben worden."

Geschichte

Die Sprache wurde von Chris Pressey 1993 als ein Versuch ursprünglich geschaffen, eine Sprache auszudenken, die so hart ist zu kompilieren, wie möglich - bemerken, dass der Befehl das Selbständern des Codes berücksichtigt. Dennoch sind mehrere Bearbeiter nachher geschrieben worden. Mehrere Erweiterungen auf die ursprüngliche "Befunge-93" Spezifizierung bestehen auch, am meisten namentlich Funge-98, der das Konzept zu einer beliebigen Zahl von Dimensionen erweitert und mit vielfachen Instruktionszeigestöcken mehreingefädelt werden kann, die gleichzeitig auf demselben Raum funktionieren. Befunge-Erweiterungen und Varianten werden Fungeoids oder gerade Funges genannt.

Die Befunge-93 Spezifizierung schränkt jedes gültige Programm auf einen Bratrost von 80 Instruktionen horizontal durch 25 Instruktionen vertikal ein. Programm-Ausführung, die diese Grenzen "Hüllen ringsherum" zu einem entsprechenden Punkt auf der anderen Seite des Bratrostes überschreitet; ein Programm von Befunge ist auf diese zu einem Ring topologisch gleichwertige Weise. Da ein Befunge-93 Programm nur einen einzelnen Stapel haben kann und seine Lagerungsreihe begrenzt wird, ist die Befunge-93 Sprache, verschieden von den meisten Maschinensprachen, nicht Turing-abgeschlossen (jedoch, es ist gezeigt worden, dass Befunge-93 Turing ist, der mit der unbegrenzten Stapel-Wortgröße abgeschlossen ist). Später stellt Funge-98 Spezifizierung Turing-Vollständigkeit durch das Entfernen der Größe-Beschränkungen des Programms zur Verfügung; anstatt sich ringsherum an einem gestellten Limit einzuhüllen, folgt die Bewegung eines Funge-98 Instruktionszeigestocks ein Modell hat "Lahey-Raum" nach seinem Schöpfer, Chris Lahey synchronisiert. In diesem Modell benimmt sich der Bratrost wie ein Ring der begrenzten Größe in Bezug auf die Verpackung, während er noch sich erlaubt, unbestimmt erweitert zu werden.

Kompilation

Wie festgesetzt, war die Designabsicht für Befunge, eine Sprache zu schaffen, die schwierig war zu kompilieren. Das wurde mit der Durchführung versucht, Code zu selbstmodifizieren (die 'p' Instruktion kann schreiben, dass neue Instruktionen in den playfield) und einen mehrdimensionalen playfield (dieselbe Instruktion in vier verschiedenen Richtungen durchgeführt werden kann).

Dennoch sind diese Hindernisse zu einem gewissen Grad überwunden worden, und Bearbeiter von Befunge sind mit passenden Techniken geschrieben worden.

Der bef2c mit dem Befunge-93 Standardvertriebsgebrauch eingeschlossene Bearbeiter hat Code eingefädelt: Jede Instruktion wird zu einem Schnipsel des C-Codes kompiliert, und Kontrolle fließt durch die Schnipsel, wie es in einem Dolmetscher von Befunge tut (d. h. bedingt auf dem Wert eines 'Richtungs'-Registers.) Das läuft auf keinen bedeutenden Vorteil gegenüber einem guten Dolmetscher hinaus. Bemerken Sie, dass der bef2c Bearbeiter nicht richtig ist, da er entweder 'p' nicht behandelt oder Weise spannt, aber es würde nicht unmöglich sein, es so tun zu lassen (obwohl die c Sprache dafür nicht gut passend sein könnte).

Der Bearbeiter von Betty behandelt zum Beispiel jede mögliche Gerade von Instruktionen als ein Unterprogramm, und wenn eine 'p' Instruktion dieses Unterprogramm verändert, wird dieses Unterprogramm wiederkompiliert. Das ist eine interessante Schwankung auf gerade rechtzeitig der Kompilation, und sie läuft auf einen viel besseren Vorteil gegenüber einem Dolmetscher hinaus, da viele Instruktionen im heimischen Code durchgeführt werden können, ohne vorläufige Entscheidungen über das 'Richtungs'-Register zu treffen.

Der BFC (Bearbeiter von BeFunge) für Win32, der von Andrew Carter (Uran 239) geschrieben ist, verwendet einfach einen Selbstdurchführungsstummel und modifiziert das vorzugeteilte 80x25 Byte-Matrix innerhalb des Stummels, um irgendwelchen gegeben befunge Programm hinzurichten. Die negativen Effekten dieser Technik schließen Befestigung eines Dolmetschers zu jedem Programm von Befunge ein. Jedoch, mit Optimierungstricks, BFC versichert V1.1 eine rechtskräftige Größe von nur 5632 Bytes.

Befunge-93 Beispielcode

Die Technik, Pfeile zu verwenden, um Kontrollfluss zu ändern, wird im Zufallszahlengenerator-Programm unten demonstriert. Im Anschluss an die Pfeile ringsherum senden die Instruktionen den Instruktionszeigestock in zufälligen grundsätzlichen Richtungen, bis der Zeigestock eine Ziffer schlägt, ihn zum Stapel stoßend. Dann schiffen die Pfeile zu zur Produktion die Ziffer vom Stapel und geben den Zeigestock zum ersten gerichteten randomiser zurück. Bemerken Sie, dass es nicht gibt, um dieses Programm zu begrenzen, so erzeugt es einen endlosen Strom von Zufallszahlen von 1 bis 9.

v>>>>.

12345

^?^\

>?? ^\

v? v

v6789>

Der folgende Code ist ein Beispiel des Klassikers "Hallo Welt!" Programm. Zuerst werden die Briefe "olleH" auf den Stapel als ASCII Zahlen gestoßen. Diese werden dann vom Stapel in der LIFO-Ordnung und Produktion als Textcharaktere knallen gelassen, "um Hallo" zu geben. Ein Raum ist Charakter Nummer 32 in ASCII, den hier durch das Multiplizieren 4 und 8 gebaut wird, davor Produktion als Text sein. Der restliche Code dann Produktionen "Welt!" auf eine ähnliche Weise, die vom ASCII Charakter 10 (ein Linienfutter-Charakter gefolgt ist, den Produktionscursor zu einer neuen Linie bewegend).

> v

v, "Hallo"

v, "Welt!"

Der folgende Code ist eine ein bisschen mehr komplizierte Version. Es fügt den ASCII Charakter 10 (ein Linienfutter-Charakter) zum Stapel hinzu, und stößt dann"! dlrow, olleH" zum Stapel. Wieder ist LIFO Einrichtung der Mittel, dass "H" jetzt die Spitze des Stapels ist und das erste gedruckt, "e" sein wird und so weiter zweit. Um die Charaktere zu drucken, geht das Programm in eine Schleife ein, dass die ersten Duplikate der Spitzenwert auf dem Stapel (so jetzt würde der Stapel "\n ähnlich sein! dlrow, olleHH". Dann "_" wird Operation den kopierten Wert knallen lassen, und Recht gehen, wenn es eine Null, verlassen sonst ist. (Das nimmt einen entgegenkommenden Dolmetscher an, der 0 "zurückkehrt", wenn er einen leeren Stapel knallen lässt.), Wenn es verlassen geht, lässt es knallen und druckt den Spitzenwert als ein ASCII Charakter. Es kopiert dann den folgenden Charakter und die Schleifen zurück zu "_" Test, fortsetzend, den Rest des Stapels zu drucken, bis es leer ist, und so ist der folgende knallen gelassene Wert 0, an dem Punkt das Programm beendet.

> 25 * "! dlrow, olleH": v

v: _@

> ^\

Befunge-93 Befehlsliste

Die meisten eindimensionalen Programmiersprachen verlangen eine syntaktische Unterscheidung zwischen Anmerkungstext und Quellcode - obwohl diese Unterscheidung so trivial sein kann wie die Regierung von Brainfuck dass jeder Charakter nicht im Satz

Siehe auch

language#Funges

Links


William F. Nolan / Die Zwielicht-Zone
Impressum & Datenschutz