Programski jezik Dark
Programski jezik Dark ( engl. Dark ) je ezoterični programski jezik[1] kreiran od strane Dejvida Kata (David Catt)[2] koji ga je napravio da bude zao.
Instrukcije
urediUvod
urediDark je jezik zasnovan na manipulaciji čitavim svetovima i dimenzijama kako bi se postigli ciljevi i izgradila najveća muka stvarnosti. Svaki program se čita kao serija komandi za predmete sa ciljem da se svaki svet što je više moguće izvrne. Zbog svoje loše dizajnirane dokumentacije, verovatno je da su čak i opisi jezika zli.
Osnove jezika
urediNapomena: U svim primerima kodova gde god se upotrebljavaju zagrade {} date su informacije o delu naredbe, na primer ({ime objekta}${funkcija} označava liniju koja sadrži ime objekta praćeno kolonom i imenom funkcije; primer takve linije može biti nešto$akcija).
Jezik se isključivo zasniva na objektima. Na početku svakog programa, objekat tipa HELL mora biti deklarisan (sintaksa: +{ime objekta} hell). Ovaj objekat dozvoljava kreiranje i kontrolu drugih objekata i predstavlja osnov za program. Objekat se koristi navođenjem imena objekta i funkcije koja se pokreće na tom objektu (sintaksa: {ime objekta}${funkcija}{parametri}) Sve linije programa sa izuzetkom u prvoj liniji treba da budu u ovom formatu, osim ako je linija prazna linija ili komentar. Komentirane linije moraju se započeti sa simbolima cevi (|) i završiti sa drugim simbolom cevi. Sva imena objekata su osetljiva na veličinu slova.
Kad god se pojavi sintaksna greška, programski razum se smanji za 1. Razuman program počinje sa 100, ako razumljivost programa dostigne 0 program nije razumljiv. Kada god se javi opšta greška, tumač odštampa liniju "Murphy's Law is working correctly."[3] . Kada se program završi, svi aktivni objekti će se rešavati i odgovarajuće poruke o grešci će se pojaviti na konzoli sa detaljima procesa čišćenja. Kao takav preporučuje se uništavanje svih objekata pre nego što se program završi. Promenljive se takođe tretiraju slično.
Specifično
urediSvi objekti se čuvaju u memorijskom prostoru poznatom kao CONTROL_SPACE, odvojeno od svih promenljivih. Promenljive su lokalne za svaki manipulator i nalaze se u memoriskoj lokaciji poznatoj po nazivu WORLD_BLOCK. Postoji globalni red stringova poznat kao VOICELIST, koji čuva vrednosti znakova.
Referentni interpretator
urediReferentni interpretator je u potpunosti usklađen sa Dark programskim jezikom. Prihvata više izvornih datoteka kao argumente komandne linije. Svaka ulazna datoteka se interpretira zasebno i sekvencijalno. Opcije se takođe mogu podesiti pomoću komandne linije. Argumenti komandne linije utiču samo na izvorne datoteke nakon argumenta. Mogući argumenti su:
Argument | Opis |
---|---|
-wimpmode | Uključuje -wimpmode. Ovo nije deo zvanične specifikacije i isključuje se podrazumevano. U -wimpmode varijablama korupcija se ne akumulira, a podrazumevani korisnici grešaka se zamenjuju smislenim porukama o grešci. |
-strict | Isključuje -wimpmode. Ovo osigurava da prevodilac radi u skladu sa punim standardom (osim TRACE režima). |
-traceon | Uzimajući savet Emiije Shirou, videćete sve što se događa unutar interpretatora. Sve linije se štampaju kako se izvršavaju, a svi rukovodioci greške se zamenjuju kao u -wimpmode . Ovo je podrazumevano isključeno i biće uklonjeno u budućim verzijama interpretatora. |
-traceoff | Isključuje trace mod. |
-stripcode | Omogućava interpretatoru da ukloni komentare i prazne linije nakon učitavanja izvorne datoteke. Ovo je podrazumevano uključeno i rezultiraće boljim performansama. Izvorna datoteka nije izmenjena. Dok u -wimpmode, može doći do neispravnih ispisa brojeva sa porukama o greškama. |
-keepextra | Interpretator mora da zadrži sve dodatne kodove, kao što su komentari i prazne linije. Koristan samo za debagovanje. |
-breakonerror | Upozorava interpretatora da zaustavi izvršenje i sačeka pritisak na taster nakon svake greške. Ovaj argument je obično isključen i utiče samo na -wimpmode . |
-continueonerror | Ne zaustavlja se kada se pojavi greška. Predstavlja tipično ponašanje interpretatora. |
Referentni interpretator takođe odgovara nedokumentovanim delovima Dark standarda.
Tipovi objekata
urediHell
urediHell je osnovni objekat programa, deklarisan u prvom redu koda. Može postojati samo jedan hell objekat po programu. Ovaj objekat prihvata sledeće naredbe:
Sintaksa | Opis |
---|---|
{objekat}$twist {tip objekta}{ime objekta} | Kreira novi objekat. |
{objekat}$consume {ime objekta} | Uklanja (uništava) objekat. |
{objekat}$empty | Uklanja (uništava) sve objekte. |
{objekat}$break | Izbacuje grešku interpretatoru. Referentni interpretator će ištampati jednostavnu poruku o grešci kada se izda ova funkcija. |
{objekat}$break {tekst greške} | Izbacuje grešku interpretatoru sa prilagođenim tekstom greške. |
{objekat}$apocalypse | Odmah završava program. Svi aktivni objekti su uklonjeni (uništeni) kao i obično. |
Manipulator
urediManipulator je objekat koji omogućava upravljanje promenljivama. On može sadržati najviše 1024 promenljive. Kada se promenljiva oslobodi, za sobom ostavlja raspad. Ovaj raspad se mora obrisati uz pomoć funkcije VOID, kako bi se oslobodilo mesto za nove promenljive. Postoji nekoliko mehanizama promenljivih. Moguće je definisati promenljive sa istim imenom kao neka druga promenljiva u drugom manipulatoru, iako kada ih koristimo mogu izazvati probleme. Manipulator može manipulisati samo svojim promenljivama, stoga operacije sa promenljivama u manipulatorima moraju da koriste objekat SIGN kao privremeno skladište. Sve promenljive su neoznačeni prirodni brojevi koji mogu biti dužine 8, 16 ,32 ili 64 bita. Kada se promenljive ne koriste u preko 65536 ciklusa, one počinju da akumuliraju(prikupljaju) korupciju. Korupcija obrće jedan bit u promenljivoj kada se pojavi u njoj. Svaka promenljiva mora imati dispoziciju. Ako se u funkciji koriste promenljive koje se razlikuju za više od jedne dispozicije, one se sukobljavaju i promenljive se ubijaju. Promenljive takođe moraju biti definisane kao ili SERVANT ili MASTER. Servant mora izabrati master promenljivu. Kada master umre, sve promenljive vezane za njega takođe umiru. Ovo je korisno za grupisanje i masovno ubijanje promenljivih. Objekat manipulator prihvata sledeće funkcije:
Sintaksa | Opis |
---|---|
{objekat}$manufacture {ime promenljive} {dispozicija} {veličina} master | Kreira novu master promenljivu. |
{objekat}$manufacture {ime promenljive} {dispozicija} {veličina} servant {ime master promenljive} | Kreira novu servant promenljivu koja se tretira kao master promenljiva,što se dešava kada je master promenljiva nepostojeća. U tom slučaju promenljiva se smatra izgubljenom i tretira se kao master promenljiva koja ne može imati servant promenljivu. |
{objekat}$suicide {ime promenljive} | Primorava promenljivu da se ubije, oslobađajući je (to će ostaviti raspad). |
{objekat}$skill {ime promenljive} | Ubija promenljivu. Isto kao funkcija suicide. |
{objekat}$void | Čisti sav raspad. Ovo omogućava da se koriste sva slobodna mesta promenljivih. |
{objekat}$genocide {dispozicija} | Ubija sve promenljive navedene dispozicije. Zapamtite, ovo utiče samo na promenljive direktno pod kontrolom manipulatora i ostavlja raspad kao i sve ostale funkcije. |
{objekat}$omnicide | Ubija sve promenljive. Radi kao funkcija genocide. |
{objekat}$chaos {ime promenljive} | Zadaje promenljivoj slučajnu vrednost. |
{objekat}$set {ime promenljive} {vrednost} | Zadaje promenljivoj navedenu vrednost. Vrednost može biti druga promenljiva iz istog manipulatora ili broj. |
{objekat}$add {ime promenljive} {vrednost1} {vrednost2} | Zadaje promenljivoj zbir dve vrednosti. Još jednom, vrednosti mogu biti ili promenljive ili brojevi. |
{objekat}$subtract {ime promenljive} {vrednost1} {vrednost2} | Zadaje promenljivoj razliku dve vrednosti. |
{objekat}$multiply {ime promenljive} {vrednost1} {vrednost2} | Zadaje promenljivoj proizvod dve vrednosti. |
{objekat}$divide {ime promenljive} {vrednost1} {vrednost2} | Zadaje promenljivoj količnik dve vrednosti. |
Entropy
urediObjekat entropy omogućava kontrolu toka programa. Labele mogu biti ugrađene, i neće se redefinisati unutar drugih labela osim ako nisu nedefinisane. Funkcija choice može biti ugrađena, ali svaka od njih mora biti iz drugog entropy objekta. Prihvatljive funkcije su:
Sintaksa | Opis |
---|---|
{objekat}$choice {vrednost1} {komparator} {vrednost2} | Upoređuje sve vrednosti i izvršava zatvoreni blok ukoliko je uslov tačan. Radi kao funkcija IF u većini programskih jezika. Vrednosti mogu biti ili promenljive ili numeričke vrendnosti; promenljive mogu biti iz bilo kog objekta manipulatora. Prihvaćeni komparatori su: = == < > <= >= != <>. |
{objekat}$balance | Definiše blok kodova za pokretanje ako je uslov funkcije choice netačan. Radi kao funkcija ELSE u većini programskih jezika. |
{objekat}$reprogram | Završava prethodan ili balansira blok. Radi kao ENDIF u većini programskih jezika. |
{objekat}$corpse {ime labele} | Definiše labelu. Ukoliko je labela već definisana, prethodna definicija se čuva. Neki interpretatori mogu prouzrokovati opštu grešku ukoliko labela već postoji, pa je dobra praksa ne definisati ugrađenu labelu i ponovo ih definisati pri svakoj interaciji(ponavljanju). |
{objekat}$stumble {ime labele} | Izaziva izvršenje da pređe na prethodno definisani leš (labelu). |
{objekat}$illusion {ime labele} | Ne definiše leš. Leš na taj način može biti ponovo definisan kasnije. |
Stalker
urediStalker objekat kontroliše sve bazične izlazno/ulazne funkcije. Stalker ne počinje sam od sebe, već mora da se pokrene jednom stalk funkcijom. Ako stalker nije pokrenut onda će se svi pokušaji da se izvrše I/U funkcije rezultovati depresivnim porukama o grešci koje će biti napisane u konzoli. Stalker ima samo dva moda DISTANT (udaljen,uobičajen) i PERSONAL (lični). U udaljenom modu, svaki izlaz je napisan na jednom razdvajaču i mora da se izbaci na konzolu preko paracusia funkcije. Menjanje modova će naterati razdvajača da se isprazni, dok je stalker na ličnom modu, svaki izlaz se odmah piše na konzoli.
Sintaksa | Opis |
---|---|
{objekat}$stalk | Pokreće objekat stalker. Potreban za korišćenje drugih funkcija. |
{objekat}$control {ime promenljive} | Uzrokuje da data promenljiva prihvati kontrolu, koja postavlja karakter koji se čita iz konzole u karakter koda. |
{objekat}$control # {ime promenljive} | Uzrokuje da data promenljiva prihvati kontrolu, koja postavlja promenljivu na vrednost upisanog broja, a neispravno kucanje će prouzrokovati opšte greške. |
{objekat}$action {ime promenljive} | Uzrokuje da data promenljiva preduzme akciju, što izaziva da karakter sa kodom znaka koji je jednak vrednosti promenljive bude zapisan na konzolu. |
{objekat}$action # {ime promenljive} | Uzrokuje da data promenljiva preduzme akciju, što uzrokuje da se numerička vrednost promenljive piše na konzoli. |
{objekat}$echo | Uklanja vrednost iz VOICELIST i zapisuje je na konzolu. |
{objekat}$distant | Prebacuje objekat u udaljen mod. |
{objekat}$personal | Prebacuje objekat u lični mod. |
{objekat}$paracusia | Pusti razdvajač na konzolu i on se resetuje na praznu vrednost. |
Sign
urediSign objekti su kontejneri za stringove. Sign je reprezentacija reda karaktera kodova. Sign objekti prihvataju sledeće funkcije:
Sintaksa | Opis |
---|---|
{objekat}$scrawl {ime promenljlive} | Dodaje vrednost karaktera promenljive u trenutnu poruku. |
{objekat}$scrawl # {ime promenljive} | Dodaje numeričku vrednost promenljive u trenutnu poruku. |
{objekat}$scrawl " {string} | Dodaje doslovni string trenutnoj poruci. |
{objekat}$tear | Uklanja prvi karakter iz poruke. |
{objekat}$tear {brojač} | Uklanja prve {brojač} karaktere iz poruke. |
{objekat}$tear * | Uklanja sve karaktere iz poruke. |
{objekat}$observe {ime promenljive} | Postavlja promenljivu na vrednost prvog karaktera u poruci. |
{objekat}$steal {ime promenljive} | Postavlja promenljivu na vrednost prvog karaktera u poruci i briše karakter iz poruke. |
{objekat}$read | Dodaje u red trenutnu poruku u VOICELIST, a zatim briše trenutnu poruku. |
{objekat}$read ~ | Dodaje u red trenutnu poruku u VOICELIST bez brisanja trenutne poruke- |
Neki programi
urediCAT program
urediCat program je program koji kopira svoj standardni ulaz na svoj standardni izlaz.
+deadcat hell deadcat$twist stalker killer deadcat$twist manipulator person deadcat$twist entropy fate killer$stalk killer$personal person$manufacture weapon 0 8 master fate$corpse violence killer$control weapon killer$action weapon fate$stumble violence fate$illusion violence person$kill weapon deadcat$consume person deadcat$consume killer deadcat$consume fate deadcat$apocalypse
Hello world!
urediHello world! program je trivijalan program koji na standardni izlaz ispisuje nisku teksta.Ovaj program je često prvi napisan na novom ezoteričkom programskom jeziku, kako bi se prikazao izlaz.
+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
Fibonačijev niz
urediFibonačijev niz [4]je niz brojeva, gde je svaki broj zbir dva prethodna broja u nizu. Jedini izuzetak su prva dva broja koja su 0 i 1.
+fib hell fib$twist stalker creep fib$twist entropy cruelty fib$twist manipulator darkone creep$stalk creep$personal darkone$manufacture new 0 64 master darkone$manufacture this 0 64 servant new darkone$manufacture last 0 64 servant new darkone$manufacture ltr 0 8 master darkone$set this 1 cruelty$corpse fate darkone$add new last this darkone$set last this darkone$set this new creep$action # this cruelty$choice this <= 9223372036854775807 darkone$set ltr 44 creep$action ltr darkone$set ltr 32 creep$action ltr cruelty$stumble fate cruelty$reprogram darkone$omnicide darkone$void fib$empty fib$apocalypse
Glavni jezik/Test interpretatora
uredi+test hell |Initialize objects| test$twist manipulator overseer test$twist manipulator leader test$twist entropy fate test$twist entropy path test$twist stalker spy test$twist sign bbs test$twist sign keep_out |Define a few variables| overseer$manufacture politician 0 64 master overseer$manufacture person1 0 32 servant politician overseer$manufacture person2 0 16 servant politician overseer$manufacture person3 0 8 servant none leader$manufacture person1 0 16 master leader$manufacture test1 0 32 servant politician leader$manufacture test2 0 32 servant test3 leader$manufacture test3 0 32 servant test2 leader$manufacture hater 5 8 master leader$manufacture hated 9 8 master |Check that stalker is not initialized| |Should give depressing errors| spy$action politician spy$control politician |Initialize stalker| spy$stalk |Test io modes with fibonacci series| |Should print Press any key to continue..., then will display the fibonacci series| spy$distant overseer$set person1 10 leader$set test1 0 leader$set test2 1 bbs$scrawl " , fate$corpse fibonacci_1 leader$add test3 test1 test2 leader$set test1 test2 leader$set test2 test3 spy$action # test1 bbs$read ~ spy$echo fate$choice test1 < 1000000 fate$stumble fibonacci_1 fate$reprogram fate$illusion fibonacci_1 bbs$tear * bbs$scrawl " Press any key to continue... bbs$read spy$personal spy$echo spy$action person1 spy$distant spy$control test1 spy$action person1 spy$paracusia |Test that choices work and nested choices are allowed| |Should display True,True,False,True,True,True,False| spy$personal bbs$scrawl " True bbs$scrawl person1 keep_out$scrawl " False keep_out$scrawl person1 fate$choice 0 = 0 bbs$read ~ spy$echo fate$reprogram fate$choice 0 = 0 bbs$read ~ spy$echo fate$balance keep_out$read ~ spy$echo fate$reprogram fate$choice 0 <> 0 bbs$read ~ spy$echo fate$balance keep_out$read ~ spy$echo fate$reprogram fate$choice person2 = person3 path$choice person2 = 0 bbs$read ~ bbs$read ~ spy$echo spy$echo path$balance bbs$read ~ keep_out$read ~ spy$echo spy$echo path$reprogram fate$balance path$choice person2 = 0 keep_out$read ~ bbs$read ~ spy$echo spy$echo path$balance keep_out$read ~ keep_out$read ~ spy$echo spy$echo path$reprogram fate$reprogram fate$choice person2 = person3 path$choice person2 = 1 bbs$read ~ bbs$read ~ spy$echo spy$echo path$balance bbs$read ~ keep_out$read ~ spy$echo spy$echo path$reprogram fate$balance path$choice person2 = 1 keep_out$read ~ bbs$read ~ spy$echo spy$echo path$balance keep_out$read ~ keep_out$read ~ spy$echo spy$echo path$reprogram fate$reprogram bbs$tear * keep_out$tear * |Test Randomization| overseer$chaos person2 spy$action # person2 spy$action person1 |Test getting rid of master variable| overseer$suicide politician |Test garbage collect| overseer$void |Test sign functionality| |Shoud output ello, world!,world!,w,orld!,orld!,| leader$set person1 10 bbs$tear * bbs$scrawl " Hello, world! bbs$scrawl person1 bbs$tear bbs$read ~ spy$echo bbs$tear 6 bbs$read ~ spy$echo bbs$observe test1 spy$action test1 spy$action person1 bbs$steal test1 bbs$read ~ spy$echo bbs$read spy$echo bbs$read spy$echo |Test disposition conflict| leader$set hater hated |Test murphy's law| spy$action /THIS/IS/NOT/A/VALID/VARIABLE/NAME |Cleanup| test$twist manipulator final final$manufacture temporary 0 8 master final$empty test$consume final test$consume spy test$consume fate test$consume keep_out leader$suicide test3 |Should show overseer melting person3, overseer dying, leader melting person1 test1 test2, leader dying, path, bbs|
Reference
uredi- ^ Ezoterični programski jezici su programski jezici dizajnirani da testiraju granice dizajna programskih jezika. Koriste se kao softverska umetnost, kao hakerski interfejs za druge jezike ili kao šala.
- ^ David Catt
- ^ „Murphy's Law”. 1949. Pristupljeno 29. 10. 2018.
- ^ Fibonačijev niz je matematički niz primećen u mnogim fizičkim, hemijskim i biološkim pojavama. Ime je dobio po italijanskom matematičaru Fibonačiju. Predstavlja niz brojeva u kome zbir prethodna dva broja u nizu daju vrednost narednog člana niza. Indeksiranje članova ovog niza počinje od nule a prva dva člana su mu 0 i 1.