BeFunge – ezoteryczny język programowania. Programy w nim, w przeciwieństwie od większości języków programowania, są zorganizowane w dwuwymiarowej tablicy. Instrukcje "strzałkowe" ( < > ^ v ) powodują przeniesienia sterowania, a pętle są wykonywane poprzez zorganizowanie sterowania "w kółko". Każda instrukcja w BeFunge jest oznaczana pojedynczym znakiem.
W języku BeFunge program wykonuje się czytając instrukcje poruszając się po dwuwymiarowym obszarze. Zatem "licznik programu" składa się z dwóch liczb, oznaczających współrzędne na tablicy programu. Natomiast do przenoszenia oraz przechowywania wszelkich danych służy stos (obsługiwany zresztą na podobnych zasadach co w językach Forth oraz False).
Kompilatory BeFunge
Autorem BeFunge jest Chris Pressey, który stworzył ten język w 1993, w zamierzeniu jako język o niezwykle trudnym do napisania kompilatorze. W jednym z komentarzy było nawet napisane, że kompilatora takiego nie dałoby się w ogóle napisać, bo musiałby on posiadać sztuczną inteligencjępotrzebne źródło, jednak udało się napisać parę kompilatorów do tego języka.
Poza kompilatorami dla BeFunge-93 są też kompilatory z odpowiednimi rozszerzeniami. Wartym uwagi jest Funge-98, w którym programy da się organizować w przestrzeniach dowolnego wymiaru (dla 1 Unifunge, dla 2 BeFunge, dla 3 TreFunge itd.), a nawet ma programowanie wielowątkowe, czyli w całej przestrzeni bywa więcej niż jeden "licznik programu". Tego typu rozszerzenia są zwane Fungeoidami.
Główne cechy języka Befunge
- interaktywność – język ma wbudowaną prostą operację wejścia, umożliwiającą zapytanie użytkownika o daną (znak albo liczbę),
- brak symboli – język nie definiuje symboli, w szczególności nie ma w nim możliwości deklarowania stałych, zmiennych oraz podprogramów,
- mechanizm samomodyfikowania się progamu.
Instrukcje
Instrukcje, analogicznie jak w języku Forth operują jedynie na stosie, tzn. argumenty operacji są zbierane ze stosu, wynik operacji jest odrzucany na stos.
| Instrukcje sterujące |
| > |
Kieruje wskaźnik w prawo. |
| < |
Kieruje wskaźnik w lewo. |
| v |
Kieruje wskaźnik w dół. |
| ^ |
Kieruje wskaźnik do góry. |
| ? |
Ustawia losowy kierunek dalszej interpretacji. |
| # |
Przeskakuje następną instrukcję. |
| @ |
Zatrzymuje interpretację (kończy program). |
| Instrukcje sterujące warunkowe |
| _ |
Warunkowa przeistoczenie kierunku na poziomy: zdejmuje liczbę ze stosu oraz działa jak > jeśli liczbą tą było 0, albo jak < w przeciwnym razie. |
| | |
Warunkowa przeistoczenie kierunku na pionowy: zdejmuje liczbę ze stosu oraz działa jak v jeśli liczbą tą było 0, albo jak ^ w przeciwnym razie. |
| Instrukcje obliczeniowe |
| + |
Dodawanie (zdejmuje dwie liczby ze szczytu stosu oraz wkłada ich sumę na stos). |
| – |
Odejmowanie (zdejmuje dwie liczby oraz wkłada ich różnicę). |
| * |
Mnożenie (zdejmuje dwie liczby oraz wkłada ich iloczyn). |
| / |
Dzielenie (zdejmuje dwie liczby oraz wkłada ich iloraz). |
| % |
Modulo (zdejmuje dwie liczby oraz wkłada resztę z ich dzielenia). |
| ! |
Negacja logiczna (jeśli liczbą na szczycie stosu jest 0, zastępuje ją liczbą 1, w przeciwnym razie zastępuje ją liczbą 0). |
| ` |
Porównanie "większe" (zdejmuje dwie liczby oraz wkłada 1, jeśli pierwsza była większa, albo 0 w przeciwnym razie). |
| : |
Podwaja liczbę na szczycie stosu. |
| \ |
Zamienia kolejność dwu najwyższych danych (znajdujących się na szczycie stosu). |
| $ |
Zdejmuje daną ze szczytu stosu oraz odrzuca (ignoruje) ją. |
| Operacje wejścia oraz wyjścia |
| 0...9 |
Wkłada liczbę (jednocyfrową) na stos. |
| " |
Wkłada na stos kolejne napotykane znaki aż do ponownego napotkania znaku ". |
| . |
Zdejmuje daną ze szczytu stosu oraz wypisuje na wyjście (ekran) jako liczbę. |
| , |
Zdejmuje daną ze szczytu stosu oraz wypisuje na wyjście (ekran) jako znak. |
| & |
Pyta użytkownika o liczbę oraz wkłada ją na szczyt stosu. |
| ~ |
Pyta użytkownika o znak oraz wkłada go na szczyt stosu. |
| Manipulacje na treści programu |
| g |
Zdejmuje ze stosu dwie liczby, oraz używając ich jako współrzędnych do tablicy programu odczytuje znak z treści programu oraz umieszcza go na stosie. |
| p |
Zdejmuje ze stosu dwie liczby oraz znak, oraz uzywając tych liczb jako współrzędnych do tablicy programu umieszcza znak w treści progamu. |
Przykłady
Program, który liczy liczby losowe:
vv < <
2
^ v<
v1<?>3v4
^ ^
> >?> ?>5^
v v
v9<?>7v6
v v<
8
. > > ^
^<
Program wyświetlający "Hello world!":
> v
@,,,,,,,,,,,,"Hello World!"<