BeFunge
Z Wikipedii
BeFunge jest ezoterycznym językiem programowania. 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.
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).
Autorem BeFunge jest Chris Pressey, który stworzył ten język w roku 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ę - jednak dało się napisać kilka kompilatorów do tego języka). 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ę progamu.
[edytuj] 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 uzywając tych liczb jako współrzędnych do tablicy programu umieszcza znak w treści progamu. |
[edytuj] Przykłady
Program, który liczy liczby losowe:
vv < < 2 ^ v< v1<?>3v4 ^ ^ > >?> ?>5^ v v v9<?>7v6 v v< 8 . > > ^ ^<
Program wyswietlajacy "Hello world!":
> v @,,,,,,,,,,,,"Hello World!"<
[edytuj] Podobne Języki
- 2dpl
- 4DL
ABAP • Ada • AWK • Asembler • C • C++ • C# • COBOL • Common Lisp • D • F# • Forth • Fortran • GAUSS • Icon • Java • JavaScript • Lisp • Lustre• Modula 2 • Ocaml • Oberon • Object Pascal • Objective-C • Pascal • Perl • PHP • PL/SQL • Python • REXX • Ruby • SAS 4GL • sh • Smalltalk • Snobol • SQL • Visual Basic • VB.NET • XUL
Akademickie: Comal • Eiffel • Haskell • Logo • MCPL • ML • Nemerle • Prolog • Scheme
Historyczne: ALGOL • APL • BASIC • Clipper • JAS • MUMPS • PLAN • PL/I • PL/M • SAKO • SAS (asembler) • Simula
Ezoteryczne: INTERCAL • Brainfuck • BeFunge • Unlambda • Malbolge • Whitespace • FALSE • HQ9+ • Shakespeare • Whirl • Ook