Start Logga In Skriv Artikel Om Oss
Vad söker du?
Allt om 'Brainfuck'

Brainfuck

Innehåll- 1. Kort om Brainfuck - 2. Paradigm - 2.1 Språkets åtta instruktioner - 3. Problem - 4. Implementationer - 4.1 Implementation i C - 5. Exempelkod - 5.1Quine - 5.2 Hello world - 5.3Divisionsrutin 1 - 5.4Divisionsrutin 2 - 6. Övriga resurser - 7. Se även

Brainfuckär ett minimalistiskt och turingkomplett programspråk.

1. Kort om Brainfuck

Brainfuck uppfanns 1993 av Urban Mueller, vars syfte var att skapa ett turingkomplett programspråk som kunde implementeras med en minimal kompilator. Den ursprungliga kompilatorn var endast 240 bytes stor.

Att programmera i brainfuck är svårt, att läsa brainfuckkod är ännu svårare. Namnet Brainfuck syftar på vad en programmerare kan tänkas uppleva då denne sysslar med brainfuckutveckling. Se även: fontanellsex.

Att språket är turingkomplett innebär att alla beräkningsbara problem kan lösas med hjälp av brainfuck.

2. Paradigm

Centralt i språket står en pekare och en sekvens av bytes (array eller tape). Initialt pekar pekaren längst till vänster i sekvensen och alla bytes har värdet noll. Det finns även en indata- och en utdata-ström. Brainfuck påminner i många avseenden om turingmaskinen och fungerar därför utmärkt som introduktion till programmering av turingmaskiner.

2.1 Språkets åtta instruktionerDet finns totalt åtta instruktioner. Dessa flyttar pekaren, manipulerar det minne pekaren pekar på, hanterar I/O samt styr programflödet. Det är vanligt att översätta brainfuckkod till C-kod (motsvarande) för att ge den oinsatte en bättre uppfattning om instruktionernas funktion.

Tecken Betydelse Motsvarighet i C > flytta pekaren ett steg åt höger pointer++; < flytta pekaren ett steg åt vänster pointer--; + addera ett till byten pekaren pekar på *pointer++; - subtrahera ett från byten pekaren pekar på *pointer--; . skriv innehållet i byten pekaren pekar på till utdata-strömmen putchar(*pointer); , läs en byte från indata-strömmen och lagra den där pekaren pekar *pointer=getchar(); [ om minnespekaren är noll, hoppa förbi till motsvarande ] while(*memory!=0){ ] hoppa tillbaka till motsvarande [ }

3. Problem

Många variationer av språket har dykt upp under årens lopp, vilket har resulterat i ett antal portabilitetsproblem av varierande magnitud. T ex anser somliga att hash-tecknet (#) skall betraktas som en särskild debuginstruktion och vissa hävdar bestämt att varje cell i minnessekvensen skall vara två bytes stor. Det instruktionsset och den cellstorlek som presenteras på denna sida kan nog anses vara den vanligast förekommande modellen.

Ett annat stort problem, förmodligen det största, är vad som skall hända om ,-instruktionen exekveras då det inte finns någon data att hämta från indata-strömmen. Vissa implementationer väljer att skriva 0x00 till minnet, andra väljer att skriva 0xff (-1) till minnet och ett fåtal galningar väljer att inte skriva något alls. Tyvärr finns det inget konsensus i frågan bland brainfuckutvecklarna.

4. Implementationer

Det finns implementationer av Brainfuck i nästan alla programmeringsspråk. Ett trevligt arkiv med diverse tolkar och kompilatorer finner du här:
  • http://esoteric.sange.fi/brainfuck/impl/

4.1 Implementation i CHär är en av de mer estetiskt tilltalande implementationerna som har hyggligt högt hackvärde.

char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;main(){for(read(0,r,4000);c=*r; r++)c-]||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-[||d++||(*++s=r),d||(*p+=c== +,*p-=c==-,p+=c==>,p-=c==<,c-.||write(2,p,1),c-,||read(2,p,1));}

5. Exempelkod

5.1QuineHär är en quine, dvs ett program som skriver ut sin egen källkod, skriven i brainfuck: ->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+>+++>>++>++>>+>>+>++>++>+> >>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>++>+>>>>+++>>+++++>>+>+++>>>+ +>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+++>+>+++>>>++>>++++>>+>>++>+>> >>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>+++>+>++>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++> +>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++>>+++++ +>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+ ++>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+<<]<+]++++ +[->+++++++++<]>.[+]>>[<<+++++++[->+++++++++<]>-.------------------->-[-<.<+>>]<[+]<+>>>]<<<[-[-[-[>>+<++++++[->+++++<]]>++++++++++++++<]>+++<]++++++[->++++++ +<]>+<<<-[->>>++<<<]>[->>.<<]<<]

5.2 Hello worldEn Hello world-implementation:++++++++[->+++++++++<]>.<+++++++[->++++<]>+.+++++++..+++.>++++++++[->++++<]>.<<++++++++.--------.+++.------.--------.>>+.---[---<+>]<.

5.3Divisionsrutin 1Ett stycke kod som genomför division:>>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<[->>+>+<<<]>>>[-<<<+>>>]<<[->>+>+<<<]>>>[-<<<+>>>]<<[>[>>>>[-]<<<<<[->>+>>>+<<<<<]>>[-<<+>>]<[-<->>+<<[>>-<<[->>>+<<<]]>>>[-<<<+>>>]<[-<[-]>]<]<[<[->>+>+<<<]>>>[-<<<+>>>]>>+<<<<[->>+<<]]>>[-<<+>>]<]<<[->+>+<<]>[-<+>]>>>>>[-<<+<+>>>]<<<[-<->]+<[>-<[-]]>[>[-]>+<<-]<<][-]>[-]>>[-<<+>>]>[-<<<<+>>>>]>[-]<[-]<[-]<[-]<<<<Låt cellen pekaren pekar på innehålla täljare och låt cellen närmast till höger innehålla nämnare. Ytterligare sex (6) celler används då koden exekveras. Följande tabell illustrerar hur minnet ser ut före och efter exekvering: Före exekvering: täljare nämnare Efter exekvering: täljare nämnare kvot rest 0 0 0 0

5.4Divisionsrutin 2En betydligt mer elegant lösning, av Daniel Cristofani:>>[-]>[-]>[-]>[-]>[-]<<<<<<[>>+<<-]>[>>+<<-]>+[<[-]>>[>>+<<-]>>>+<[<<<<+>[-<<+>>>+>]>>[<]>-]<<<]>->>>-[<<<<+>>>>-]<<<<<<- Före exekvering: täljare nämnare Efter exekvering: täljare nämnare kvot rest 0 0 0

6. Övriga resurser

  • av Linus Åkesson
  • En grafisk variant av brainfuck som arbetar direkt mot grafikminnet.
  • av Daniel Cristofani
  • En brainfuckkompilator skriven i Brainfuck (för Linux på i386)

7. Se även

  • Ook!
  • Whitespace
  • Turingmaskin

Redigera?

Artikeln skriven 2009-01-18 av Learning4sharing

Inga kategorier för denna artikel än...

Vi behhöver hjälp att kategorisera våra artiklar. Kan du skriva ett nyckelord för denna artikel? Du kan skriva upp till 3 olika nyckelord för denna artikel, vi uppskattar din hjälp!

Skriv nyckelord som du tycker beskriver denna artikel på ett bra sätt. Du kan ange 3 olika nyckelord för denna artikel, max 20 tecken per nyckelord.

  1. Lägg till fler
    Skriv in svaret på frågan: 9+2

Intresserad av fler artiklar?

Eksjö kommun
Navet
Nya Elementar
Mikaelskolan
Minervaskolan
Linghemsskolan
Kristofferskolan
Kvinnebyskolan
GHC

Senaste sökningarna

fryntlig har fått 1168 sökningar. Den senaste gjordes 2022-08-10 12:31:11.

brikks har fått 1266 sökningar. Den senaste gjordes 2022-08-10 12:29:10.

skoda har fått 1161 sökningar. Den senaste gjordes 2022-08-10 12:21:59.

foa har fått 1258 sökningar. Den senaste gjordes 2022-08-10 12:11:41.

mx har fått 1289 sökningar. Den senaste gjordes 2022-08-10 12:09:29.

140 har fått 1248 sökningar. Den senaste gjordes 2022-08-10 12:07:31.

fosforsyra har fått 1262 sökningar. Den senaste gjordes 2022-08-10 12:05:55.

visor har fått 1593 sökningar. Den senaste gjordes 2022-08-10 12:05:42.

jaguar har fått 1241 sökningar. Den senaste gjordes 2022-08-10 12:05:29.

rabaeus har fått 1148 sökningar. Den senaste gjordes 2022-08-10 12:04:50.

daniel defoe har fått 1708 sökningar. Den senaste gjordes 2022-08-10 12:03:58.

bronker har fått 1298 sökningar. Den senaste gjordes 2022-08-10 12:00:43.

Designed by: template world
Learning4sharing.nu
All Rights Reserved. 1.56 SEK

Logga in

Välkommen att redigera och skriva nya artiklar!

Ingent Konto?

Skaffa konto för att redigera och skapa nya ariklar Nytt Konto.

Ny Användare

Välkommen att redigera och skriva nya artiklar! Skapa konto nedan.


Ett verifieringsmail kommer att skickas till din E-post som du måste öppna och verifiera din E-post med

Lägg till artikel

Du är inte inloggad.

Logga In eller Skapa konto.