0

Ezoteryczne języki programowania

Ezoteryczne języki programowania

Programiści mają specyficzne poczucie humoru i często zdarza się, że osoby spoza środowiska nie potrafią zrozumieć z czego ich znajomi czerpią radość. Jednym z przykładów tego typu humoru są ezoteryczne języki programowania, a więc takie języki, które powstały dla czerpania frajdy, lub wykorzystania mało używanych technik programistycznych. Raczej nikt nie korzysta z nich w celach tworzenia profesjonalnego oprogramowania… niemniej jednak języki te są całkiem popularne.

Pionierem języków ezoterycznych jest Brainfuck. Operujemy w nim dużą tablicą pamięci, po której możemy się przemieszczać w lewo (używając operatora <) lub w prawo (>), zmieniać wartości komórki pamięci w której się znajdujemy, tzn. zwiększać jej wartość o 1 (+) lub zmniejszać o 1 (-), wyświetlać to co znajduje się w komórce pamięci w której się znajdujemy  (.) lub wczytywać do niej liczbę (,). Cały smaczek nadają jednak pętle, które zostały zrealizowane za pomocą operatora „[„, który powoduje skok za operator „]”, gdy wartość na obecnej pozycji jest równa 0.

Polska Wikipedia podaje przykład programu w tym języku, który umożliwia wypisanie napisu Hello World. Prawda, że bardzo ciekawy?

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.
>+.+++++++. .+++.>++.<<+++++++++++++++ .>.+++.------.-- ------.>+.>.

Jest to jednak tylko jedna możliwość napisania tego programu. Przykładowo w serwisie Reddit pojawił się kod, który realizuje to samo zadanie wykorzystując tylko 88 znaków. W zasadzie można przyjąć, że im krótszy kod to tym bardziej autor zrozumiał działanie języka Brainfuck i potrafi optymalizować swoje algorytmy.

Bardzo porządne wytłumaczenie tego języka ezoterycznego znajduje się na kanale YouTube Mirosława Zelenta. Zachęcam do spróbowania własnych sił i stworzenia interpretera lub kompilatora tego języka. Takie działanie znacząco wpływa na poszerzenie wiedzy programistycznej i poukładanie sobie wszystkiego w głowie. P.S. Wielowątkową odmianą Brainfucka jest Brainfork.

O wiele bardziej złożonym językiem ezoterycznym jest WhiteSpace, mimo że używa tylko tabulatora, spacji i znaku nowej linii. Tym razem jednak następstwo poszczególnych znaków ma wyraźnie ważniejsze znaczenie – ich wzajemne ułożenie oznacza inne operacje. Ponadto mamy tutaj do dyspozycji pamięć stosu i sterty, wszystkie podstawowe operacje matematyczne (łącznie z modulo), instrukcje warunkowe czy odpowiedniki polecenia GOTO (na tej podstawie możemy sami stworzyć chociażby pętle).

Autorzy zapisują kod w języku WhiteSpace używając notacji jak poniżej:

[LF][Space][LF][Space][Tab][Space] [Space][Space][Space][Tab][Tab][LF]

Czy jednak nie zabawniej jest przedstawić kod jako białe znaki? 🙂 Wtedy dopiero można wykazać się umiejętnością poprawnego debugowania kodu 🙂 Można również zabarwić odpowiednio poszczególne rodzaje białych znaków i otrzymać kod jak na ilustracji poniżej:

Whitespace w edytorze VIM2 (Wikipedia)

Whitespace w edytorze VIM (Wikipedia)

Programiści z reguły są przyzwyczajeni do tego, że kod ich programów jest z grubsza odczytywany z lewej strony do prawej… ale są też języki programowania, gdzie całkowicie zrezygnowano z tej własności. Język ezoteryczny BeFunge interpretuje kod programu jako pewnego rodzaju dwuwymiarową macierz, w której możemy dość swobodnie określać kierunek wykonywania instrukcji. Nie będę się może rozpisywał na temat wszystkich operatorów i możliwości jakie oferuje nam ten język (szczególnie w wersji 98), bo jest ich całkiem sporo, ale może po prostu przedstawię przykład kodu, który wyświetli Hello World:

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

Oczywiście można by mnożyć przykłady języków ezoterycznych, ale zostawię ich zgłębianie Czytelnikowi. Chciałbym zakończyć ten artykuł przykładem kodu w języku Malbolge (który z założenia miał być najtrudniejszym ezoterycznym językiem programowania). Generuje on napis Hello World!:

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *