Befunge

Na Galipedia, a wikipedia en galego.

Befunge é unha linguaxe de programación esotérico, funge-oide, reflexiva e basada en pila. Difire das linguaxes convencionais nos que os programas están dispostos nunha parrila bidimensional. As instruccións "frecha" dirixen o control do fluxo cara arriba, abaixo, esquerda ou dereita, e os bucles constrúense dirixindo o control do fluxo en círculo

Índice

[editar] Historia

Befunge creouno Chris Pressey en 1993 nun intento de deseñar unha linguaxe de tan difícil de compilar como humanamente posible fora (observe que a orde p introduce a posibilidade de código mutante). Sen embargo escribíronse varios compiladores. Tamén existen varias extensións á especificación orixinal "Befunge-93", incluido Funge-98, que extende o concepto a un número arbitrario de dimensiones e admite múltiples hebras de execución, con varios punteros de instrucción operando simultáneamente no mesmo espacio. As extensións e variantes de Befunge denomínanse Fungeoides ou simplemente Funges.

A especificación Befunge-93 restrinxe cada programa a unha parrilla de 80*25 instruccións (horizontal e vertical, respectivamente). Se a execución dun programa excede estos límites, "salta" a un punto correspondente no outro lado da parrilla; así, un programa en Befunge é o equivalente topolóxico dun toro. Dado que un programa en Befunge-93 só pode ter unha pila e ten limitado o seu espazo de almacenamento, a linguaxe Befunge-93 non é Turing completo, ó contrario que a maioría de linguaxes de máquina. A especificación posterior Funge-98 proporciona Turing-completitud eliminando as restriccións de tamaño do programa: no lugar de simplemente saltar a un punto oposto nun límite fixo, o movimento dun punteiro de instruccións Funge-98 sigue un model denominado "espacio de Lahey" en honor a seu creador, Chris Lahey. Neste modelo, a parrilla compórtase como un toro de tamaño finito con respecto a estos saltos, pero pode ser extendido de forma indefinida.

[editar] Código de exemplo en Befunge-93

Mostramos a técnica de empregar frechas para cambiar o control de fluxo no seguinte programa xenerador de números aleatorios. Seguindo as flechas, as instruccións ? envían o punteiro de instruccións en direccións cardinais aleatorias ata que o punteiro da con un díxito, introducíndoo na pila. Entón as frechas navegan ata o . para extraer o dígito da pila e devolver o puntero ó primeiro aleatorizador direccional. Observe que non hai 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 é un exemplo do clásico programa "¡Hola mundo!". Primeiro introdúcense na pila as letras "olleH" como números ASCII. Logo extráense da pila en orde LIFO e móstranse como caracteres de texto para dar "Hello". O espazo e o carácter 32 en ASCII, que aquí constrúense multiplicando 4 por 8, antes de comezar a saída de texto. Ó resto do código mostra de forma similar "World!", seguido do carácter ASCII 10 (un salto de liña).

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

[editar] Lista de instruccións para Befunge-93

0-9 Introduce este número na pila
+ Suma: Extrae a e b, e introduce a+b
- Resta: Extrae a e b, e introduce b-a
* Multiplicatión: Extrae a e b, e introduce a*b
/ Divisón entera: Extrae a e b, e introduce b/a, redondeado á baixa. Se a é cero, pregunta ó usuario qué resultado desexa.
% Módulo: Extrae a y b, e introduce o resto da división enteira b/a. Se a é cero, pregunta ó usuario qué resultado desexa.
! NOT lóxico: Extrae un valor. Se é cero, introduce 1; se non, introduce cero.
` Maior que: Extrae a e b, e introduce 1 se b>a, ou cero no caso contrario.
> Comenza a moverse á dereita
< Comenza a moverse á esquerda
^ Comenza a moverse cara arriba
v Comenza a moverse cara abaixo
? Comenza a moverse nunha dirección aleatoria
_ Extrae un valor; móvese á derecha se valor=0, ou á esquerda se non
Extrae un valor; móvese cara abaixo se valor=0, ou cara arriba se non
" Empeza o modo cadea: introduce cada carácter ASCII ata que atope o seguinte "
: Duplica o valor na cima da pila
\ Intercambia os dos valores na cima da pila
$ Extrae un valor da pila
. Extrae un valor e móstrao como enteiro
, Extrae un valor y móstrao como carácter ASCII
# Trampolín: Omite a seguinte cela
p Unha chamada "put" (unha maneira de almacenar un valor para uso posterior). Extrae y, x e v, e cambia o carácter na posición (x, y) do programa polo carácter co valor ASCII v
g Unha chamada "get" (unha maneira de recuperar datos almacenados). Extrae y e x, e logo introduce o valor ASCII do carácter que se atopa nesa posición no programa
& Solicita un número ó usuario e introdúceo na pila
~ Solicita ó usuario un carácter e introduce o seu valor ASCII
@ Fin do programa

[editar] Véxase támén

[editar] Outros artigos

[editar] Ligazóns externas

Ferramentas persoais