Програмски језик Дарк

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

Програмски језик Дарк ( енгл. 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|

Референце[уреди | уреди извор]

  1. ^ Езотерични програмски језици су програмски језици дизајнирани да тестирају границе дизајна програмских језика. Користe се као софтверска уметност, као хакерски интерфејс за друге језике или као шала.
  2. ^ David Catt
  3. ^ „Murphy's Law”. 1949. Приступљено 29. 10. 2018. 
  4. ^ Фибоначијев низ је математички низ примећен у многим физичким, хемијским и биолошким појавама. Име је добио по италијанском математичару Фибоначију. Представља низ бројева у коме збир претходна два броја у низу дају вредност наредног члана низа. Индексирање чланова овог низа почиње од нуле а прва два члана су му 0 и 1.

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

Visual Basic.NET interpreter and sample programs