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

С Википедије, слободне енциклопедије

Езотерични програмски језици (краће енгл. 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. 

Литература[уреди | уреди извор]

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