Befunge

Befunge je dvojdimenzionální ezoterický programovací jazyk vyvinutý roku 1993 Chrisem Presseyem. Hlavním cílem bylo vytvořit jazyk, který bude tak obtížný ke kompilaci, jak jen to bude možné.

Historie

Befunge je pravděpodobně první dvojdimenzionální obecný programovací jazyk založený na kódování ASCII. Byl částečně ovlivněn multimediální skriptovací aplikací AmigaVision a jazykem Forth.

Z původního jazyka Befunge (používá se označení „Befunge-93“) vzniklo mnoho odvozených jazyků. Nejpodobnější je jazyk Befunge-98 z rodiny Funge-98, která rozšiřuje koncepty Befunge do více dimenzí (Unefunge je jednodimenzionální, Trefunge trojdimenzionální atd.)

Přehled jazyka

Program v Befunge je reprezentován dvojdimenzionální plochou (playfield, v Befunge-98 funge-space) pevné velikosti. Zdrojový kód reprezentuje výchozí stav této plochy, který se do ní uloží před vlastním spuštěním programu. Obsah je poté možno programově upravovat (tzn. vytvořit kód modifikující sebe sama).

Spouštění jednotlivých instrukcí se děje pomocí ukazatele (program counter v Befunge-93, instruction pointer v Befunge-98). Ukazatel je na začátku umístěn v levém horním rohu (na souřadnicích 0,0) a směřuje doprava. Vždy se spustí instrukce na pozici ukazatele a ukazatel se poté posune. Jednotlivé instrukce mohou ovlivnit směr ukazatele, čímž se dají naprogramovat řídící konstrukce. Následující příklad ukazuje nekonečný cyklus:

>v
^<

Instrukce mohou také pracovat se zásobníkem.

Seznam instrukcí

Befunge-93 obsahuje následující instrukce:

Znak Popis
+ Sečte dvě čísla z vrcholu zásobníku
- Odečte dvě čísla z vrcholu zásobníku
* Vynásobí dvě čísla z vrcholu zásobníku
/ Vydělí dvě čísla z vrcholu zásobníku a uloží jejich celočíselný podíl
% Vydělí dvě čísla z vrcholu zásobníku a uloží jejich celočíselný zbytek
! Logická negace
` Operace „větší než“
> Směr ukazatele doprava
< Směr ukazatele doleva
^ Směr ukazatele nahoru
v Směr ukazatele dolů
? Náhodný směr ukazatele
_ Horizontální podmínka
| Vertikální podmínka
" Přepne do řetězcového režimu (stringmode)
: Duplikuje vrchol zásobníku
\ Prohodí dvě hodnoty na vrcholu zásobníku
$ Vyjme (zahodí) vrchol zásobníku
. Číselný výstup
, Znakový výstup
# Přeskočí následující instrukci („trampolína“)
g Získání hodnoty z kódu
p Vložení hodnoty do kódu
& Číselný vstup
~ Znakový vstup
@ Ukončí program
09 Vloží odpovídající číslo na zásobník

Příklady

Hello, world!

0"!dlroW ,olleH">:#,_@

Program cat

~:1+!#@_,

Faktoriál

0&>:1-:v v *_$.@ 
  ^    _$>\:^

Eratosthenovo síto

2>:3g" "-!v\  g30          <
 |!`"O":+1_:.:03p>03g+:"O"`|
 @               ^  p3\" ":<
2 234567890123456789012345678901234567890123456789012345678901234567890123456789

Quine

01->1# +# :# 0# g# ,# :# 5# 8# *# 4# +# -# _@

Odkazy

Externí odkazy

  • (anglicky) http://esolangs.org/wiki/Befunge
  • (anglicky) https://web.archive.org/web/20111122220816/http://www.bedroomlan.org/tools/befunge-93-playground
Programovací jazyky
abecední seznam programovacích jazyků
multiparadigmatické
Ada • C++ • Common Lisp • D • F# • Go • Oberon • Perl • PHP • Python • Ruby • Rust • Scala • Swift • Tcl (Tk) • Vala
strukturované (procedurální)
AWK • C • COBOLDCL • Forth • FortranLuaModula-2 / Modula-3 • Pascal • PawnPL/SQL
objektové
BETA • Boo • C# • Eiffel • Java (Groovy, Kotlin) • JavaScriptObject PascalObjective-CSmalltalkVB.NET
funkcionální
Clean • Ceylon • Erlang • Haskell • J • LispWolfram Language / Mathematica • Miranda • OCamlScheme
dotazovací
LINQSPARQLSQLXQueryXSL (XSLTXSL-FOXPath)
logické
Gödel • Prolog
výukové
Baltazar • Baltík • Karel • Kodu Game Lab • Logo • Microsoft Small Basic • Petr • Scratch
ezoterické
Befunge • BrainfuckHQ9+MalbolgeOok!PietWhitespace
historické
ALGOL • APL • B • BASICCPL (BCPL) • J • MUMPSPL/ISimula 67SNOBOL
další
ABAPAppleScriptColdFusionJSA • Julia • MATLAB • R • Visual Basic (VBScript) • VimscriptVisual FoxPro
skriptovací/strojový kódkompilované/interpretované • interaktivní/dávkovéWYSIWYG