Brainfuck

esoterische, minimalistische programmeertaal

Brainfuck is een esoterische programmeertaal die rond 1993 door Urban Müller is gemaakt. De taal wordt soms brainf*ck, brainf***, of BF genoemd als men beleefd wil zijn.

Overzicht bewerken

Müllers doel was om een turing-volledige programmeertaal te maken die met de kleinst mogelijke compiler zou kunnen worden geïmplementeerd. De taal bestaat uit acht statements. De tweede versie van de originele compiler[1], geschreven voor de Amiga, is slechts 240 bytes groot. Urban werd geïnspireerd door de programmeertaal False, waarvan de compiler 1024 bytes groot was.

Zoals de naam al suggereert, zijn brainfuck-programma's over het algemeen moeilijk te begrijpen. Daar staat tegenover dat elke turingmachine, en daardoor ook brainfuck, elke rekentaak kan volbrengen. Als we de moeilijkheden om bepaalde taken te programmeren buiten beschouwing laten, is dat inderdaad mogelijk.

De taal is gebaseerd op een zeer eenvoudige virtuele machine die buiten het programma bestaat uit een rij van bytes die op nul zijn gezet, een pointer naar een element van de rij (de startwaarde van de pointer is de eerste byte) en twee rijen bytes die de invoer en uitvoer vormen. Brainfuck-code kan eenvoudig als C-code herschreven worden (zie tabel). De acht statements, die elk bestaan uit een enkel karakter, zijn de volgende:

Karakter Betekenis C-equivalent*
> verhoog de pointer. ++ptr;
< verlaag de pointer. --ptr;
+ verhoog de byte waar de pointer naar wijst. ++(*ptr);
- verlaag de byte waar de pointer naar wijst. --(*ptr);
. geef de byte waar de pointer naar wijst als ASCII-output. putchar(*ptr);
, gebruik de volgende ASCII-inputbyte om de byte waar de pointer naar wijst in te vullen. *ptr = getchar();
[ spring voorwaarts naar het statement na de corresponderende ] indien de byte waar de pointer naar wijst een nul is. while(*ptr) {
] spring terug naar het statement achter de corresponderende [ indien de byte waar de pointer naar wijst geen nul is. }
  • "ptr" is een variabele van het type unsigned char*, die kan bijvoorbeeld zo geïnitialiseerd worden voor een array met 100 karakters:
    char* ptr = malloc(100*sizeof(char));

Karakters die niet tot de taal behoren, dienen genegeerd te worden door de compiler. In sommige brainfuck-afgeleiden wordt de taal nog uitgebreid met extra tekens: het #-teken om debug-informatie te bekijken, of een ander speciaal teken om het einde van de code aan te duiden. Het is gebruikelijk om Brainfuck-varianten een andere naam te geven, zoals bij de bestaande varianten BrainFork of Extended Brainfuck Type I.

Hello world bewerken

De code om met Brainfuck "Hello World" te genereren is de volgende:

++++++++++
[>+++++++>++++++++++>+++>+<<<<-] De initialiserende loop om de array te maken
>++. Print 'H'
>+. Print 'e'
+++++++. Print 'l'
. Print 'l'
+++. Print 'o'
>++. Print ' '
<<+++++++++++++++. Print 'W'
>. Print 'o'
+++. Print 'r'
------. Print 'l'
--------. Print 'd'
>+. Print '!'
>. Print newline

Voor de leesbaarheid is dit programma over meerdere regels gespreid, en zijn er commentaren voorzien. Dit kan, op voorwaarde dat het commentaar geen taaltekens (, . < > [ ] + -) bevat, want de compiler negeert alle vreemde tekens. Bijgevolg is volgende code equivalent:

 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Zie ook bewerken

Externe links bewerken