BeFunge
BeFunge – ezoteryczny język programowania opracowany w 1993 roku przez Chrisa Pressey’a[1].
Programy w nim, w odróżnieniu od większości języków programowania, są zorganizowane w dwuwymiarowej tablicy. Instrukcje „strzałkowe” (< > ^ v) powodują przeniesienia sterowania, a pętle są tworzone poprzez zorganizowanie sterowania „w kółko”. Każda instrukcja w BeFunge jest oznaczana pojedynczym znakiem[1].
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 i przechowywania wszelkich danych służy stos (obsługiwany zresztą na podobnych zasadach co w językach Forth i False).
W 1998 Chris rozszerzył język, dodają nowe funkcje. Dlatego pierwotna wersja nazywana jest często BeFunge-93[1].
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.
Poza kompilatorami dla BeFunge-93 istnieją też kompilatory z odpowiednimi rozszerzeniami. Wartym uwagi jest Funge-98, w którym programy można organizować w przestrzeniach dowolnego wymiaru (dla 1 Unifunge, dla 2 BeFunge, dla 3 TreFunge itd.), a nawet posiada programowanie wielowątkowe, czyli w całej przestrzeni może być 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 lub liczbę),
- brak symboli – język nie definiuje symboli, w szczególności nie ma w nim możliwości deklarowania stałych, zmiennych i podprogramów,
- mechanizm samomodyfikowania się programu.
Instrukcje
Instrukcje, podobnie jak w języku Forth operują wyłącznie 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 zmiana kierunku na poziomy: zdejmuje liczbę ze stosu i działa jak > jeśli liczbą tą było 0, albo jak < w przeciwnym razie. |
| | | Warunkowa zmiana kierunku na pionowy: zdejmuje liczbę ze stosu i 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 i wkłada ich sumę na stos). |
| – | Odejmowanie (zdejmuje dwie liczby i wkłada ich różnicę). |
| * | Mnożenie (zdejmuje dwie liczby i wkłada ich iloczyn). |
| / | Dzielenie (zdejmuje dwie liczby i wkłada ich iloraz). |
| % | Modulo (zdejmuje dwie liczby i 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 i 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 i odrzuca (ignoruje) ją. |
| Operacje wejścia i 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 i wypisuje na wyjście (ekran) jako liczbę. |
| , | Zdejmuje daną ze szczytu stosu i wypisuje na wyjście (ekran) jako znak. |
| & | Pyta użytkownika o liczbę i wkłada ją na szczyt stosu. |
| ~ | Pyta użytkownika o znak i wkłada go na szczyt stosu. |
| Manipulacje na treści programu | |
| g | Zdejmuje ze stosu dwie liczby, i używając ich jako współrzędnych do tablicy programu odczytuje znak z treści programu i umieszcza go na stosie. |
| p | Zdejmuje ze stosu dwie liczby oraz znak, i używając tych liczb jako współrzędnych do tablicy programu umieszcza znak w treści programu. |
Przykłady
Program, który wyświetla pseudolosowe cyfry w nieskończonej pętli:
vv < <
2
^ v<
v1<?>3v4
^ ^
> >?> ?>5^
v v
v9<?>7v6
v v<
8
. > > ^
^<
Program wyświetlający „Hello world!”:
> v v"Hello world!"< > ,,,,,,,,,,,, @
Przypisy
- 1 2 3 Tim Fischer: Befunge-93 in SQL: (Ab-)Using SQL’s Turing Completeness. [dostęp 2024-05-29].
Linki zewnętrzne
- Befunge-93 online interpreter [online] [dostęp 2021-12-10] (ang.).