Brainfuck

Die brainfuck Programmiersprache ist eine esoterische für seinen äußersten Minimalismus bemerkte Programmiersprache. Es ist Turing tarpit, entworfen, um Programmierer herauszufordern und zu amüsieren, und wurde nicht gemacht, für den praktischen Gebrauch passend zu sein. Es wurde 1993 von Urban Müller geschaffen.

Der Name der Sprache wird allgemein außer am Anfang eines Satzes nicht kapitalisiert, obwohl es ein Eigenname ist.

Sprachdesign

Urban Müller hat brainfuck 1993 mit der Absicht geschaffen, eine Sprache zu entwerfen, die mit dem kleinstmöglichen Bearbeiter durchgeführt werden konnte, der durch den 1024-Byte-Bearbeiter für die FALSCHE Programmiersprache begeistert ist. Mehrere brainfuck Bearbeiter sind kleiner gemacht worden als 200 Bytes. Der klassische Vertrieb ist die Version 2 von Müller, einen Bearbeiter für Amiga, einen Dolmetscher, Beispiel-Programme und ein readme Dokument enthaltend.

Die Sprache besteht aus acht Befehlen, die unten verzeichnet sind. Ein brainfuck Programm ist eine Folge dieser Befehle, die vielleicht andere Charaktere eingestreut sind (die ignoriert werden). Die Befehle werden folgend durchgeführt, außer, wie bemerkt, unten; ein Instruktionszeigestock beginnt am ersten Befehl, und jeder Befehl, zu dem es hinweist, wird durchgeführt, nach dem es normalerweise zum folgenden Befehl vorankommt. Das Programm endet, wenn sich der Instruktionszeigestock vorbei am letzten Befehl bewegt.

Die brainfuck Sprache verwendet ein einfaches Maschinenmodell, das aus dem Programm- und Instruktionszeigestock, sowie eine Reihe von mindestens 30,000 Bytes zur Null initialisierten Zellen besteht; ein beweglicher Datenzeigestock (initialisiert, um zum leftmost Byte der Reihe hinzuweisen); und zwei Ströme von Bytes für den Eingang und die Produktion (meistenteils verbunden mit einer Tastatur und einem Monitor beziehungsweise und dem Verwenden der ASCII Charakter-Verschlüsselung).

Befehle

Die acht Sprachbefehle, jeder, aus einem einzelnen Charakter bestehend:

(Wechselweise kann der Befehl stattdessen als ein vorbehaltloser Sprung zum entsprechenden Befehl, oder umgekehrt übersetzt werden; Programme werden sich dasselbe benehmen, aber werden langsamer wegen der unnötigen doppelten Suche laufen.)

und das Match als Parenthesen tut gewöhnlich: Jeder passt genau ein und umgekehrt, das Kommen zuerst zusammen, und dort kann nicht unvergleichlich sein oder zwischen den zwei.

Programme von Brainfuck können in C das Verwenden der folgenden Ersetzungen übersetzt werden, das Annehmen ist vom Typ und ist initialisiert worden, um zu einer Reihe von zeroed Bytes hinzuweisen:

Wie der Name darauf hinweist, brainfuck Programme neigen dazu, schwierig zu sein, umzufassen. Das ist teilweise, weil jede mild komplizierte Aufgabe eine lange Folge von Befehlen verlangt; teilweise ist es, weil der Text des Programms keine direkten Anzeigen des Staates des Programms gibt. Das, sowie die Wirkungslosigkeit von brainfuck und seine beschränkten Fähigkeiten des Eingangs/Produktion, sind einige der Gründe es wird für die ernste Programmierung nicht verwendet. Dennoch, wie jede Turing-ganze Sprache, ist brainfuck dazu theoretisch fähig, jede berechenbare Funktion zu schätzen oder jedes andere rechenbetonte Modell, wenn gegeben Zugang zu einem unbegrenzten Betrag des Gedächtnisses vorzutäuschen. Eine Vielfalt von brainfuck Programmen ist geschrieben worden. Obwohl brainfuck Programme, besonders komplizierte, schwierig sind zu schreiben, ist es ziemlich trivial, um einem Dolmetscher für brainfuck auf einer typischeren Sprache wie C wegen seiner Einfachheit zu schreiben. Dort sogar besteht ein brainfuck Dolmetscher, der auf der brainfuck Sprache selbst geschrieben ist.

Die formelle "Elternteilsprache von Brainfuck"

Abgesehen von seinen zwei Eingabe/Ausgabe-Befehlen ist brainfuck eine geringe Schwankung der formellen Programmiersprache P  geschaffen von Corrado Böhm 1964. Tatsächlich, mit sechs Symbolen, die zu den jeweiligen Brainfuck-Befehlen gleichwertig sind,

Beispiele

Hallo Welt!

Das folgende Programm druckt "Hallo Welt!" und ein newline zum Schirm:

+++++ +++++ initialisieren Schalter (Zelle #0) zu 10

[verwenden Sie Schleife, um die folgenden vier Zellen auf 70/100/30/10 zu setzen

> +++++ ++ tragen 7 zur Zelle #1 bei

> +++++ +++++ tragen 10 zur Zelle #2 bei

> +++ tragen 3 zur Zelle #3 bei

> + tragen 1 zur Zelle #4 bei

> +. drucken Sie 'e'

+++++ ++. drucken Sie 'l'

. drucken Sie 'l'

+++. drucken Sie 'o'

> ++. drucken Sie ''

+++. drucken Sie 'r'

------. drucken Sie 'l'

--------. drucken Sie 'd'

> +. Druck'!'

>. drucken Sie '\n'

</Quelle>

Für die Lesbarkeit ist dieser Code über viele Linien und Formblätter ausgebreitet worden, und Anmerkungen sind hinzugefügt worden. Brainfuck ignoriert alle Charaktere außer den acht Befehlen

Die erste Linie initialisiert durch das einfache Erhöhen zehnmal von 0. Die Schleife von der Linie 2 effektiv Sätze die Anfangswerte für die Reihe: (In der Nähe von 72 codieren die ASCII für den Charakter 'H'), (in der Nähe von 101 oder 'e'), (in der Nähe von 32, der Code für den Raum) und (newline). Die Schleife arbeitet durch das Multiplizieren des Werts, durch 7, 10, 3, und 1, das Sparen der Ergebnisse in anderen Zellen. Nachdem die Schleife beendet wird, [0] ist Null. dann bewegt den Zeigestock, an dem hält, trägt zwei dazu bei (das Produzieren 72, der der ASCII Charakter-Code eines Kapitals H ist), und Produktionen es.

Die folgende Linie bewegt den Reihe-Zeigestock dazu und fügt denjenigen dazu, das Produzieren, ein Kleinbuchstabe 'e' hinzu, der dann Produktion ist.

Da 'l' zufällig der siebente Brief ist, nachdem 'e', zur Produktion 'll' weitere sieben dazu hinzugefügt werden und das Ergebnis Produktion zweimal ist.

'o' ist der dritte Brief danach 'l', so wird noch drei Male und Produktion das Ergebnis erhöht.

Der Rest des Programms geht ebenso weiter. Für die Raum- und Großbuchstaben werden verschiedene Reihe-Zellen ausgewählt und erhöht oder decremented, wie erforderlich.

ROT13

Dieses Programm verschlüsselt seinen Eingang mit der ROT13 Ziffer. Um das zu tun, muss es Charaktere A-M (ASCII 65-77) zu N-Z (78-90), und umgekehrt kartografisch darstellen. Auch es muss a-m (97-109) zu n-z (110-122) und umgekehrt kartografisch darstellen. Es muss alle anderen Charaktere zu sich kartografisch darstellen; es liest Charaktere einer nach dem anderen und Produktionen ihre verschlüsselten Entsprechungen, bis es einen EOF liest (hier angenommen, entweder als-1 oder als "keine Änderung" vertreten zu werden), an dem Punkt das Programm endet.

Die grundlegende verwendete Annäherung ist wie folgt. Wenn Sie den Eingangscharakter x nennen, teilen Sie x-1 durch 32, Quotienten und Rest behaltend. Wenn der Quotient 2 oder 3, gerade Produktion x nicht ist, eine Kopie davon während der Abteilung behalten. Wenn der Quotient 2 oder 3 ist, teilen Sie den Rest ((x-1) modulo 32) durch 13; wenn der Quotient hier 0, Produktion x+13 ist; wenn 1, Produktion x-13; wenn 2, Produktion x.

Bezüglich des Abteilungsalgorithmus, wenn es sich y durch z teilt, um einen Quotienten q und Rest r zu bekommen, gibt es eine Außenschleife, die q und r zuerst zum Quotienten und Rest von 1/z, dann zu denjenigen von 2/z und so weiter setzt; nachdem es y Zeiten durchgeführt hat, endet diese Außenschleife, q und R-Satz zum Quotienten und Rest von y/z abreisend. (Die Dividende y wird als ein sich vermindernder Schalter verwendet, der kontrolliert, wie oft diese Schleife durchgeführt wird.) Innerhalb der Schleife gibt es Code, um r und Verminderung y zu erhöhen, der gewöhnlich genügend ist; jedoch, jedes zth Mal durch die Außenschleife, ist es für die Null r und Zunahme q notwendig. Das wird mit einem sich vermindernden Gegensatz zum Teiler z getan; jedes Mal durch die Außenschleife ist dieser Schalter decremented, und wenn es Null erreicht, wird es durch das Bewegen des Werts von r zurück darin nachgefüllt.

-, + [Der gelesene erste Charakter und fangen Außencharakter-Lesen-Schleife an

- [Hüpfen Sie vorwärts, wenn Charakter 0 ist

>> ++++ [> ++++++++

> - [-[

> [+ [

> [Hüpfen Sie vorwärts, wenn Quotient 0 war

- [Verminderungsquotient und Hopser schicken nach, wenn Quotient 1 war

-

]

]

] Beenden Sie Außenhopser-Schleife (Sprung zu hier, wenn ((Charakter minus 1)/32) nicht 2 oder 3 war)

Beweglichkeitsprobleme

Teilweise, weil Urban Müller keine gründliche Sprachspezifizierung geschrieben hat, sind die vielen nachfolgenden brainfuck Dolmetscher und Bearbeiter gekommen, um ein bisschen verschiedene Dialekte von brainfuck zu verwenden.

Zellgröße

Im klassischen Vertrieb sind die Zellen 8-Bit-Größe (Zellen sind Bytes), und das ist noch die allgemeinste Größe. Jedoch, um Nichttextdaten zu lesen, muss ein brainfuck Programm eventuell eine Bedingung des Endes der Datei von jedem möglichen Byte-Wert unterscheiden; so sind 16-Bit-Zellen auch verwendet worden. Einige Durchführungen haben 32-Bit-Zellen verwendet, 64-Bit-Zellen oder bignum Zellen mit der praktisch unbegrenzten Reihe, aber Programme, die diese Extrareihe verwenden, werden wahrscheinlich, seit der Speicherung des Werts n in eine Zelle langsam sein, verlangen Ω (n) Zeit, weil ein Wert einer Zelle nur durch das Erhöhen und decrementing geändert werden kann.

In allen diesen Varianten, und Befehle noch gelesen und schreiben Daten in Bytes. In den meisten von ihnen hüllen sich die Zellen ringsherum, d. h. das Erhöhen einer Zelle ein, die meint, dass sein maximaler Wert (mit dem Befehl) es zu seinem minimalen Wert und umgekehrt bringen wird. Die Ausnahmen sind Durchführungen, die von der zu Grunde liegenden Hardware, Durchführungen entfernt sind, die bignums und Durchführungen verwenden, die versuchen, Beweglichkeit geltend zu machen.

Glücklich ist es gewöhnlich leicht, brainfuck Programme zu schreiben, die Bildumlauf der ganzen Zahl oder Überschwemmung nicht jemals verursachen, und deshalb von Zellgröße nicht abhängen. Allgemein bedeutet das, Zunahme +255 (nicht unterzeichneter 8-Bit-Bildumlauf) zu vermeiden oder zu vermeiden, die Grenzen [-128 zu überschreiten, +127] (hat 8-Bit-Bildumlauf unterzeichnet) (da es keine Vergleich-Maschinenbediener gibt, kann ein Programm nicht zwischen einer Ergänzungszelle der festen Bit-Größe eines unterzeichneten und nicht unterzeichneten two unterscheiden, und die Negativkeit von Zahlen ist eine Sache der Interpretation). Für mehr Details auf dem Bildumlauf der ganzen Zahl, sieh die Ganze Zahl Artikel überfluten.

Reihe-Größe

Im klassischen Vertrieb hat die Reihe 30,000 Zellen, und der Zeigestock beginnt an der leftmost Zelle. Noch mehr Zellen sind erforderlich, um Dinge wie die millionste Fibonacci-Zahl zu versorgen, und die leichteste Weise, die Sprache Turing-abgeschlossen zu machen, soll die Reihe unbegrenzt rechts machen.

Einige Durchführungen erweitern die Reihe nach links ebenso; das ist eine ungewöhnliche Eigenschaft, und deshalb hängen tragbare brainfuck Programme davon nicht ab.

Wenn sich der Zeigestock außerhalb der Grenzen der Reihe bewegt, werden einige Durchführungen eine Fehlermeldung geben, einige werden versuchen, die Reihe dynamisch zu erweitern, einige werden nicht bemerken und werden unbestimmtes Verhalten erzeugen, und einige werden den Zeigestock zum entgegengesetzten Ende der Reihe bewegen. Einige Umtausche werden beteiligt: Erweiterung der Reihe ist dynamisch nach rechts die benutzerfreundlichste Annäherung und ist für speicherhungrige Programme gut, aber es trägt eine Geschwindigkeitsstrafe. Wenn eine Reihe der festen Größe verwendet wird, ist es nützlich, es sehr groß zu machen, oder besser noch den Benutzer die Größe setzen zu lassen. Das Geben einer Fehlermeldung für Grenze-Übertretungen ist für das Beseitigen, aber sogar sehr nützlich, der eine Geschwindigkeitsstrafe trägt, wenn es durch den Speicherschutz des Betriebssystems nicht behandelt werden kann.

Code des Endes der Linie

Verschiedene Betriebssysteme (und manchmal verschiedene Programmierumgebungen) verwenden subtil verschiedene Versionen von ASCII. Der wichtigste Unterschied ist im Code, der für das Ende einer Linie des Textes verwendet ist. MS-DOS und Windows von Microsoft verwenden einen CRLF, d. h. 13, die von 10 in den meisten Zusammenhängen gefolgt sind. UNIX und seine Nachkommen, einschließlich Linux und Mac OS X, verwenden gerade 10, und ältere Macs verwenden gerade 13. Es würde unglücklich sein, wenn brainfuck Programme für verschiedene Betriebssysteme umgeschrieben werden müssten. Glücklich ist ein vereinigter Standard leicht zu finden. Der Bearbeiter von Urban Müller und seine Beispiel-Programme verwenden 10, sowohl auf dem Eingang als auch auf der Produktion; so eine große Mehrheit von vorhandenen brainfuck Programmen; und 10 ist auch günstiger, um zu verwenden, als CRLF. So, brainfuck Durchführungen sollte sicherstellen, dass brainfuck Programme, die newline=10 annehmen, richtig laufen werden; viele tun so, aber einige tun nicht.

Diese Annahme ist auch mit dem grössten Teil des Beispielcodes in der Welt für C und andere Sprachen im Einklang stehend, darin verwenden sie '\n', oder 10, für ihren newlines. Auf Systemen, die CRLF Linienenden verwenden, stellt die C Standardbibliothek durchsichtig "\n" zu "\r\n" auf der Produktion und "\r\n" zu "\n" auf dem Eingang für in der binären Weise nicht geöffnete Ströme kartografisch wiederdar.

Verhalten des Endes der Datei

Das Verhalten des Befehls, als auf eine Bedingung des Endes der Datei gestoßen worden ist, ändert sich. Einige Durchführungen setzen die Zelle am Zeigestock zu 0, ein Satz es zum C unveränderlichen EOF (in der Praxis das ist gewöhnlich-1), eine Erlaubnis der unveränderte Wert der Zelle. Es gibt keine echte Einigkeit; Argumente für die drei Handlungsweisen sind wie folgt.

Das Setzen der Zelle zu 0 vermeidet den Gebrauch von negativen Zahlen, und macht es geringfügig kürzer, um eine Schleife zu schreiben, die Charaktere liest, bis EOF vorkommt. Das ist eine von Panu Kalliokoski ausgedachte Spracherweiterung.

Das Setzen der Zelle zu-1 erlaubt EOF, von jedem Byte-Wert bemerkenswert zu sein (wenn die Zellen größer sind als Bytes), der notwendig ist, um Nichttextdaten zu lesen; auch ist es das Verhalten der C Übersetzung von gegebenen in der readme Datei von Müller. Jedoch ist es nicht offensichtlich, dass jene C Übersetzungen als normativ genommen werden sollen.

Das Verlassen des unveränderten Werts der Zelle ist das Verhalten des brainfuck Bearbeiters von Urban Müller. Dieses Verhalten kann mit jedem von anderen leicht koexistieren; zum Beispiel kann ein Programm, das EOF=0 annimmt, die Zelle auf 0 vor jedem Befehl setzen, und wird dann richtig an Durchführungen arbeiten, die entweder EOF=0 oder EOF = "keine Änderung" tun. Es ist so leicht, "keine Änderung" Verhalten anzupassen, dass jeder brainfuck für die Beweglichkeit interessierte Programmierer so tun sollte.

Verschiedene Dialekte

Viele Menschen haben brainfuck modifiziert, um ihre eigenen Sprachen häufig zu erzeugen indem er Befehle gelegentlich hinzufügt, indem er sie entfernt. Viele der resultierenden Sprachen werden in die brainfuck Ableitungsliste auf den Esoterischen Sprachen wiki eingeschlossen. Jedoch gibt es auch namenlose geringe Varianten, gebildet vielleicht infolge der Unachtsamkeit, deren einige der allgemeineren sind:

  • anstatt des Ignorierens, irgendwelcher Nichtbefehl-Charaktere in brainfuck Programmen verbietend
  • das Einführen eines Anmerkungsanschreibers, der der Rest der Linie kommentiert
  • verschiedene Modifizierungen der Schleife-Semantik, manchmal Vollständigkeit von Turing zerstörend
  • das Verlangen einen speziellen Charakter, das Ende des Programms zu kennzeichnen

Links

  • Ook.jar, ein anderer Ook! und Sprachdolmetscher von Brainfuck, der dieses Mal in Java geschrieben ist.
  • BrainForce, Bearbeiter (wickeln gcc), und C Übersetzer (hat viele Optionen, sich einhüllende Werte, Zellgrößen, usw. zu kontrollieren)
  • esolang, ein Dolmetscher von Brainfuck für das iPhone, das im Ziel c geschrieben ist.
  • Le Brainfuck, Javascript hat den optimierenden Dolmetscher gestützt. Auch hat viele Optionen einschließlich des Speicherabladens.
  • Brainfuck C, ein Leichtgewichtler in C geschriebener Dolmetscher von Brainfuck.
  • Brainfuck Java, ein Dolmetscher für die Sprache von Brainfuck und seine auf der Programmiersprache von Java geschriebenen Dialekte.
  • Brainfuck Ruby, ein Leichtgewichtler in Ruby geschriebener Dolmetscher von Brainfuck.

Klinge-Läufer 2: Der Rand des Menschen / Bartolomeo Ammannati
Impressum & Datenschutz