Ezoteryczny język programowania – język programowania tworzony w celu badania oraz demonstracji niekonwencjonalnych technik programistycznych oraz metod programowania. Zwykle nie jest on przeznaczony do pisania rzeczywistych aplikacji. Języki tego typu są popularne wśród hackerów oraz entuzjastów programowania. Termin ezoteryczny służy do odróżnienia ich od pozostałych języków.
Powody, dla których ezoteryczne języki nie nadają się do poważnych zastosowań, to skomplikowane rozwiązania, nadmierne uproszczenie języka albo nieczytelna składnia. Łatwość użycia oraz zrozumienia kodu nie jest priorytetem oraz wielokrotnie bywa poświęcana do osiągnięcia przyjętych założeń.
Najczęstsze cele wybierane podczas projektowania ezoterycznych języków to usunięcie albo zastąpienie jak największej liczby klasycznych konstrukcji programistycznych przy jednoczesnym zachowaniu właściwości zupełności w sensie Turinga. Rozpatrywane są także języki, co do których nie ustalono, do jakiego modelu obliczeń należą.
Historia
Za historycznie pierwszy ezoteryczny język programowania uznawany jest INTERCAL zbudowany w 1973 roku przez Dona Woodsa oraz Jamesa M. Lyona[1]. Pragnęli oni stworzyć język niepodobny do wszystkich, jakie znali. INTERCAL parodiował elementy najpopularniejszych języków tamtych czasów takich, jak FORTRAN, COBOL czy polecenia asemblera.
Dwadzieścia lat później Wouter van Oortmerssen stworzył FALSE, prosty język działający na zasadzie maszyny ze stosem. Charakteryzował się bardzo nieczytelną oraz mylącą składnią oraz tym, że jego interpreter zajmował zaledwie 1024 bajty. FALSE stał się inspiracją dla Urbana Müllera do stworzenia Brainfucka, aktualnie najpopularniejszego języka ezoterycznego, który zawierał zaledwie osiem symboli sterujących. Wraz z językiem Befunge autorstwa Chrisa Pressey'a ma najlepsze wsparcie ze wszystkich istniejących ezoterycznych języków programowania.
Rodzaje języków
Turing tarpit
Pl. grzęzawisko Turinga – rodzina języków zupełnych w sensie Turinga, jednak zawierających minimalną liczbę komend oraz operatorów. Zalicza się do niej Brainfuck (osiem bezargumentowych komend), OISC (jedna komenda z trzema operandami) oraz Thue (jedna komenda z dwoma operandami).
Funge
Do tej kategorii należą języki, w których programy są reprezentowane w przestrzeniach metrycznych z układem współrzędnych używanym do określania położenia instrukcji. Najczęściej wykorzystywany bywa kartezjański układ współrzędnych, w którym wyrażony jest wskaźnik bieżącej instrukcji. Instrukcje potrafią zmieniać kierunek przemieszczania się wskaźnika, tym samym wpływając na to, jakie operacje zostaną wykonane w dalszej kolejności.
Obecnym oficjalnym standardem zachowania dla języków tej kategorii jest specyfikacja Funge-98. Stanowi on uogólnienie semantyki języka Befunge, który ma dwuwymiarową, toroidalną topologię. Języki, które luźniej trzymają się tej specyfikacji, nieraz określane są mianem fungeoidów.
Języki niedeterministyczne
W deterministycznym języku programowania, znając aktualny stan programu, stale da się jednoznacznie określić kolejny. Tę właściwość posiadają wszystkie popularne oraz będące w użyciu języki programowania. Programy napisane w językach niedeterministycznych zachowują się w nieprzewidywalny sposób, dając zaledwie określone prawdopodobieństwo uzyskania poprawnego wyniku oraz z tego powodu nie są przydatne w większości zastosowań praktycznych.
Niedeterministyczne języki są przydatne tam, gdzie przestrzeń poszukiwań rozwiązania jest zbyt duża, aby opłacalne było jej dokładne przeszukiwanie. Są też rozważane w badaniach nad hiperobliczalnością.
Języki despotyczne
Tym mianem wyznacza się języki, w których istnieje skończony zbiór komend reprezentujących operacje aplikowane następnie na bieżący stan programu.
Paradygmat
Paradygmat języka dopuszcza ogólnie określić jego właściwości oraz filozofię tworzenia programów. Wśród języków ezoterycznych da się spotkać języki reprezentujące zróżnicowane paradygmaty, np. imperatywne, w których instrukcje opisują, w jaki sposób przekształcać dane (Brainfuck) czy funkcyjne, np. Unlambda. Programy opisywane są tam jako zestawy funkcji, które aplikowane są na wyniki wykonania innych funkcji.
Społeczność internetowa
Wokół ezoterycznych języków programowania powstała niewielka społeczność internetowa, która tworzy je oraz rozwija. Najczęściej poruszane zagadnienia to próby udowadniania zupełności (bądź jej braku) dla nowo powstających języków, albowiem nie stale dowód jest oczywisty. Odmienny cel działalności to próby implementacji jak najbardziej złożonych programów/algorytmów w wybranym języku.
Sprawdź też
Linki zewnętrzne
- nullwww.esolangs.org Duże oraz dynamicznie rozwijane wiki na temat ezoterycznych języków programowania.
Przypisy