BeFungeezoteryczny język 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).

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.
vKieruje 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...9Wkł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
gZdejmuje 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.
pZdejmuje 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 liczy liczby pseudolosowe:

 vv  <      <
     2
     ^  v<
  v1<?>3v4
     ^   ^
 >  >?>  ?>5^
     v   v
  v9<?>7v6
     v  v<
     8
  .  >  >   ^
 ^<

Program wyświetlający "Hello world!":

>              v
v"Hello world!"<
> ,,,,,,,,,,,, @

Linki zewnętrzne

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.