Preskočiť na obsah

Befunge

z Wikipédie, slobodnej encyklopédie

Befunge je ezoterický dvojrozmerný programovací jazyk. Odlišuje sa od ostatných hlavne tým, že príkazy nenasledujú za sebou, ale sú usporiadané v dvojrozmernej mriežke. Jednu inštrukciu predstavuje jeden znak v mriežke. Program sa vykonáva tak, že ukazovateľ (program counter) sa hýbe po mriežke a vykonáva aktuálne inštrukcie.

Jazyk vymyslel Chris Pressey v roku 1993 ako pokus o konštrukciu jazyka, ktorý sa nedá skompilovať. Napriek tomu, niekoľko kompilátorov už bolo napísaných. K pôvodnému "Befunge-93" existujú špecifikácie ako napríklad Funge-98, ktoré podporuje ľubovoľne veľa rozmerov (namiesto pôvodných dvoch), takisto aj multithreading. Špecifikácia Befunge-93 povoľuje mať inštrukcie len v mriežke 80 riadkov a 25 stĺpcov. Program, ktorý pretečie cez okraj, pokračuje na druhej strane. Práve preto je program v Befunge topologicky ekvivalentný torusu. Befunge nemá žiadnu normálnu pamäť ako iné jazyky, pracovať môže len so zásobníkom. Ani inštrukcia na zápis a čítanie v mriežke stále nestačí na to, aby Befunge-93 bolo turingovsky úplné. Túto vlastnosť získava až Funge-98 odstránením ohraničenia.

Ukážkový kód v Befunge-93

[upraviť | upraviť zdroj]

Technika usmerňovania ukazovateľa šípkami demonštruje generátor náhodných čísel. Inštrukcia ? posiela ukazovateľ náhodným zo štryoch základných smerov. Keď príde na číslo, dá ho na zásobník. Potom príde na inštrukciu . a vypíše vrch zásobníka. Keďže tu nie je inštrukcia @ na ukončenie programu, bude produkovať nekonečnú postupnosť čísel od 1 do 9.

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

Zoznam inštrukcií Befunge-93

[upraviť | upraviť zdroj]
0-9 Daj čísla na zásobník
+ Sčítanie: Zo zásobníka vyhoď a a b, a pridaj a+b
- Odčítanie: Zo zásobníka vyhoď a a b, a pridaj b-a
* Násobenie: Zo zásobníka vyhoď a a b, a pridaj a*b
/ Celočíselné delenie: Zo zásobníka vyhoď a a b, a pridaj b/a, zaokrúhlené dole. Ak je a nula, spýta sa užívateľa na výsledok.
% Zvyšok po celočíselnom delení: Zo zásobníka vyhoď a a b, a pridaj zvyšok po celočíselnom delení b a a. Ak je a nula, spýta sa užívateľa na výsledok.
! Logická negácia(NOT): Vyhoď zo zásobníka číslo. Ak je to nula, pridaj 1 na zásobník, inak pridaj 0.
` Znamienko väčšie: Vyhoď a a b, pridaj 1 ak b>a, inak 0.
> Zmeň smer doprava
< Zmeň smer doľava
^ Zmeň smer hore
v Zmeň smer dole
? Zmeň smer na náhodný
_ Vyhoď číslo zo zásobníka. Ak je to 0, zmeň smer doprava, inak doľava.
| Vyhoď číslo zo zásobníka. Ak je to 0, zmeň smer dole, inak hore.
" Zapni stringový mód: Každá ďalšia inštrukcia je pridávaná na zásobník ako jej ASCII hodnota. Toto platí až po najbližšiu inštrukciu "
: Zduplikuj vrch zásobníka.
\ Vymeň vrchné dve hodnoty na zásobníku.
$ Vyhoď vrch zásobníka.
. Vyhoď vrch zásobníka a vypíš ho ako číslo.
, Vyhoď vrch zásobníka a vypíš znak, ktorého ASCII hodnota je dané číslo.
# Trampolína: Preskoč naslednovú inštrukciu.
p Volanie "put" (vlož): Vyhoď y, x a v, v programe zmeň znak na pozícii (x,y) na znak s ASCII hodnotou v.
g Volanie "get" (získaj): Vyhoď y and x, na zásobník pridaj ASCII hodnotu znaku na tej pozícii v programe.
& Vypítaj si od užívateľa číslo a pridaj ho na zásobník.
~ Vypítaj si od užívateľa číslo a pridaj nazásobník znak s tou ASCII hodnotou.
@ Ukonči program

Externé odkazy

[upraviť | upraviť zdroj]