article

Ezoteryczne języki programowania są w pewnym sensie rodzajem rozrywek umysłowych ludzi, których kreatywność przekracza dozwolone ramy, w których mieszczą się twory pożyteczne. W istocie są to języki programowania, które nie służą do produkcji oprogramowania. Do czego zatem służą, trudno właściwie określić, ale z pewnością dostarczają rozrywki umysłowej pasjonatom programowania - zarówno poprzez programowanie w takich językach, jak i poprzez tworzenie nowych, własnych. Na tym właśnie polega istota języków ezoterycznych.

Języki te są zazwyczaj proste do opanowania (mają prostą składnię i mało elementów), ale równocześnie programowanie w nich jest trudne i dlatego niełatwo jest pisać z ich użyciem większe programy. 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 pewnym założeniu, np. że interpreter takiego języka ma być jak najmniejszy, że cały kod ma się składać jedynie z białych znaków, że programowanie ma być jak najtrudniejsze itp.

Trzeba też przyznać, że języki ezoteryczne mają bardzo ciekawe i intrygujące nazwy, w odróżnieniu od "poważnych języków programowania", nazywających się często jedną literą, czasem z jakimś znaczkiem, jakimś krótkim, dziwnym skrótem, albo nawet z takimi, które przyszły zupełnie "z głupia frant", jak np. Java.

Języki ezoteryczne bardzo się między sobą różnią; różne są przyczyny ich powstawania. Różnią się także pomysłowością w wymyśleniu czegoś jak najbardziej oryginalnego, czego nie posiadają pozostałe języki programowania. Trudno ogarnąć wszystkie języki ezoteryczne; można wymienić następujące:

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 charakterystycznyh rzeczy jest sprawdzanie uprzejmości, przez co jakaś część instrukcji musi być poprzedzona słowem PLEASE. W przeciwnym razie program zostanie odrzucony jako nieuprzejmy (ale jeśli będzie ich za dużo, program zostanie odrzucony z kolei jako zbyt lizusowski).

W Intercalu stosuje się grupowanie wyrażeń, czyli coś w rodzaju nawiasów. W tym celu używa się jednak znaków " i '. Bardzo skutecznie pogarsza to czytelność źródeł. Natomiast co do "własnych mechanizmów", to np. Intercal nie posiada jawnego mechanizmu wywoływania procedur (typu CALL/RETURN). Posiada jedynie instrukcję NEXT, która wykonuje skok do etykiety (składnia jest np.: DO (12) NEXT) i przypadkiem odrzuca adres na stos, który zbiera się... nie pamiętam czym.

Intercal nie posiada również zmiennych lokalnych. Dostarcza jednak mechanizm tworzenia własnych jakby ramek stosu. Każda zmienna w Intercalu jest sama jakby stosem, w związku z czym możemy utworzyć kolejną ramkę dowolnej zmiennej, po czym później ją usunąć. Aby utworzyć ramkę, używamy komendy STASH z listą zmiennych jako argumentem. Aby usunąć utworzoną ramkę stosu, należy użyć w ten sam sposób komendy RESTORE.

W Intercalu nie każda użyta komenda musi na 100% oznaczać jej wykonanie. Może to oznaczać jej wykonanie np. na 80%, jeśli rozpoczyna się od "%80". Komenda może być też zignorowana, jeśli zażądano ignorowania określonej komendy, co wykonuje się przez ABSTAIN. Np. ABSTAIN FROM STASHING spowoduje ignorowanie komendy STASH. Można ją później przywrócić, wykonując REINSTATE STASHING. Niestety, jeśli użyjemy ABSTAIN FROM ABSTAINING, nie będziemy mogli więcej ignorować komend, a ABSTAIN FROM REINSTATING spowoduje, że działanie każdego ABSTAIN będzie nieodwracalne.

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)

to 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.


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źnikim 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 (może dla przyzwoitości nie będę cytował), 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).


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.


Unlambda


Unlambda jest parodią języków funkcjonalnych 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 `*" target="_blank" >oznacza zaaplikowanie * 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.


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 genetyczych 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, nazwa pochodzi od nazwy stolicy piekła.


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.


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 file"!


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

Ezoteryczne języki programowania

Zewnętrzne linki


Esoterische Programmiersprache | Esoteric programming language | Lenguaje de programación esotérico | Langage de programmation exotique | 난해한 프로그래밍 언어 | Linguagem de programação esotérica | Эзотерические языки программирования

 

This article is licensed under the GNU Free Documentation License. It uses material from the "Ezoteryczny język programowania".

Home Pageartsbusinesscomputersgameshealthhospitalshomekids & teensnewsphysiciansrecreationreferenceregionalscienceshoppingsocietysportsworld