Ezoteryczny język programowania

Z Wikipedii

Skocz do: nawigacji, szukaj

Ezoteryczne języki programowania to języki programowania, które nie służą do produkcji oprogramowania, lecz są rodzajem rozrywki umysłowej uprawianej przez pasjonatów. Ich konstrukcja zwykle oparta jest na niecodziennym lub żartobliwym pomyśle lingwistycznym (od parodiowania dramatów Shakespeare'a po slang współczesnego Internetu). Często też ich twórcom towarzyszy chęć badania matematycznych podstaw obliczeń komputerowych (głównie maszyny Turinga i rachunek lambda Churcha)

Języki te mają zazwyczaj prostą składnię, ale równocześnie programowanie w nich jest trudne, ponieważ wygoda ich stosowania poświęcana jest dla realizacji pierwotnego celu (zwykle żartu).

Nie są ponadto łączone z jakimikolwiek bibliotekami zewnętrznymi, które umożliwiałyby tworzenie oprogramowania bardziej zaawansowanego niż tylko przetwarzającego znaki wprowadzane na konsoli tekstowej.

Większość języków ezoterycznych opiera się na założeniu, np. że interpreter takiego języka ma być jak najmniejszy, cały kod ma się składać jedynie z białych znaków, lub programowanie ma być jak najtrudniejsze itp.

Języki ezoteryczne mają bardzo ciekawe i intrygujące nazwy, w odróżnieniu od "poważnych języków programowania", nazwanymi często jedną literą, akronimem albo losowym słowem, jak np. Java.

Trudno ogarnąć wszystkie języki ezoteryczne; można wymienić następujące:

Spis treści

[edytuj] InterCal

Prawdopodobnie pierwszy język ezoteryczny. Jest on podobny w istocie do asemblera, a nawet można powiedzieć, że jest na poziomie niższym od asemblera (o ile to możliwe). Wydaje się posiadać jakby własną filozofię maszyny, nie mówiąc już o własnych operacjach na bitach. Większość tych właściwości jest jednak wyraźnie ukierunkowana na pogorszenie czytelności źródeł, maksymalne utrudnianie programiście napisania programu oraz uczynienie języka maksymalnie zawodnym.

Jedną z charakterystycznych rzeczy jest sprawdzanie uprzejmości, przez co jakaś część instrukcji musi być poprzedzona słowem PLEASE. W przeciwnym razie program komputerowy zostanie odrzucony jako nieuprzejmy (ale jeśli będzie ich za dużo, program zostanie odrzucony z kolei jako zbyt lizusowski).

Intercal nie posiada również zmiennych lokalnych. W Intercalu nie każda użyta komenda musi oznaczać jej wykonanie - można uzyskać wykonanie z pewnym prawdopodobieństwem.

W Intercalu istnieją dość specyficzne operacje na słowach procesora. Operacje dwuargumentowe są dwie:

  • mingle (lub interleave) ($), wykonuje przeplatanie bitow obu argumentów
  • select (~), wybiera z pierwszego argumentu te bity, których odpowiadające im w drugim argumencie są ustawione; pozostałe są usuwane, a całość jest "upychana w prawo"

Oraz trzy operacje jednoargumentowe: AND, OR i EXOR. W jaki sposób są one jednoargumentowe? Otóż operacje te wykonuje się na parze sąsiadujących bitów, a w wyniku znajdą się po kolei bity wynikowe takiej operacji. Np. z bitów 0 i 1 pozostanie w wyniku bit 0, z bitów 2 i 3 - bit 1 itd.

Jednym z ciekawych elementów Intercala (dodanym w późniejszych wersjach) jest instrukcja COME FROM. Argumentem jest etykieta. Jeśli zatem napiszemy:

(10) COME FROM (3)

wtedy, gdy program dojdzie do linijki oznaczonej przez (3) wykona skok do linii oznaczonej (10), czyli tej pokazanej tutaj.

Instrukcja ta jest obarczona jednak drobnym zastrzeżeniem, że nie można użyć w dwóch miejscach w programie instrukcji COME FROM z tym samym numerem etykiety. Zastrzeżenie to jednak podsunęło niektórym pomysł na stworzenie wielowątkowego Intercala.

Jednym z ciekawszych rozszerzeń Intercala jest TriIntercal, który operuje logiką trynarną.

Intercal jest jak najbardziej językiem imperatywnym, a jego cechy mają różnoraki charakter.


[edytuj] Brainfuck

Jest to w pewnym sensie implementacja Maszyny Turinga. Istnieje w nim zatem tablica, która początkowo zawiera zera, oraz wskaźnik, który się wewnątrz niej przesuwa.

Gramatyka tego języka składa się z 8 operatorów:

+   zwiększenie o 1 wartości komórki pod wskaźnikiem
-   zmniejszenie o 1 wartości komórki pod wskaźnikiem
>   przesunięcie wskaźnika do przodu o 1
<   przesunięcie wskaźnika do tyłu o 1
[   skok do symetrycznego ], jeśli wartość komórki pod wskaźnikiem jest zerowa
]   skok do symetrycznego [
.   wypisanie zawartości komórki na std. wyjście jako znaku
,   wczytanie znaku ze std. wejścia i zapisanie go pod bieżącym wskaźnikiem

Brainfuck stanowi niejako asembler maszyny Turinga (. i , należy traktować jako instrukcje do śledzenia), zatem teoretycznie można by w nim napisać wszystko. Program "Hello, world" w Brainfucku jest napisany w ten sposób, że wpisuje się do kolejnych komórek kody ASCII znaków tego napisu i wypisuje na ekranie. Oczywiście posiada on takie same zastosowania, jak i inne języki ezoteryczne. Warto jednak wspomnieć, że Brainfuck stał się również inspiracją do kolejnych implementacji maszyny Turinga wedle tego samego schematu, jak również rozszerzeń:

  • Doublefuck, posiada drugą tablicę i drugi zestaw operatorów, które na niej operują, a także makrodefinicje.
  • FuckFuck, zamiast operatorów stosuje się zestaw ośmiu czteroliterowych obscenicznych słów, nawet w formie "zamaskowanej" (istotna jest tylko pierwsza i ostatnia litera słowa), dodatkowo można operatorem "!" powtórzyć ostatnią instrukcję (np. Hello-world zaczyna się od: "f**k b**b!!!!!!").
  • Ook, w założeniu przeznaczony dla orangutanów. Jego składnia ogranicza się do trzech poleceń: Ook., Ook? oraz Ook!.
  • Brainfork, czyli Brainfuck z wielowątkowością (operacja fork() przy pomocy znaku Y).

[edytuj] Befunge

W tym języku istnieją dwa obiekty: tablica, po której porusza się kursor oraz stos. Kursor chodzi po dwuwymiarowej tablicy znaków i interpretuje napotkane znaki jako komendy. Mogą one również zmienić kierunek lub spowodować skok w określone miejsce w tablicy. Do operacji na danych służy stos.


[edytuj] Unlambda

Unlambda jest parodią języków funkcyjnych i opiera się w całości na rachunku lambda. Nie posiada jednak samej operacji lambda, w związku z czym nie można tam w ogóle definiować funkcji i wszystko należy pisać w postaci rozwiniętej, opartej na kombinacjach funkcji wbudowanych. Funkcje wbudowane oznaczane są jedną literą, np., s, k, czy i. Posiada oczywiście możliwość wypisania pojedynczego znaku na ekranie (funkcja .). Najważniejszym (i jedynym) operatorem jest znak `. Konstrukcja `[funkcja][argument] oznacza zaaplikowanie [funkcji] do [argumentu] i oczywiście taka konstrukcja również daje w wyniku funkcję. Język ten, podobnie jak Brainfuck, jest implementacją jednej z teorii informatycznych, mającej być minimalnym zestawem definicji do zaprogramowania wszystkiego.


[edytuj] Malbolge

Język ten powstał jako najtrudniejszy możliwy język programowania. Istnieją w nim instrukcje do wykonania, lecz nie są one zapisywane wprost. Powstają one dopiero po odpowiednim przekształceniu źródła poprzez wykonanie odpowiednich operacji arytmetyczno-logicznych na kodach ASCII znaków z tego źródła, gdzie istnieją również zależności od pozycji, na której umieszczono znak. Podobno program "Hello World" powstał w ten sposób, że za pomocą algorytmów genetycznych wyselekcjonowano źródła powstałe przez generowane losowo znaki, które były najbliższe wymagań.

Nazwa języka pochodzi od nazwy 8 kręgu piekła z "Boskiej komedii" Dantego, w obecnych wersjach jako Malebolge, w oryginale Dantego natomiast Malbolge.

W trakcie tworzenia specyfikacji języka autor poszedł w dwie strony, jedna z nich to obecny Malbolge, z drugiej rozwinął się 'trochę' łatwiejszy język programowania Dis (język programowania), nazwa pochodzi od nazwy stolicy piekła.


[edytuj] Whitespace

Język, w którym jedynymi znakami cokolwiek znaczącymi są spacja, tabulator i nowa linia. Jest to dość ciekawy pomysł, być może nawet użyteczny do kamuflowania informacji, bowiem pozostałe znaki są po prostu ignorowane.


[edytuj] Legal

Język ten w założeniu jest połączeniem dokumentów prawniczych z programowaniem. Instrukcje w nim dzielą się na zdania, rozpoczynane wielką literą i kończone kropką. Występują w nim również listy wyliczeniowe, często stosowane w przypadku pętli. Podstawą składniową, poza zdaniami, są listy. Lista składa się z wyrażeń, oddzielonych przecinkami, z tym że ostatni element jest ze swoim poprzednikiem połączony słowem "and".

Przykładowo program, który prosi o podanie imienia i wypisuje "Hello" z tym imieniem wygląda w następujący sposób:

Let name be a text variable. Print "What's your name? "... Read name and print it.

Przy czym "it" odnosi się do ostatnio używanej zmiennej, czyli "name" (pod warunkiem, że zostało użyte w tym samym zdaniu). Można go nie używać i napisać to w dwóch oddzielnych zdaniach:

Read name. Print the name.

Słowo "the" oznacza pozyskanie wartości z podanej zmiennej.

Niektóre ze zdań kończą się pytajnikiem i wtedy następująca po nich instrukcja if może skorzystać z testowanego przez nią warunku, np.:

Does the file exist? If so, open the file.

Legal posiada również możliwość rzucania wyjątków:

Does the file exist? If not, damn, "Cannot open [the file]"!

[edytuj] Inne

  • False – podobny do Fortha, ale znacznie bardziej nieczytelny
  • HQ9+ – posiadający tylko cztery komendy (H, Q, 9 oraz +)
  • Illgol – parodia Algola
  • Pandora – język, który miał "lepiej implementować" instrukcję COME FROM z Intercala; tam come from może być z dowolnej instrukcji, a nie z etykiety
  • Shakespeare – ma naśladować język dramatów Szekspira
  • OneTwoPlus język posiadający 3 podstawowe komendy (O,T oraz +)

[edytuj] Linki zewnętrzne