Програмски језик Дарк ( енгл. Dark ) је езотерични програмски језикЕзотерични програмски језици су програмски језици дизајнирани да тестирају границе дизајна програмских језика. Користe се као софтверска уметност, као хакерски интерфејс за друге језике или као шала. креиран од стране Дејвида Ката (David Catt)David Catt који га је направио да буде зао.

Инструкције Увод

Дарк је језик заснован на манипулацији читавим световима и димензијама како би се постигли циљеви и изградила највећа мука стварности. Сваки програм се чита као серија команди за предмете са циљем да се сваки свет што је више могуће изврне. Због своје лоше дизајниране документације, вероватно је да су чак и описи језика зли.

Основе језика

Напомена: У свим примерима кодова где год се употребљавају заграде {} дате су информације о делу наредбе, на пример ({име објекта}${функција} означава линију која садржи име објекта праћено колоном и именом функције; пример такве линије може бити нешто$акција).

Језик се искључиво заснива на објектима. На почетку сваког програма, објекат типа HELL мора бити декларисан (синтакса: +{име објекта} hell). Овај објекат дозвољава креирање и контролу других објеката и представља основ за програм. Објекат се користи навођењем имена објекта и функције која се покреће на том објекту (синтакса: {име објекта}${функција}{параметри}) Све линије програма са изузетком у првој линији треба да буду у овом формату, осим ако је линија празна линија или коментар. Коментиране линије морају се започети са симболима цеви (|) и завршити са другим симболом цеви. Сва имена објеката су осетљива на величину слова.

Кад год се појави синтаксна грешка, програмски разум се смањи за 1. Разуман програм почиње са 100, ако разумљивост програма достигне 0 програм није разумљив. Када год се јави општа грешка, тумач одштампа линију "Murphy's Law is working correctly." . Када се програм заврши, сви активни објекти ће се решавати и одговарајуће поруке о грешци ће се појавити на конзоли са детаљима процеса чишћења. Као такав препоручује се уништавање свих објеката пре него што се програм заврши. Променљиве се такође третирају слично.

Специфично

Сви објекти се чувају у меморијском простору познатом као 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 програм