2dpl
Z Wikipedii
2dpl – ezoteryczny, jak go określa sam autor, język programowania, wzorowany na BeFunge.
Elementami języka są pojedyncze znaki, kodujące elementarne operacje oraz literały (stałe argumenty działań). Treść programu w 2dpl rozmieszczana jest na płaszczyźnie, w potencjalnie nieograniczonej dwuwymiarowej tablicy znaków. Wykonanie programu, to jest odczytywanie kolejnych znaków i wykonanie odpowiednich działań, może odbywać się w czterech kierunkach: poziomo, od lewej do prawej albo od prawej do lewej, oraz pionowo, z góry na dół i z dołu do góry. Cecha ta, wzorowana na BeFunge, odróżnia te języki od innych języków programowania, w których program zapisywany jest liniowo, jako ciąg znaków i symboli (w niektórych językach istotny jest podział na wiersze), i interpretowany w zasadzie w kolejności zapisu.
Dodatkową cechą, odróżniającą 2dpl od BeFunge, jest zmienna prędkość wskaźnika programu – interpreter może odczytywać każdy kolejny znak (instrukcję) programu, albo też co drugi, co trzeci, ... co n-ty. Sterowanie prędkością wskaźnika odbywa się poprzez odpowiednią konstrukcję programu (wykorzystanie instrukcji języka).
Na interpreter języka 2dpl składają się:
- opisana tablica - pamięć tekstu progamu,
- wskaźnik programu (wskazanie bieżącego punktu interpretacji),
- parametry (kierunek i prędkość) ruchu wskaźnika programu,
- stos obliczeniowy.
Główne cechy języka 2dpl:
- arytmetyka całkowitoliczbowa,
- 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.
Spis treści |
[edytuj] Instrukcje
Poniższa tabela przedstawia instrukcje języka.
Instrukcje sterujące | |
X | Kieruje wskaźnik w prawo. |
x | Kieruje wskaźnik w lewo. |
Y | Kieruje wskaźnik w dół. |
y | 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 X jeśli liczbą tą było 0, albo jak x w przeciwnym razie. |
| | Warunkowa zmiana kierunku na pionowy: zdejmuje liczbę ze stosu i działa jak Y jeśli liczbą tą było 0, albo jak y w przeciwnym razie. |
Instrukcje obliczeniowe | |
0...9 | Wkłada liczbę (jednocyfrową) na stos. |
" | Wkłada na stos kolejne napotykane znaki aż do ponownego napotkania znaku ". |
+ | 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). |
: | Powiela daną na szczycie stosu, wkładając na stos drugą jej kopię. |
\ | 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 | |
. | 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] Ruch wskaźnika
Instrukcje X, x, Y i y ustalają nowy kierunek ruchu wskaźnika programu (kierunek interpretacji kolejnych instrukcji). Jeśli przy tym interpreter napotka jedną z tych instrukcji podczas ruchu zgodnego z określanym przez instrukcję, to prędkość wskaźnika zwiększa się o jeden. Jeśli zaś aktualny kierunek interpretacji jest przeciwny do określanego przez napotkaną instrukcję, a prędkość wskaźnika jest większa od 1, to kierunek nie ulega odwróceniu, a tylko zmniejsza się prędkość.
Ta sama reguła odnosi się do instrukcji ? – z tym zastrzeżeniem, że bieżący kierunek ruchu wkaźnika porównuje się do wylosowanego przez instrukcję nowego kierunku.
[edytuj] Przykład
Ten program wypisuje "Hello World!"
X Y @,,,,,,,,,,,,"Hello World!"x
[edytuj] Podobne języki
- BeFunge
- 4DL
[edytuj] Linki zewnętrzne
- Oficjalna strona (opis) 2dpl, i ta sama strona pod alternatywną nazwą.
- Plik do pobrania – interpreter języka 2dpl (pod Windows) i jego źródło.