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 ävenBrainfuckä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
Artikeln skriven 2009-01-18 av Learning4sharing
Inga kategorier för denna artikel än...Intresserad av fler artiklar?
Eksjö kommunNavet
Nya Elementar
Mikaelskolan
Minervaskolan
Linghemsskolan
Kristofferskolan
Kvinnebyskolan
GHC