Програмски језик Дарк
Програмски језик Дарк ( енгл. Dark ) је езотерични програмски језик[1] креиран од стране Дејвида Ката (David Catt)[2] који га је направио да буде зао.
Инструкције
[уреди | уреди извор]Увод
[уреди | уреди извор]Дарк је језик заснован на манипулацији читавим световима и димензијама како би се постигли циљеви и изградила највећа мука стварности. Сваки програм се чита као серија команди за предмете са циљем да се сваки свет што је више могуће изврне. Због своје лоше дизајниране документације, вероватно је да су чак и описи језика зли.
Основе језика
[уреди | уреди извор]Напомена: У свим примерима кодова где год се употребљавају заграде {} дате су информације о делу наредбе, на пример ({име објекта}${функција} означава линију која садржи име објекта праћено колоном и именом функције; пример такве линије може бити нешто$акција).
Језик се искључиво заснива на објектима. На почетку сваког програма, објекат типа HELL мора бити декларисан (синтакса: +{име објекта} hell). Овај објекат дозвољава креирање и контролу других објеката и представља основ за програм. Објекат се користи навођењем имена објекта и функције која се покреће на том објекту (синтакса: {име објекта}${функција}{параметри}) Све линије програма са изузетком у првој линији треба да буду у овом формату, осим ако је линија празна линија или коментар. Коментиране линије морају се започети са симболима цеви (|) и завршити са другим симболом цеви. Сва имена објеката су осетљива на величину слова.
Кад год се појави синтаксна грешка, програмски разум се смањи за 1. Разуман програм почиње са 100, ако разумљивост програма достигне 0 програм није разумљив. Када год се јави општа грешка, тумач одштампа линију "Murphy's Law is working correctly."[3] . Када се програм заврши, сви активни објекти ће се решавати и одговарајуће поруке о грешци ће се појавити на конзоли са детаљима процеса чишћења. Као такав препоручује се уништавање свих објеката пре него што се програм заврши. Променљиве се такође третирају слично.
Специфично
[уреди | уреди извор]Сви објекти се чувају у меморијском простору познатом као CONTROL_SPACE, одвојено од свих променљивих. Променљиве су локалне за сваки манипулатор и налазе се у мемориској локацији познатој по називу WORLD_BLOCK. Постоји глобални ред стрингова познат као VOICELIST, који чува вредности знакова.
Референтни интерпретатор
[уреди | уреди извор]Референтни интерпретатор је у потпуности усклађен са Дарк програмским језиком. Прихвата више изворних датотека као аргументе командне линије. Свака улазна датотека се интерпретира засебно и секвенцијално. Опције се такође могу подесити помоћу командне линије. Аргументи командне линије утичу само на изворне датотеке након аргумента. Могући аргументи су:
Аргумент | Опис |
---|---|
-wimpmode | Укључује -wimpmode. Ово није део званичне спецификације и искључује се подразумевано. У -wimpmode варијаблама корупција се не акумулира, а подразумевани корисници грешака се замењују смисленим порукама о грешци. |
-strict | Искључује -wimpmode. Ово осигурава да преводилац ради у складу са пуним стандардом (осим TRACE режима). |
-traceon | Узимајући савет Емиије Схироу, видећете све што се догађа унутар интерпретатора. Све линије се штампају како се извршавају, а сви руководиоци грешке се замењују као у -wimpmode . Ово је подразумевано искључено и биће уклоњено у будућим верзијама интерпретатора. |
-traceoff | Искључује trace мод. |
-stripcode | Омогућава интерпретатору да уклони коментаре и празне линије након учитавања изворне датотеке. Ово је подразумевано укључено и резултираће бољим перформансама. Изворна датотека није измењена. Док у -wimpmode, може доћи до неисправних исписа бројева са порукама о грешкама. |
-keepextra | Интерпретатор мора да задржи све додатне кодове, као што су коментари и празне линије. Користан само за дебаговање. |
-breakonerror | Упозорава интерпретатора да заустави извршење и сачека притисак на тастер након сваке грешке. Овај аргумент је обично искључен и утиче само на -wimpmode . |
-continueonerror | Не зауставља се када се појави грешка. Представља типично понашање интерпретатора. |
Референтни интерпретатор такође одговара недокументованим деловима Дарк стандарда.
Типови објеката
[уреди | уреди извор]Hell
[уреди | уреди извор]Hell је основни објекат програма, декларисан у првом реду кода. Може постојати само један hell објекат по програму. Овај објекат прихвата следеће наредбе:
Синтакса | Опис |
---|---|
{објекат}$twist {тип објекта}{име објекта} | Креира нови објекат. |
{објекат}$consume {име објекта} | Уклања (уништава) објекат. |
{објекат}$empty | Уклања (уништава) све објекте. |
{објекат}$break | Избацује грешку интерпретатору. Референтни интерпретатор ће иштампати једноставну поруку о грешци када се изда ова функција. |
{објекат}$break {текст грешке} | Избацује грешку интерпретатору са прилагођеним текстом грешке. |
{објекат}$apocalypse | Одмах завршава програм. Сви активни објекти су уклоњени (уништени) као и обично. |
Manipulator
[уреди | уреди извор]Manipulator је објекат који омогућава управљање променљивама. Он може садржати највише 1024 променљиве. Када се променљива ослободи, за собом оставља распад. Овај распад се мора обрисати уз помоћ функције VOID, како би се ослободило место за нове променљиве. Постоји неколико механизама променљивих. Могуће је дефинисати променљиве са истим именом као нека друга променљива у другом манипулатору, иако када их користимо могу изазвати проблеме. Манипулатор може манипулисати само својим променљивама, стога операције са променљивама у манипулаторима морају да користе објекат SIGN као привремено складиште. Све променљиве су неозначени природни бројеви који могу бити дужине 8, 16 ,32 или 64 бита. Када се променљиве не користе у преко 65536 циклуса, оне почињу да акумулирају(прикупљају) корупцију. Корупција обрће један бит у променљивој када се појави у њој. Свака променљива мора имати диспозицију. Ако се у функцији користе променљиве које се разликују за више од једне диспозиције, оне се сукобљавају и променљиве се убијају. Променљиве такође морају бити дефинисане као или SERVANT или MASTER. Servant мора изабрати master променљиву. Када master умре, све променљиве везане за њега такође умиру. Ово је корисно за груписање и масовно убијање променљивих. Објекат manipulator прихвата следеће функције:
Синтакса | Опис |
---|---|
{објекат}$manufacture {име променљиве} {диспозиција} {величина} master | Креира нову master променљиву. |
{објекат}$manufacture {име променљиве} {диспозиција} {величина} servant {име мастер променљиве} | Креира нову servant променљиву која се третира као мастер променљива,што се дешава када је master променљива непостојећа. У том случају променљива се сматра изгубљеном и третира се као master променљива која не може имати servant променљиву. |
{објекат}$suicide {име променљиве} | Приморава променљиву да се убије, ослобађајући је (то ће оставити распад). |
{објекат}$skill {име променљиве} | Убија променљиву. Исто као функција suicide. |
{објекат}$void | Чисти сав распад. Ово омогућава да се користе сва слободна места променљивих. |
{објекат}$genocide {диспозиција} | Убија све променљиве наведене диспозиције. Запамтите, ово утиче само на променљиве директно под контролом манипулатора и оставља распад као и све остале функције. |
{објекат}$omnicide | Убија све променљиве. Ради као функција genocide. |
{објекат}$chaos {име променљиве} | Задаје променљивој случајну вредност. |
{објекат}$set {име променљиве} {вредност} | Задаје променљивој наведену вредност. Вредност може бити друга променљива из истог манипулатора или број. |
{објекат}$add {име променљиве} {вредност1} {вредност2} | Задаје променљивој збир две вредности. Још једном, вредности могу бити или променљиве или бројеви. |
{објекат}$subtract {име променљиве} {вредност1} {вредност2} | Задаје променљивој разлику две вредности. |
{објекат}$multiply {име променљиве} {вредност1} {вредност2} | Задаје променљивој производ две вредности. |
{објекат}$divide {име променљиве} {вредност1} {вредност2} | Задаје променљивој количник две вредности. |
Entropy
[уреди | уреди извор]Објекат entropy омогућава контролу тока програма. Лабеле могу бити уграђене, и неће се редефинисати унутар других лабела осим ако нису недефинисане. Функција choice може бити уграђена, али свака од њих мора бити из другог entropy објекта. Прихватљиве функције су:
Синтакса | Опис |
---|---|
{објекат}$choice {вредност1} {компаратор} {вредност2} | Упоређује све вредности и извршава затворени блок уколико је услов тачан. Ради као функција IF у већини програмских језика. Вредности могу бити или променљиве или нумеричке врендности; променљиве могу бити из било ког објекта манипулатора. Прихваћени компаратори су: = == < > <= >= != <>. |
{објекат}$balance | Дефинише блок кодова за покретање ако је услов функције choice нетачан. Ради као функција ELSE у већини програмских језика. |
{објекат}$reprogram | Завршава претходан или балансира блок. Ради као ENDIF у већини програмских језика. |
{објекат}$corpse {име лабеле} | Дефинише лабелу. Уколико је лабела већ дефинисана, претходна дефиниција се чува. Неки интерпретатори могу проузроковати општу грешку уколико лабела већ постоји, па је добра пракса не дефинисати уграђену лабелу и поново их дефинисати при свакој интерацији(понављању). |
{објекат}$stumble {име лабеле} | Изазива извршење да пређе на претходно дефинисани леш (лабелу). |
{објекат}$illusion {име лабеле} | Не дефинише леш. Леш на тај начин може бити поново дефинисан касније. |
Stalker
[уреди | уреди извор]Stalker објекат контролише све базичне излазно/улазне функције. Stalker не почиње сам од себе, већ мора да се покрене једном stalk функцијом. Ако stalker није покренут онда ће се сви покушаји да се изврше И/У функције резултовати депресивним порукама о грешци које ће бити написане у конзоли. Stalker има само два мода DISTANT (удаљен,уобичајен) и PERSONAL (лични). У удаљеном моду, сваки излаз је написан на једном раздвајачу и мора да се избаци на конзолу преко paracusia функције. Мењање модова ће натерати раздвајача да се испразни, док је stalker на личном моду, сваки излаз се одмах пише на конзоли.
Синтакса | Опис |
---|---|
{објекат}$stalk | Покреће објекат stalker. Потребан за коришћење других функција. |
{објекат}$control {име променљиве} | Узрокује да дата променљива прихвати контролу, која поставља карактер који се чита из конзоле у карактер кода. |
{објекат}$control # {име променљиве} | Узрокује да дата променљива прихвати контролу, која поставља променљиву на вредност уписаног броја, а неисправно куцање ће проузроковати опште грешке. |
{објекат}$action {име променљиве} | Узрокује да дата променљива предузме акцију, што изазива да карактер са кодом знака који је једнак вредности променљиве буде записан на конзолу. |
{објекат}$action # {име променљиве} | Узрокује да дата променљива предузме акцију, што узрокује да се нумеричка вредност променљиве пише на конзоли. |
{објекат}$echo | Уклања вредност из VOICELIST и записује је на конзолу. |
{објекат}$distant | Пребацује објекат у удаљен мод. |
{објекат}$personal | Пребацује објекат у лични мод. |
{објекат}$paracusia | Пусти раздвајач на конзолу и он се ресетује на празну вредност. |
Sign
[уреди | уреди извор]Sign објекти су контејнери за стрингове. Sign је репрезентација реда карактера кодова. Sign објекти прихватају следеће функције:
Синтакса | Опис |
---|---|
{објекат}$scrawl {име променљливе} | Додаје вредност карактера променљиве у тренутну поруку. |
{објекат}$scrawl # {име променљиве} | Додаје нумеричку вредност променљиве у тренутну поруку. |
{објекат}$scrawl " {стринг} | Додаје дословни стринг тренутној поруци. |
{објекат}$tear | Уклања први карактер из поруке. |
{објекат}$tear {бројач} | Уклања прве {бројач} карактере из поруке. |
{објекат}$tear * | Уклања све карактере из поруке. |
{објекат}$observe {име променљиве} | Поставља променљиву на вредност првог карактера у поруци. |
{објекат}$steal {име променљиве} | Поставља променљиву на вредност првог карактера у поруци и брише карактер из поруке. |
{објекат}$read | Додаје у ред тренутну поруку у VOICELIST, а затим брише тренутну поруку. |
{објекат}$read ~ | Додаје у ред тренутну поруку у VOICELIST без брисања тренутне поруке- |
Неки програми
[уреди | уреди извор]CAT програм
[уреди | уреди извор]Cat програм је програм који копира свој стандардни улаз на свој стандардни излаз.
+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!
[уреди | уреди извор]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
Фибоначијев низ
[уреди | уреди извор]Фибоначијев низ [4]је низ бројева, где је сваки број збир два претходна броја у низу. Једини изузетак су прва два броја која су 0 и 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
Главни језик/Тест интерпретатора
[уреди | уреди извор]+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|
Референце
[уреди | уреди извор]- ^ Езотерични програмски језици су програмски језици дизајнирани да тестирају границе дизајна програмских језика. Користe се као софтверска уметност, као хакерски интерфејс за друге језике или као шала.
- ^ David Catt
- ^ „Murphy's Law”. 1949. Приступљено 29. 10. 2018.
- ^ Фибоначијев низ је математички низ примећен у многим физичким, хемијским и биолошким појавама. Име је добио по италијанском математичару Фибоначију. Представља низ бројева у коме збир претходна два броја у низу дају вредност наредног члана низа. Индексирање чланова овог низа почиње од нуле а прва два члана су му 0 и 1.