Пређи на садржај

Старфиш

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

Старфиш је рефлективан, дводимензионални езотерични програмски језик заснован на језику Фиш. Настао је 2016. године.

Старфиш је дводимензионални језик, што значи да код није нужно извршен на линеаран начин. Коришћењем различитих упутстава, смер кода се може читати и мењати нагоре, доле, лево или десно. Такође може се меморисати и преузети вредност на кодном простору, тако да је прављење компајлера врло тешко, ако не и немогуће. Циљ Старфиша је да учини Фиш кориснијим, иако је заснован на њему. Тренутно Старфиш додаје датотеку и/о,пружа могућност праћења времена и новог концепта урон/подизање. Ако је то изводљиво, нека врста графичког излаза може бити у оквиру простора.

Извођење кода

[уреди | уреди извор]

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

Напомена: све координате за кодни простор су дате као (знак, линија), тј. (колона, ред).

Показивач наредбе почиње са (0,0), тј. горње лево од скрипте. У почетку се помера десно, али његов правац може се променити помоћу различитих наредби. Када ИП достигне крај кода у било ком правцу, он ће се окренути или "скакати" на супротну страну. ИП неће никада доћи до негативне стране кода. Ово чини простор корисним за чување вредности. [1]

Огледала

[уреди | уреди извор]

Огледала су посебна упутства која ће променити смер ИП-а у зависности од смера који већ има. На пример, ако се ИП креће десно и испуњава наредбу, она ће бити "рефлектован". Ако се ИП креће надоле, то ће се рефлектовати надесно и тако даље.[2]

Функције

[уреди | уреди извор]

Функције у Старфишу раде слично рет у асм. Да би их користили, ставите кординате кодног поља на место где желите да скочите у стек. Ово ће довести до тога да ИП пређе на жељену локацију, чувајући претходну локацију у стеку испод тренутне. Дакле, могли бисте да скочите користећи ., али бисте изгубили тренутни регистар:

 <;o&C10&a
.{{] 

Резултати:

<  ;  o *&* C  1  0  &  a 
.  {  {  ]

Стек: [] нешто мирише на рибу ...

R или "рет", решава овај проблем једноставним скоком до координата на стеку испод тренутног, а затим померање тренутног стека доле.

 <;o&C10&a
 Р    

И овај код резултира излазном линијом (а == 10 == \ н), уместо грешке.

Урон и подизање

[уреди | уреди извор]

Урон и подизање су посебна упутства која манипулишу способношћу ИП-а да изврши већину наредби, они су u и o, редом. Узрок зароњења доводи до тога да ИП игнорише сва упутства осим наредби померања и огледала (> < ^ v / \ | _ # ` x). Подизање узрокује да се ИП поново понаша нормално.

Наредба за рибаре је двоструки оператор `. Први пут када се било која наредба рибара изврши док се ИП креће хоризонтално, ИП добија наредбу да се помери, следећи пут, ИП добија наредбу да се помери горе. Када ИП извршава наредбу која се креће вертикално, наредба је да се помери у последњем хоризонталном правцу у коме се креће. То омогућава размену у протоку логике, омогућавајући лакши рад на доњој линији, а ИП се враћа на првобитну линију. Ево основног програма који показује тај концепт да исписује "Здраво" без употребе наредбе рибара:

 "Zdravo"rv>;
  lo<^!?

Фиш је заснован на стеку, и стога свака наредба осим покрета и наредба за крајње извршење ; промени нешто у стеку. Могу се додавати бројеве и улазни садржај, извршавати промене и избацивати излазни садржај помоћу различитих наредби. Такође могу се креирати нови стекови, користећи [ наредбу. Креирање новог стека повлачи одређени број ставки из текућег стека на нови. Нови стек је потпуно изолован од претходног. Када је наредба ] извршена, текући стек је уклоњен и његове вредности се враћају назад у основни стек. Ако је тренутни стек последњи, ] једноставно празни стек и регистар. [3]

  12345 3[  r  ]  rnnnnn;
  ^    ^  ^  ^     ^
  |    |  |  |     | Излаз: 12543. Три главне вредности су обрнуте!
  |    |  |  |
  |    |  |  | Други стек је уклоњен, стављајући своју вредност у први стек.
  |    |  |
  |    |  | Други стек је обрнут.
  |    |
  |    | Креира се други стек, извлачење 3 вредности из првог стека.
  |
  | Бројеви 1-5 су додати на први стек.

Улаз/излаз

[уреди | уреди извор]

Старфиш има три наредбе за улаз/излаз: i за улаз и o / n за излаз. i наредба једноставно чита карактере из датотеке отворене са F. Треба имати на уму да не постоји наредба за унос броја, потребно је раздвојање карактера.

Док раздвајање бројева није тешко, то чини програме споријим и подложнијим грешкама. Већина програма који захтевају унос броја, читају их са стека на почетку програма. Ово се ради са преводиоцем који подржава пред попуњавање стека вредностима. То са таквим преводиоцем изгледа овако:

 $ starfish -i 10 -code "2*n;"
 20

Излаз је мало лакши, пошто имају две наредбе: o и n. Они ће избацити вредност и исписати је као карактер и број, редом.

Следећи догађаји ће довести до грешке у Старфишу:

  • Дељење нулом
  • Када дође до погрешне наредбе
  • Покушаји избацивања или измене стека кад је празан или има премало вредности
  • Ако преводилац не подржава произвољне бројеве, прекорачење доводи до грешке

Иако постоји више разлога због којих може доћи до грешке, постоји само једна порука о грешци: нешто мирише на рибу ...

Инструкције

[уреди | уреди извор]

Дат је само нацрт упутстава у Старфишу и подложан је променама. Упутства су осетљива на велика и мала слова.

Покрет и извршење

[уреди | уреди извор]
 > < ^ v Промените правац показивача наредбе (десно, лево, горе, доле)
 / \ | _ # Огледала; ИП ће променити правац у зависности од тренутног.
 ` ИП ће променити смер у зависности од тренутног, и који правац је имао претходно.
 x Насумичан правац
 ! Прескочи наредну наредбу
 ? Избацује једну вредност са стека. Следећа наредба се извршава само ако избачена вредност није нула.
. Скок - избацује у and x из стека, и помера ИП на (x,y) на кодном простору. Морате прећи на ћелију пре наредбе коју треба извршити, пошто ће ИП преместити једну позицију непосредно пре извршења.
C R Позивање скокова као ., са чувањем тренутне ИП локације у стеку испод тренутне.
u O Урони и подизање, редом. Урон изазива све наредбе, изузев правих, које треба прескочити док се не изврши подизање.

Литерали и оператери

[уреди | уреди извор]
 0-9 a-f Додавање одговарајуће вредности на стек. а = 10, ..., ф = 15
 + - * , % Додавање, одузимање, множење, подела и модуло, редом. Избацивање х и у са стека и притисните и оператор х. Подела са 0 доводи до грешке.
 = Једнако. Поп x и y на стек и притисни 1 ако y = x, и 0 иначе.
 ) ( Веће од и мање од. Pop x и y на стек, и додај 1 ако је y оператор x, иначе 0..
 ' " Једноструки и двоструки наводник - омогућавање раздвајања низова. Раздвајање низова избацује сваки знак који се налази у стеку све док не пронађе затворени наводник.

Манипулација стеком

[уреди | уреди извор]
Карактер Значење
: Дуплира највишу вредност на стеку.
~ Премешта највишу вредност из стега.
$ Мења највише две вредности на стеку.
@ Мења највише три вредности на стеку, помера их надесно (нпр ако је стек 1,2,3,4, позивање на @ доводи до 1,4,2,3).
} { Пребацује цео стек надесно и лево, редом. (нпр. кад има 1,2,3,4, позивање } доводи до у 4,1,2,3 док { доводи до у 2,3,4,1).
r Обрће стек.
l Ддаје дужину стека на стек.
[ Избацује х из стека и креирајте нови стек, померајући х вредности из старог стека на нови.
] Уклања тренутни стек, померите своје вредности на врх pостојећег стека.
ID Повећање и смањење, редм. Промена одабраног стека, наредбом И означава се стек изнад, и Д означава се стек испод. Ако не постоји стек, већина операција ће довести до грешке.

Улаз/излаз

[уреди | уреди извор]
 o n Избацује и исписује знак и бројеве, редом.
 i Чита један знак из датотеке, ако је отворена, и додаје га у стек. Знак не сме бити приказан када се чита са конзоле. Када нема више уноса -1 се исписује
 F Отварање фајла. Избацује x на стека и онда чита x вредности са стека. Ако датотека није отворена, вредности одређују име датотеке. Ако је датотека отворена, вредности су уписане у датотеку и датотека је затворена.

Рефлексија/разно

[уреди | уреди извор]
 & Избацује највећу вредност на стек и ставља је у регистар. Наредбом & поново узима вредност из регистра и ставља је на стек.
 g Избацује y и x на стек, и ставља вредност x,y у кодни простор. Празне ћелије су једнаке 0.
 p Избацује y, x, и v на стек, и мења вредност x,y у v.
 S Одмарање. Избацује x на стек и одмара.
 h m s Сат, минут и секунда, редом.
 ; Крај извршавања.

[4]

Сви примери се изводе помоћу go-starfish преводиоца.

"Здраво свете!";
$ starfish здравосвете.sf 
Здраво свете!

Отвара "zdravo.txt", приказује свој садржај и брише.

  "zdravo.txt"lF\
        v!?+1:i<
        ~
        r
   ov!?l<
  F0<;
  $ starfish fileio.sf 
  Zdravo starfish!

Функција

[уреди | уреди извор]

Позива функцију на 0, 1 и излази.

  <;C10
  v"Radi!"
  <oR!?l
  $ starfish function.sf
  Radi!

Избор стекова

[уреди | уреди извор]
 "Zdravo "r0["svete"rDv
  ov!?l               <
  I
  o>l?!;
$ starfish stackselect.sf 
Zdravo svete

Преводилац

[уреди | уреди извор]

Преводилац погледајте овде.

Референце

[уреди | уреди извор]
  1. ^ „Code execution”. Fish. Приступљено 31. 10. 2018. 
  2. ^ „Mirrors”. Fish. Приступљено 31. 10. 2018. 
  3. ^ „Stacks”. Fish. Приступљено 31. 10. 2018. 
  4. ^ „Examples”. Starfish. Приступљено 31. 10. 2018. 

Спољашње везе

[уреди | уреди извор]