Езотерични програмски језици

Езотерични програмски језици (краће енгл. esolang ) су програмски језици дизајнирани да тестирају границе дизајна програмских језика. Користе се као софтверска уметност, као хакерски интерфејс за друге језике (посебно функционални и процедурални програмски језици) или као шала. Реч езотерични прави разлику између ових програмских језика и програмских језика који користе програмери за писање софтвера. Најчешће, ови програмски језици нису намењени за широку употребу, иако неке карактеристике имају практичну примену у уметности. Ови језици су често популарни међу хакерима и програмерима којима је програмирање хоби. Употребљивост је ретко циљ ових програмских језика, често је сасвим супротно. Њихов циљ је да уклоне или замене стандардизоване карактеристике језика док задржавају карактеристику да су Тјуринг потпуни.

Историја уреди

Најстарији езотерични програмски језик је INTERCAL[1]. Њега су 1972. године дизајнирали Don Woods и James M. Lyon са намером да исмеју тадашње програске језике као што су Fortran, COBOL и асемблерски језици. Годинама је INTERCAL био представљан само копијама приручника INTERCAL-а. Имплементација у C-у под Unix-ом је 1990. године оживела овај језик што је подстакло талас интересовања за езотеричне програмске језике. Године 1993, Wouter van Oortmerssen је креирао FALSE, мали сложени програмски језик, са синтаксом дизајнираном да учини код збуњујућим и нечитљивим. Он је имао компајлер од само 1024 бајтова.[2] Ово је инспирисало Urban Müller-а да креира још мањи језик, сада озлоглашени Brainfuck, који се састоји од само осам препознатљивих карактера. Упоредо са Chris Pressey-овим Befunge-ом (као FALSE, али са дводимензионалним показивачем инструкција), Brainfuck је сада један од најбоље подржаних езотерничних програмских језика. Ово су канонски примери минималног Turing tarpits-а и непотребно помућених језичких карактеристика. Brainfuck је повезан са P′′ фамилијом Тјуринг машина.

Терминологија езотеричних програмских језика уреди

Turing tarpit уреди

Тјуринг тарпит (енгл. Turing tarpit) су Тјуринг потпуни програмски језици који су непрактични зато што су минималистички, тј. имају веома ограничен број инструкција.

Кодирање са стањима уреди

Кодирање са стањима (енгл. Stateful encoding) је метод кодирања у коме сваки подстринг кода има улогу у:

  1. проналажењу следеће инструкције у листи инструкција
  2. извршавању те инструкције, при чему се мења стање програма

Обрада инструкција врши се у две фазе: дохватање операције и извршавање те операције. Листе инструкција могу бити :

  1. статичнке - као што су reMorse и THRAT
  2. динамичке - попут reMorse4ever

Пример статичке операције:

Select Next Operation in list
Perform Operation

Парадигме програмских језика уреди

Парадигме програмских језика се могу сместити у више категорија:

  1. императивни језици (нпр. Brainfuck) где инструкције одређују како се мењају подаци
  2. функционални језици (нпр. Unlambda) где се примењују само функције, тако што једна функција покреће другу
  3. трансформациони језици (енгл. rewriting languages) (нпр. Thue) где се извршавањем трансформационих функција мења полазно стање програма

Funge уреди

Funge је езотерични програмски језик који креира своје програме као метричке просторе са координатним системом (углавном, али не нужно, Декартовим координатним системом). Програм извршава инструкције које се налазе у простору тако што помера показивач (вектор положаја који иницира тренутно покренуту инструкцију) по том простору. Различите инструкције одређују правац у ком ће се кретати показивач, и самим тим низ инструкција које ће се извршити. Тренутни званични стандард који одређује понашање ових програмских језика је Funge-98 спецификација. Ова спецификација представља генерализацију семантике језика Befunge, који има дводимензионалну торусну топологију. Језици који се држе ових стандарда, као што су Unefunge (једнодимензоналан) и Trefunge (тродимензионлан), се некада називају funges. Док се "даљи сродници" са разликама у значајнијим аспектима, попут Wierd-а, називају fungeoids.

Компјутер са једном инструкцијом уреди

Компјутер са једном инструкцијом (енгл. A one instruction set computer) је машина која подржава само једну инструкцију.

Недетерминистички језици уреди

За детерминистичне језике је карактеристично да ако је дато тренутно стање програма, следећа фаза се може увек предвидети. Ово не важи за недетерминистичке језике. Највећи део језика је детерминистички, али неки језици попут Befunge-а, подржавају уграђену инструкцију за насумичност. Штавише, језици попут Java2k имају само насумичне инструкције. Стога је добијање поузданог излаза чак и за тривијалне програме скоро немогућ задатак. Недетерминистички програмски језици се могу користити за претраживање великих простора, попут граматике, где је потпуна претрага непрактична. Генератори насумичног текста попут Dada Engine и rmu су примери овог типа недетерминистичких језика. Недетерминистички алгоритми се користе у истрази хиперизрачунљивости.

Примери уреди

У наставку се налазе примери езотеричних програмских језика:

Arnoldc уреди

 
Арнолд Шварценегер

Arnoldc је езотерични програмски језик базиран на цитатима Арнолда Шварценегера. У наставку се налази синтакса за програм који исписује "Hello, World!".

IT'S SHOWTIME
TALK TO THE HAND "Hello, World!"
YOU HAVE BEEN TERMINATED
Неке од команди у овом програмском језику су:
False - I LIED True - NO PROBLEMO
If - BECAUSE I'M GOING TO SAY PLEASE ModuloOperator - I LET HIM GO
EqualTo - YOU ARE NOT YOU YOU ARE ME Or - CONSIDER THAT A DIVORCE
And - KNOCK KNOCK DeclareMethod - LISTEN TO ME VERY CAREFULLY
MethodArguments - I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE Return - I'LL BE BACK
EndMethodDeclaration - HASTA LA VISTA, BABY CallMethod - DO IT NOW
AssignVariableFromMethodCall - GET YOUR ASS TO MARS SetInitialValue - YOU SET US UP
BeginMain - IT'S SHOWTIME EndMain - YOU HAVE BEEN TERMINATED
Print - TALK TO THE HAND ReadInteger - I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
AssignVariable - GET TO THE CHOPPER SetValue - HERE IS MY INVITATION
EndAssignVariable - ENOUGH TALK ParseError - WHAT THE FUCK DID I DO WRONG

АsciiDots уреди

АsciiDots је езотерични програмски језик који је заснован на аски уметности.Следи пример "code-golf" програма.

/#$<.
*-[+]
\#1/

Befunge уреди

Befunge је програм који дозвољава да се показивач инструкција пребаци у више димензије кроз код. На пример, следећи програм приказује "Hello World" избацајући знакове наслагане у обрнутом редоследу и штампајући их у петљи која циркулише у смеру казаљке на сату кроз инструкције [>], [:], [v], [_], [,], и [^].

 "dlroW olleH">:v
              ^,_@

Binary lambda calculus уреди

Бинарни ламбда рачун је дизајниран из перспективе алгоритамске информационе теорије која дозвољава најгушћи могући код са најмањим могућим средствима. Програмски језик између осталог укључује 29 бајтова интерпретатора и 112 бајтова Brainfuck интерпретатора.

Brainfuck уреди

Brainfuck је екстремно минимлистички језик који се састоји од 8 карактера и код је обично нечитљив. Овај језик захтева посебан компајлер или интерпретер. Следећи пример исписује "Hello World":

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

Chef уреди

Chef је стек-оријентисан програмски језик који је David Morgan-Mar дизајнирао да прави програме који изгледају као кухињски рецепти.[3] Програм се састоји од наслова, листе променљивих и њихових вредности података и од листе упутстава са манипулационим инструкцијама.[4] Принцип шаљивог дизајна се састоји у томе да "програмски рецепти не би требало да генеришу само валидан излаз већ да буду и лаки за припремање и укусни". David Morgan-Mar, творац овог програмског језика, напомиње да би један пример Hello World program програма са "101 јајетом" и "111 чаша уља" произвео "много хране за једну особу." [4][5]

Dark уреди

Dark је програмски језик дизајниран да буде суштинско зло. Дизајнирао га је David Catt. Програм је базиран на манипулацији целог света и димензија да би створио што неугоднију стварност. Сваки програм се чита као низ команди са циљем да сваку реч измени што више. У наставку се налази код за програм који исписује "Hello World":

+hello hell
hello$twist sign hws
hello$twist stalker io
io$stalk
io$personal
hws$scrawl " Hello, world!
hws$read
io$echo
hello$empty
hello$apocalypse

FALSE уреди

FALSE је стек-оријентисан програмски језик (енг. Stack-oriented programming) чије се команде и променљиве састоје од једног карактера.[6] На пример 3 + 1 се може написати на следећи начин (λ x → x + 1)(3).

3[1+]!

Fim++ уреди

Fim++ је објектно-оријентисан програмски језик који је инспирисан телевизијским програмом "Moj mali poni".[7] FiM++ програми се пишу у стилу "friedship reports" .Следећи пример исписује "Hello world":

Dear Princess Celestia: Hello World!

Today I learned how to say Hello World!
I said "Hello World!".
That's all about how to say Hello World.

Your faithful student, Twilight Sparkle.

FRACTRAN уреди

Програм FRACTRAN је уређена листа позитивних разломака са иницијалним позитивним целобројним улазом n. Програм се покреће множењем броја n са првим разломком f на листи за који је nf цео број. Број n је тада замењен са nf и правило се понавља. Ако ниједан разломак у листи не производи цео број када се помножи са n, онда се програм заустави. Математичар John Conway, творац овог програмског језика, је написао следећи програм за исписивање простих бројева:

17/91, 78/85, 19/51, 23/38, 29/33, 77/29, 95/23, 77/19, 1/17, 11/13, 13/11, 15/14, 15/2, 55/1

.Gertrude уреди

.Gertrude[8] је осмислио Gerson Kurz. Програми написани у овом језику имају елементе поезије Gertrude Stein, по којој је овај програмски језик назван. Програм се састоји од реченица на било ком језику. Програм израчунава просечну дужину речи у свакој реченици, а затим се број речи дужих од просечне дужине дели са бројем речи краћим од просечне дужине. Добијене вредности представљају инструкције и операнде.

GolfScript уреди

GolfScript се састоји од листа које се смештају у стек, а променљиве су представљене помоћу блокова кода. Овај програмски језик подржава опсег типова података укључујући прецизне целе бројеве, и већи опсег стандардних операција од осталих езотеричних програма.

Grass уреди

Grass је функционалан програмски језик који користи једино карактере "W", "w", и "v". Према томе, програми у Grass-у изгледају као трава. Grass има формалне спецификације засноване на неутврђеном ламбда рачуну и SECD машини. Grass не треба мешати са GRASS-ом, другачијим програмским језиком.

INTERCAL уреди

INTERCAL, скраћено од "Compiler Language With No Pronounceable Acronym", је настао 1972. године као пародија са намером да сатирично исмеје разне програмске језике тадашњег времена.[9]

Jsfuck уреди

Jsfuck је езотерични ЈаваСкрипт, где се код састоји од 6 карактера: [, ], (, ), !, +. За разлику од Brainfuck-a, Jsfuck је валидан ЈаваСкрипт код што значи да се сви програми који се напишу у овом језику могу покренути у било ком интернет претраживачу који интерпретира ЈаваСкрипт.[10]. Због малог броја валидних карактера, за писање обичног "Hello World!" програма је неопходно више од 10000 карактера.

LOLCODE уреди

LOLCODE је често критикован што није толико езотеричан, већ више личи на обичан процедурални језик са необичним речником. Следећи пример је "Hello,World!"

HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE

[11]

Malbolge уреди

Malbolge (Дантеов осми круг пакла) је дизајниран да буде најтежи и најезотеричнији програмски језик. Креирао га је Ben Olmstead in 1998. године. Између осталог, код се сам модификује по дизајну, а дејство инструкције зависи од њеног места у меморији.

Modiscript уреди

Modiscript[12] је езотеричан програмски језик који се састоји од цитата индијског министра Narendra Modi. Овај језик садржи много његових идеологија као на пример цитат "No important rule" који је део његове кампање "Make in India". Следећи код исписује "Mandir Wahin Banayenge":

mitrooon
UP "BJP governed state hai"
SP "opposition me hai"
agar ye sach hai
	bhaiyo aur behno "Mandir wahin banayenge"
nahi toh
	bhaiyo aur behno "Abhi decision nahi liya gaya hai"
achhe din aa gaye

Piet уреди

 
Piet program that prints 'Piet'
 
A "Hello World" program in Piet

Piet је језик који је дизајнирао David Morgan-Mar, чији су програми мапе битова које изгледају као апстрактна уметност.[13] Састављањем мапа руководи показивач који се креће око слике, од једног континуалног обојеног региона до следећег. Процедуре се преносе када показивач напушта регион. Постоји 20 боја за чије понашање је одређено: 18 "шарених" боја, које се наручују циклусом нијансе од 6 корака и циклусом осветљења од 3 корака, и црна и бела које нису наручене. Када се напушта "шарена" боја и улази у нову боју, извршени поступак је одређен бројем корака промене у нијанси и осветљености. У црно поље се не може ући. Када показивач покуша да уђе у црну регију правила бирања следећег поља се мењају. Ако су сва могућа правила испробана, програм се завршава. Регије ван граница слике такође се третирају као црне. Бела не врши операције, али омогућава показивачу да "пролази" кроз њу. Понашање осталих боја ван ових 20 специфичних је препуштено компајлеру или интерпретатору. Променљиве се чувају у меморији као означени цели бројеви у једном стеку. Већина процедура се односи на операције на том стеку, друге се односе на улаз/излаз и на правила којима се показивач помера. Piet је добио име по холандском сликару Питу Мондријану.[14] Првобитно име које је било намењено, Mondrian, је већ било заузето.

Pikachu уреди

 
Pikachu

Pikachu је програмски језик развијен од стране Nilabhro Datta, чији програм изгледа као дијалекат пикачуа. Његова сврха је да може бити коришћен од стране било ког пикачуа.[15] У том циљу, Pikachu користи само 3 валидна синтаксна елемента- "pi", "pika" и "pikachu".[16][15]

Rockstar уреди

Rockstar је језик чији се код састоји од речи балада или хард рок песама из 1980-их година. Овај језик је динамичан и Тјуринг потпун. Следећи пример множи вредност "your heart" са "the whole" и чува је у "my hands".

  • "your heart", "the whole" и "my hand" су варијабле
  • of се користи за множење
  • put/into комбинација се користи при додели
Put the whole of your heart into my hands

Shakespeare уреди

Shakespeare је дизајниран да прави програме који личе на Шекспирове комаде. На пример, следећа команда декларише тачку у програму која може да се достигне путем команде GOTO-типа:

                                                 Акт 1: Хамлетова вређања и ласкање.

Starfish уреди

Starfish je дводимензијонални програмски језик базиран на стеку. Заснован је директно на ><>. Креирао га је redstarcoder 2016. године. У наставку се налази код "Hello, world!" програма:

"Hello, world!"r>Ool?u!|;
$ starfish helloworld.sf 
Hello, world! 

Unlambda уреди

Unlambda је минималистички функционални програмски језик. Већина програма се састоји искључиво од карактера "s", "k", и "`". У наставку се налази код програма "Hello, world!":

`.!`.d`.l`.r`.o`.w`. `.,`.o`.l`.l`.e`.Hi

Whitespace уреди

Whitespace користи само белине (space, tab, return), при чему игнорише све остале карактере. Овај језик представаља супротност у односу на традиционалне програмске језике који не разликују белине, што омогућава да се ови програми крију у кодовима других језика као што је C. Whitespace је дизајнирао Chris Morris. Програм је објављен 1ог априла 2003. године, због чега је првобитно схваћен као првоаприлска шала.

Пример функционалних езотеричних програмских језика уреди

~ath уреди

~ath је програмски језик који користе "Earthlings" и "Alternians" из веб стрипа "Homestuck". Име је добио на основу шале која представља "tilde ath" као "til death". Иако му је синтакса прилично једноставна, заправо је компликовано радити са њим. Програм се може компајлирати само ако садржи бесконачне петље. Овај језик такође разликује боју текста којим је написан програм и прихвата необичне карактере.

Културни контекст есоланга уреди

Културни контекст есоланга су проучавали људи попут Geoff Cox-a, који наводи да езоланг "скреће пажњу са команди и контроле на културни израз и одбијање".[17] Он види сличност између езоланга и уметности кода и поезије кода, попут mezangelle Mez Breeze-а. Daniel Temkin описује brainfuck као "одбијање да ублажи границу између људског израза и асемблерског кода чиме нас води на смешно путовање логике".[18] Он тиме открива нераздвојиво неслагање између људског размишљања и компјутерске логике и повезује програмирање у склопу езоланга са резултатом извођења догађаја попут Fluxus-а, где игра изван правила логике чини тачку гледишта јасноће језика.[19]

Референце уреди

  1. ^ Matthew FullerSoftware Studies. . MIT Press. 2008. 
  2. ^ „Interview with Wouter van Oortmerssen”. esoteric.codes. 01. 07. 2015. Архивирано из оригинала 08. 12. 2015. г. Приступљено 01. 12. 2015. 
  3. ^ Cozens, Simon (2005). Advanced Perl programming. O'Reilly Media. стр. 269. ISBN 978-0-596-00456-9. „A final Acme curiosity, and one of my favourites, is Acme: :Chef, an implementation of David Morgan-Mar's Chef programming language. In Chef, programs are expressed in the form of recipes: ... 
  4. ^ а б Morgan-Mar, David (24. 03. 2011). „Chef”. DM's Esoteric Programming Languages. Self-published. Приступљено 28. 06. 2014. 
  5. ^ Morgan-Mar, David (28. 06. 2014). „Chef Sample Program: Hello World Souffle”. DM's Esoteric Programming Languages. Self-published. Приступљено 28. 06. 2014. 
  6. ^ van Oortmerssen, Wouter. „The FALSE Programming Language”. Self-published. Приступљено 11. 02. 2016. 
  7. ^ Sethisto. „Editorial: FiM++, A Pony Programming Language”. www.equestriadaily.com. Приступљено 07. 01. 2018. 
  8. ^ Gertrude - Esolang
  9. ^ Woods, Donald R.; Lyon, James M. (1973), The INTERCAL Programming Language Reference Manual, Muppetlabs.com, Архивирано из оригинала 24. 04. 2009. г., Приступљено 24. 04. 2009 
  10. ^ JSFuck
  11. ^ „LOLCODE#Criticism”. Esolangs.org. Приступљено 30. 11. 2015. „LOLCODE is often criticized for not being Esoteric enough. By design, LOLCODE is actually a normal procedural language behind its lulzy syntax. This is a stark contrast from "True" Esolangs like Befunge, which features a two-dimensional, almost game board-like syntax. For this reason, LOLCODE is technically categorized as a Weirdlang. 
  12. ^ „VPanjeta/ModiScript”. GitHub (на језику: енглески). Приступљено 18. 04. 2018. 
  13. ^ Morgan-Mar, David (25. 01. 2008). „Piet programming language”. Приступљено 18. 05. 2013. 
  14. ^ Cox 2013, стр. 6
  15. ^ а б „Introducing The Pikachu Programming Language – A Programming Language Made For Pikachus”. 
  16. ^ „Pikachu Programming Language - Syntax Rules”. Trove 42 (на језику: енглески). 21. 08. 2017. Приступљено 22. 08. 2017. 
  17. ^ Cox 2013, стр. 5
  18. ^ Temkin, Daniel (15. 01. 2014). „Glitch && Human/Computer Interaction”. NOOART: The Journal of Objectless Art (1). 
  19. ^ Temkin, Daniel. „brainfuck”. Media-N Journal (Spring 2013). Архивирано из оригинала 21. 05. 2015. г. Приступљено 06. 05. 2014. 

Литература уреди

Спољашње везе уреди