Ezoteryczny język programowania – Wikipedia, wolna encyklopedia
Ezoteryczny język programowania – język programowania tworzony w celu badania i demonstracji niekonwencjonalnych technik programistycznych oraz metod programowania. Zazwyczaj 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 lub nieczytelna składnia. Łatwość użycia oraz zrozumienia kodu nie jest priorytetem i często bywa poświęcana na rzecz innych uproszczeń służących do osiągnięcia przyjętych założeń (np. ograniczenie wielkości alfabetu używanego do pisania programu).
Najczęstsze cele wybierane podczas projektowania ezoterycznych języków to usunięcie lub zastąpienie jak największej liczby klasycznych konstrukcji programistycznych przy jednoczesnym zachowaniu właściwości zupełności w sensie Turinga. Rozpatrywane są również języki, co do których nie ustalono, do jakiego modelu obliczeń należą.
Historia
[edytuj | edytuj kod]Za historycznie pierwszy ezoteryczny język programowania uznawany jest INTERCAL stworzony 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ą i mylącą składnią oraz tym, że jego interpreter zajmował zaledwie 1024 bajty. FALSE stał się inspiracją dla Urbana Müllera do stworzenia Brainfucka, obecnie najpopularniejszego języka ezoterycznego, który zawierał jedynie osiem symboli sterujących. Wraz z językiem Befunge autorstwa Chrisa Presseya posiada najlepsze wsparcie ze wszystkich istniejących ezoterycznych języków programowania.
Rodzaje języków
[edytuj | edytuj kod]Turing tarpit
[edytuj | edytuj kod]Pl. grzęzawisko Turinga – rodzina języków zupełnych w sensie Turinga, jednak zawierających minimalną liczbę komend i operatorów. Zalicza się do niej Brainfuck (osiem bezargumentowych komend), OISC (jedna komenda z trzema operandami) i Thue (jedna komenda z dwoma operandami).
Funge
[edytuj | edytuj kod]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 mogą 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 posiada dwuwymiarową, toroidalną topologię. Języki, które luźniej trzymają się tej specyfikacji, niekiedy określane są mianem fungeoidów.
Języki niedeterministyczne
[edytuj | edytuj kod]W deterministycznym języku programowania, znając aktualny stan programu, zawsze można jednoznacznie określić kolejny. Tę właściwość posiadają wszystkie popularne i będące w użyciu języki programowania. Programy napisane w językach niedeterministycznych zachowują się w nieprzewidywalny sposób, dając jedynie określone prawdopodobieństwo uzyskania poprawnego wyniku i 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
[edytuj | edytuj kod]Tym mianem określa się języki, w których istnieje skończony zbiór komend reprezentujących operacje wykonywane następnie w bieżącym stan programu.
Paradygmat
[edytuj | edytuj kod]Paradygmat języka pozwala ogólnie określić jego właściwości oraz filozofię tworzenia programów. Wśród języków ezoterycznych można spotkać języki reprezentujące różne 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 wykonywane są na wynikach wykonania innych funkcji.
Społeczność internetowa
[edytuj | edytuj kod]Wokół ezoterycznych języków programowania powstała niewielka społeczność internetowa, która tworzy je i rozwija. Najczęściej poruszane zagadnienia to próby udowadniania zupełności (bądź jej braku) dla nowo powstających języków, gdyż nie zawsze dowód jest oczywisty. Inny cel działalności to próby implementacji jak najbardziej złożonych programów/algorytmów w wybranym języku.
Zobacz też
[edytuj | edytuj kod]- paradygmat programowania
- kompletność Turinga
- maszyna Turinga
- Ezoteryczne języki programowania:
Przypisy
[edytuj | edytuj kod]- ↑ Don Woods, James M. Lyon: The INTERCAL Programming Language Reference Manual. Muppetlabs.com. [dostęp 2009-06-24].
Linki zewnętrzne
[edytuj | edytuj kod]- esolangs.org – Duże i dynamicznie rozwijane wiki na temat ezoterycznych języków programowania.