Brainfuck

Brainfuck er et esoterisk programmeringssprog til computere, skabt af Urban Müller omkring 1993. Sproget er i nogle tilfælde kaldes Brainf * ck, Brainf *** eller endda BF for at undgå at fornærme de følelser af andre.

Sprog Struktur

Målet med Müller var at skabe et simpelt programmeringssprog til at fuldføre en Turing-maskine, der kunne implementeres med den mindst mulige compiler. Sproget består af otte instruktioner. Version 2 af den oprindelige compiler, skrevet til Amiga, optager kun 240 bytes. Det var inspireret af sproget FALSK, andet esoterisk programmeringssprog, hvis compiler besatte 1024 bytes.

Som navnet antyder, programmer skrevet i brainfuck tendens til at være svært at forstå. Men brainfuck er en Turing-komplet sprog, og kan bruges til at implementere nogen algoritme, der løb med en Turing-maskine. Forsømme de enorme vanskeligheder i programmeringen af ​​visse algoritmer med brainfuck, er det bestemt muligt at skrive koden.

Sproget er baseret på en meget simpel model, som består af et byte array initialiseres til nul, en pointer til array og to strømme af bytes for input og output.

Instruktioner

De sproglige instruktioner er otte, der hver består af en enkelt karakter og er:

Alternativt kan det forstås som "springe tilbage til den tilsvarende". På denne måde er kortere, men mindre symmetrisk og mindre effektiv med hensyn til tid. De to versioner stadig producere tilsvarende opførsel af hvert program brainfuck.

En tredje tilsvarende udgave, dårligt overvejes, er: det betyder "springer frem til det samme", og betyder "hoppe tilbage til den erklæring, der følger den samme, hvis byte på markøren er nul."

Kilder til brainfuck kan kodes til C ved hjælp af den følgende substitution tabel, forudsat at det er af typen:

Eksempler

Hej Verden!

Følgende kode viser "Hej Verden!" på skærmen, og sender markøren til hovedet

For at opretholde den læsbarheden af ​​registrerede enhed, er en ny linje i gang efter hvert punkt, der repræsenterer output kommando. Bogstaverne H, og den, leo indgik kun som kommentarer i koden. Den brainfuck anser alle tegn bortset fra + - & lt; & gt;,. som kommentarer, så behøver du ikke en speciel syntaks til at angive en kommentar.

Løkken på den første linje angiver den oprindelige værdi af array: a = 70, a = 100, a = 30 og a = 10. Sløjfen virker ved at multiplicere værdien af ​​a, 10, gemme resultatet i de andre celler. Ved slutningen af ​​løkken, markøren til arrayet er nul. & Gt; ++ inkrementerer markøren ved at angive, hvilket er 70, så tilføjer to til denne værdi med det resultat på 72, som er værdien for ASCII-karakter af bogstavet H i hovedstæder. Pointen ved enden af ​​linjen angiver outputtet, forårsager displayet.

Den næste linje flytter markøren til array i én position op, så tilføjer en. et er det nu 101, a "og" små bogstaver, som derefter vises med output erklæring.

Da bogstavet »s« er den syvende bogstav efter »e«, for at vise den "l 'tilføje syv for at vise den aktuelle pointer og output to gange.

'Eller' er det tredje bogstav efter »l«, så øger vi tre gange værdien af ​​array og sende output resultatet.

Den resterende del af programmet fortsætter nøjagtigt som illustreret hidtil. For den plads og store bogstav, de vælge flere pegepinde, som derefter øges, eller formindskes efter behov.

Simple

Enkel løkke

En kontinuerlig løkke, der tager input tekst fra tastaturet og skriver den på skærmen. Bemærk, at det antages, at cellen er sat til 0, når en kommando '' udføres efter afslutningen af ​​input; implementeringer er forskellige i dette punkt. For implementeringer, der sætter cellen til -1 eller EOF, eller som ikke ændre værdien af ​​cellen, bør dette program skrives som "" eller ""

Pointer manipulation

En version af det sidste eksempel, der også gemmer alle input i et array til fremtidig brug, flytte markøren hver gang.

Tilføje

Dette beløb den aktuelle placering til den næste placering.

Betingede

Dette eksempel vil tage små bogstaver input fra tastaturet og vil få dem til at være små bogstaver. Afslut ved at trykke på Enter-tasten.

Først indsætte det første tegn ved hjælp af kommandoen og straks sottriaiamo 10 fra det. Hvis brugeren trykker ind, vil uddannelsen cyklus hoppe efter afslutningen af ​​cyklussen, fordi vi har sat den første byte til nul. Hvis indtastede tegn ikke var 10, vil vi antage at det var et lille bogstav, og vi vil komme ind i cyklus, hvor vi trækker en anden 22 fra det, for i alt 32, som er forskellen mellem en ASCII lille bogstav og det tilsvarende bogstav kapital.

Senere vi vise det. Nu skal vi indsætte det næste tegn, og igen trække 10. Hvis denne karakter var en linjeskift, vi afslutte løkken; ellers går vi tilbage til toppen af ​​løkken, trække et andet 22, vise det, og så videre. Når vi afslutte løkken, programmet slutter, fordi der ikke er flere kommandoer.

Kopiering af en byte

Brainfuck omfatter ikke nogen operation for kopiering af bytes. Dette skal ske med looping konstruktioner og aritmetiske operatorer. Flytning af en byte er simpel nok; flytte værdien af ​​a kan fremstilles som følger:

Men dette nulstiller værdien til 0. Vi kan gendanne værdien efter kopiering ved at drage fordel af evnen til at kopiere en værdi i to steder ad gangen. Hvis du vil kopiere værdien af ​​begge dele, og det er enkelt:

Vi kan drage fordel af dette til at genoprette værdien. Så kan vi ikke destruktivt at kopiere som følger:

Complex

Sum

Dette program føjer to encifrede tal og viser resultatet korrekt, selvom den består af et enkelt ciffer:

Det første tal er indgået, og du trække 48 for at opnå det tilsvarende tal. Dette gøres ved at placere en 6 ind og ved hjælp af en løkke at trække 8 fra det tilsvarende antal gange. Dernæst sætte dig på plustegnet i; Endelig indsætter det andet nummer, overskriver symbolet beløb.

Den næste cyklus er det virkelige arbejde, flytter det andet nummer på det første, at tilføje dem sammen og nulstilling. I hver sløjfe, det tilføjer til og trækker en fra den første; så det til sidst nulstillet, og den tilsatte mængde er netop det fjernet fra. Det er derefter indsat i en returværdi.

Derefter markøren flyttes tilbage til, som vises, Da vi ikke har korrigeret b.; denne værdi er identisk med + 48, hvilket er, hvad vi vil) Nu markøren flyttes til, som indeholder resultatet.; Endelig vises, slutter algoritmen

Multiplikation

Ligesom det foregående eksempel, men det udfører multiplikationen, ikke tilsætning.

Det første tal er indgået, stjernen og derefter det andet nummer er indsat i, og begge tal er korrigeret ved at fratrække 48 fra dem.

Nu skal vi ind i vigtigste løkke af multiplikation. Den grundlæggende idé er, at hver gang gennem det vi trækker en fra og føje til løbende total holdes. Især: den første indre sløjfe bevæger sig på begge og, mens nulstilles. Den prissimo indre sløjfe bevæger sig tilbage inde, nulstilling. Så en fratrækkes, og den ydre løkke afsluttes. Kommer ud af denne cyklus, er nul, det fortsætter med at holde det andet nummer, og indeholder produktet af de to tal.

Vi tilføjer nu 48 til produktet indsætte et resultat, viser vi det produkt ved hjælp af ASCII-tegn, og derefter visualisere de resultater, vi har gemt.

Kommentar

Fordi hvert sted er angivet som en byte array, kommandoen - det er unødvendigt og kunne erstattes med 255 + kommandoer. Tilsvarende, hvis den del af arrayet var færdig og cirkulær, & lt; Det kunne erstattes med kontroller & gt;. Men størrelsen af ​​arrayet, at cellernes evne bør være ubegrænset, hvis sproget ønsker at være Turing-kompatibel ..

Programmeringssprog som

En liste over lignende sprog:

  • Doublefuck, en variant af brainfuck med to hukommelsesbuffere stedet for én.
  • Brainfork
  • PATH, en blanding af brainfuck og Befunge
  • SNUSP, lignende, men med en opfordring til stakken.
  • l33t
  • L00P
  • Ook!
  • QUOTE
  • Aura
  • LOLCODE
Forrige artikel BCS teori
Næste artikel Brenta