Brainfuck
# Brainfuck

Brainfuck (en español 'jodecerebros') es un lenguaje de programación esotérico, diseñado por Urban Müller en 1993, con el objetivo de hacer un lenguaje que fuera a la vez muy simple, Turing completo y que requiriese un compilador pequeño. Müller basó Brainfuck en la máquina de Turing y le sirvió de inspiración el compilador de 1024 bytes de tamaño del lenguaje FALSE.

La distribución clásica es la versión 2 escrita por el propio Müller, conteniendo un compilador para el ordenador Amiga, un intérprete, programas de ejemplo y un documento readme.

## Diseño del lenguaje

El lenguaje se basa en un modelo de ejecución simple que consiste, además del programa, de un vector de (al menos) 30 000 bytes inicializados a cero, un puntero sobre ese vector (que al comienzo de la ejecución apunta al primer elemento del vector) y dos «corrientes» de bytes para la entrada y la salida.

### Instrucciones

Hay solo ocho instrucciones, y todas son de un carácter.

| Carácter | Significado |
| - | - |
| > | Incrementa el puntero. |
| < | Decrementa el puntero. |
| + | Incrementa el byte apuntado. |
| - | Decrementa el byte apuntado. |
| . | Escribe el byte apuntado en el flujo de salida. |
| , | Lee un byte del flujo de entrada y lo almacena en el byte apuntado. |
| [ | Avanza a la instrucción inmediatamente posterior al ] correspondiente si el byte actualmente apuntado es nulo (si es 0). |
| ] | Retrocede a la instrucción inmediatamente posterior al [ correspondiente si el byte actualmente apuntado no es nulo (si es distinto de 0). |

### Traducción a otros lenguajes

Los programas de Brainfuck se pueden traducir a C y Perl con estas substituciones, suponiendo que ptr sea del tipo unsigned char*. Sin embargo, poseen sus propios traductores. En el caso de Lua, utiliza una variable i para indicar el puntero y c siendo una tabla como representación de las celdas; la inicialización de estas variables sería: i, c = 0,.

| brainfuck | C | Perl | Lua |
| - | - | - | - |
| > | ++ptr; | $pointer++; | i = i + 1 |
| < | --ptr; | $pointer--; | i = i - 1 |
| + | ++*ptr; | $tape[$pointer]++; | c[i] = (c[i] or 0) + 1 |
| - | --*ptr; | $tape[$pointer]--; | c[i] = (c[i] or 0) - 1 |
| . | putchar(*ptr); | print chr$tape[$pointer]; | io.write(string.char(c[i] or 0)) |
| , | *ptr=getchar; | $tape[$pointer]=ord(<>); | c[i] = io.read:byte |
| [ | while (*ptr) { | while($tape[$pointer]){ | while (c[i] or 0) ~= 0 do |
| ] | } | } | end |

## Ejemplos

### Hola Mundo!

Este sería el típico programa que escribe «Hola mundo!»

El correspondiente código «Hola mundo!» se escribiría, en una sola línea:

ya que no le afectan los espacios, las tabulaciones o los saltos de línea.

### El juego de la vida

ejemplo.

