Ir al contenido

Befunge

De Wikipedia, la enciclopedia libre
Programa básico de "¡Hola mundo!" escrito en Befunge.

Befunge es un lenguaje de programación esotérico, funge-oide, reflexivo y basado en pila. Difiere de los lenguajes convencionales en que los programas están dispuestos en una parrilla bidimensional. Las instrucciones "flecha" dirigen el control de flujo hacia arriba, abajo, izquierda o derecha, y los bucles se construyen dirigiendo el control de flujo en círculo.

Historia

[editar]

Befunge lo creó Chris Pressey en 1993 en un intento de diseñar un lenguaje tan difícil de compilar como humanamente posible fuera (observe que la orden p introduce la posibilidad de código mutante). Sin embargo se han escrito varios compiladores. También existen varias extensiones a la especificación original "Befunge-93", incluido Funge-98, que extiende el concepto a un número arbitrario de dimensiones y admite múltiples hebras de ejecución, con varios punteros de instrucción operando simultáneamente en el mismo espacio. Las extensiones y variantes de Befunge se denominan Fungeoides o simplemente Funges.

La especificación Befunge-93 restringe cada programa válido a una parrilla de 80*25 instrucciones (horizontal y vertical, respectivamente). Si la ejecución de un programa excede estos límites, "salta" a un punto correspondiente en el otro lado de la parrilla; así, un programa en Befunge es el equivalente topológico de un toro. Dado que un programa en Befunge-93 sólo puede tener una pila y tiene limitado su espacio de almacenamiento, el lenguaje Befunge-93 no es Turing completo, al contrario que la mayoría de lenguajes de máquina. La especificación posterior Funge-98 proporciona Turing-completitud eliminando las restricciones de tamaño del programa: en lugar de simplemente saltar a un punto opuesto en un límite fijo, el movimiento de un puntero de instrucciones Funge-98 sigue un model denominado "espacio de Lahey" en honor a su creador, Chris Lahey. En este modelo, la parrilla se comporta como un toro de tamaño finito con respecto a estos saltos, pero puede ser extendido de forma indefinida.

Código de ejemplo en Befunge-93

[editar]

Mostramos la técnica de usar flechas para cambiar el control de flujo en el siguiente programa generador de números aleatorios. Siguiendo las flechas, las instrucciones ? envían el puntero de instrucciones en direcciones cardinales aleatorias hasta que el puntero da con un dígito, introduciéndolo en la pila. Entonces las flechas navegan hasta el . para extraer el dígito de la pila y devolver el puntero al primer aleatorizador direccional. Observe que no hay código @ para terminar este programa, así que produce números aleatorios de 1 a 9 de forma continua.

vv  <      <
    2
    ^  v<
 v1<?>3v4
    ^   ^
>  >?>  ?>5^
    v   v
 v9<?>7v6
    v  v<
    8
 .  >  >   ^
^<

Este es un ejemplo del clásico programa "¡Hola mundo!". Primero se introducen en la pila las letras "olleH" como números ASCII. Luego se extraen de la pila en orden LIFO y se muestran como caracteres de texto para dar "Hello". El espacio es el carácter 32 en ASCII, que aquí se construye multiplicando 4 por 8, antes de comenzar la salida de texto. El resto del código muestra de forma similar "World!", seguido del carácter ASCII 10 (un salto de línea).

>              v
v ,,,,,"Hello" <
>48*,          v
v,,,,,,"World!"<
>25*,@

Lista de instrucciones para Befunge-93

[editar]
0-9 Introduce este número en la pila
+ Suma: Extrae a y b, e introduce a+b
- Resta: Extrae a y b, e introduce b-a
* Multiplicación: Extrae a y b, e introduce a*b
/ División entera: Extrae a y b, e introduce b/a, redondeado a la baja. Si a es cero, pregunta al usuario qué resultado desea.
% Módulo: Extrae a y b, e introduce el resto de la división entera b/a. Si a es cero, pregunta al usuario qué resultado desea.
! NOT lógico: Extrae un valor. Si es cero, introduce 1; si no, introduce cero.
` Mayor que: Extrae a y b, e introduce 1 si b>a, o cero en caso contrario.
> Comienza a moverse a la derecha
< Comienza a moverse a la izquierda
^ Comienza a moverse hacia arriba
v Comienza a moverse hacia abajo
? Comienza a moverse en una dirección aleatoria
_ Extrae un valor; se mueve a la derecha si valor=0, o a la izquierda si no
| Extrae un valor; se mueve hacia abajo si valor=0, o hacia arriba si no
" Empieza el modo cadena: introduce cada carácter ASCII hasta que encuentre el siguiente "
: Duplica el valor en la cima de la pila
\ Intercambia los dos valores en la cima de la pila
$ Extrae un valor de la pila
. Extrae un valor y lo muestra como entero
, Extrae un valor y lo muestra como carácter ASCII
# Trampolín: Omite la siguiente celda
p Una llamada "put" (una manera de almacenar un valor para uso posterior). Extrae y, x y v, y cambia el carácter en la posición (x, y) del programa por el carácter con el valor ASCII v
g Una llamada "get" (una manera de recuperar datos almacenados). Extrae y y x, y luego introduce el valor ASCII del carácter que se encuentra en esa posición en el programa
& Solicita un número al usuario y lo introduce en la pila
~ Solicita al usuario un carácter e introduce su valor ASCII
@ Fin de programa

Véase también

[editar]

Enlaces externos

[editar]

Implementaciones

[editar]