Befunge
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.
História
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
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
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 |