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
[upraviť | upraviť zdroj]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 |
Pozri aj
[upraviť | upraviť zdroj]- brainfuck
- Carnage Heart - Podobný jazyk pre programovaciu hru na playstation.
- intercal
- whitespace
Externé odkazy
[upraviť | upraviť zdroj]- Esoteric languages wiki
- Official Funge-98 Specification Archivované 2004-12-25 na Wayback Machine
- Cat's Eye Technologies, stránka autora