2dpl

Z Wikipedii

2dpl2-Dimensional Programming Languageezoteryczny, 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

[edytuj] Linki zewnętrzne