Pređi na sadržaj

Starfiš

S Vikipedije, slobodne enciklopedije

Starfiš je reflektivan, dvodimenzionalni ezoterični programski jezik zasnovan na jeziku Fiš. Nastao je 2016. godine.

Koncept

[uredi | uredi izvor]

Starfiš je dvodimenzionalni jezik, što znači da kod nije nužno izvršen na linearan način. Korišćenjem različitih uputstava, smer koda se može čitati i menjati nagore, dole, levo ili desno. Takođe može se memorisati i preuzeti vrednost na kodnom prostoru, tako da je pravljenje kompajlera vrlo teško, ako ne i nemoguće. Cilj Starfiša je da učini Fiš korisnijim, iako je zasnovan na njemu. Trenutno Starfiš dodaje datoteku i/o,pruža mogućnost praćenja vremena i novog koncepta uron/podizanje. Ako je to izvodljivo, neka vrsta grafičkog izlaza može biti u okviru prostora.

Izvođenje koda

[uredi | uredi izvor]

Starfiš kod je postavljen u dvodimenzionalnom kodnom prostoru. Kodni prostor je beskonačan u svim pravcima, pozitivan i negativan.

Napomena: sve koordinate za kodni prostor su date kao (znak, linija), tj. (kolona, red).

Pokazivač naredbe počinje sa (0,0), tj. gornje levo od skripte. U početku se pomera desno, ali njegov pravac može se promeniti pomoću različitih naredbi. Kada IP dostigne kraj koda u bilo kom pravcu, on će se okrenuti ili "skakati" na suprotnu stranu. IP neće nikada doći do negativne strane koda. Ovo čini prostor korisnim za čuvanje vrednosti. [1]

Ogledala

[uredi | uredi izvor]

Ogledala su posebna uputstva koja će promeniti smer IP-a u zavisnosti od smera koji već ima. Na primer, ako se IP kreće desno i ispunjava naredbu, ona će biti "reflektovan". Ako se IP kreće nadole, to će se reflektovati nadesno i tako dalje.[2]

Funkcije

[uredi | uredi izvor]

Funkcije u Starfišu rade slično ret u asm. Da bi ih koristili, stavite kordinate kodnog polja na mesto gde želite da skočite u stek. Ovo će dovesti do toga da IP pređe na željenu lokaciju, čuvajući prethodnu lokaciju u steku ispod trenutne. Dakle, mogli biste da skočite koristeći ., ali biste izgubili trenutni registar:

 <;o&C10&a
.{{] 

Rezultati:

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

Stek: [] nešto miriše na ribu ...

R ili "ret", rešava ovaj problem jednostavnim skokom do koordinata na steku ispod trenutnog, a zatim pomeranje trenutnog steka dole.

 <;o&C10&a
 Р    

I ovaj kod rezultira izlaznom linijom (a == 10 == \ n), umesto greške.

Uron i podizanje

[uredi | uredi izvor]

Uron i podizanje su posebna uputstva koja manipulišu sposobnošću IP-a da izvrši većinu naredbi, oni su u i o, redom. Uzrok zaronjenja dovodi do toga da IP ignoriše sva uputstva osim naredbi pomeranja i ogledala (> < ^ v / \ | _ # ` x). Podizanje uzrokuje da se IP ponovo ponaša normalno.

Naredba za ribare je dvostruki operator `. Prvi put kada se bilo koja naredba ribara izvrši dok se IP kreće horizontalno, IP dobija naredbu da se pomeri, sledeći put, IP dobija naredbu da se pomeri gore. Kada IP izvršava naredbu koja se kreće vertikalno, naredba je da se pomeri u poslednjem horizontalnom pravcu u kome se kreće. To omogućava razmenu u protoku logike, omogućavajući lakši rad na donjoj liniji, a IP se vraća na prvobitnu liniju. Evo osnovnog programa koji pokazuje taj koncept da ispisuje "Zdravo" bez upotrebe naredbe ribara:

 "Zdravo"rv>;
  lo<^!?

Fiš je zasnovan na steku, i stoga svaka naredba osim pokreta i naredba za krajnje izvršenje ; promeni nešto u steku. Mogu se dodavati brojeve i ulazni sadržaj, izvršavati promene i izbacivati izlazni sadržaj pomoću različitih naredbi. Takođe mogu se kreirati novi stekovi, koristeći [ naredbu. Kreiranje novog steka povlači određeni broj stavki iz tekućeg steka na novi. Novi stek je potpuno izolovan od prethodnog. Kada je naredba ] izvršena, tekući stek je uklonjen i njegove vrednosti se vraćaju nazad u osnovni stek. Ako je trenutni stek poslednji, ] jednostavno prazni stek i registar. [3]

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

Ulaz/izlaz

[uredi | uredi izvor]

Starfiš ima tri naredbe za ulaz/izlaz: i za ulaz i o / n za izlaz. i naredba jednostavno čita karaktere iz datoteke otvorene sa F. Treba imati na umu da ne postoji naredba za unos broja, potrebno je razdvojanje karaktera.

Dok razdvajanje brojeva nije teško, to čini programe sporijim i podložnijim greškama. Većina programa koji zahtevaju unos broja, čitaju ih sa steka na početku programa. Ovo se radi sa prevodiocem koji podržava pred popunjavanje steka vrednostima. To sa takvim prevodiocem izgleda ovako:

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

Izlaz je malo lakši, pošto imaju dve naredbe: o i n. Oni će izbaciti vrednost i ispisati je kao karakter i broj, redom.

Greške

[uredi | uredi izvor]

Sledeći događaji će dovesti do greške u Starfišu:

  • Deljenje nulom
  • Kada dođe do pogrešne naredbe
  • Pokušaji izbacivanja ili izmene steka kad je prazan ili ima premalo vrednosti
  • Ako prevodilac ne podržava proizvoljne brojeve, prekoračenje dovodi do greške

Iako postoji više razloga zbog kojih može doći do greške, postoji samo jedna poruka o grešci: nešto miriše na ribu ...

Instrukcije

[uredi | uredi izvor]

Dat je samo nacrt uputstava u Starfišu i podložan je promenama. Uputstva su osetljiva na velika i mala slova.

Pokret i izvršenje

[uredi | uredi izvor]
 > < ^ v Promenite pravac pokazivača naredbe (desno, levo, gore, dole)
 / \ | _ # Ogledala; IP će promeniti pravac u zavisnosti od trenutnog.
 ` IP će promeniti smer u zavisnosti od trenutnog, i koji pravac je imao prethodno.
 x Nasumičan pravac
 ! Preskoči narednu naredbu
 ? Izbacuje jednu vrednost sa steka. Sledeća naredba se izvršava samo ako izbačena vrednost nije nula.
. Skok - izbacuje у and x iz steka, i pomera IP na (x,y) na kodnom prostoru. Morate preći na ćeliju pre naredbe koju treba izvršiti, pošto će IP premestiti jednu poziciju neposredno pre izvršenja.
C R Pozivanje skokova kao ., sa čuvanjem trenutne IP lokacije u steku ispod trenutne.
u O Uroni i podizanje, redom. Uron izaziva sve naredbe, izuzev pravih, koje treba preskočiti dok se ne izvrši podizanje.

Literali i operateri

[uredi | uredi izvor]
 0-9 a-f Dodavanje odgovarajuće vrednosti na stek. a = 10, ..., f = 15
 + - * , % Dodavanje, oduzimanje, množenje, podela i modulo, redom. Izbacivanje h i u sa steka i pritisnite i operator h. Podela sa 0 dovodi do greške.
 = Jednako. Pop x i y na stek i pritisni 1 ako y = x, i 0 inače.
 ) ( Veće od i manje od. Pop x i y na stek, i dodaj 1 ako je y operator x, inače 0..
 ' " Jednostruki i dvostruki navodnik - omogućavanje razdvajanja nizova. Razdvajanje nizova izbacuje svaki znak koji se nalazi u steku sve dok ne pronađe zatvoreni navodnik.

Manipulacija stekom

[uredi | uredi izvor]
Karakter Značenje
: Duplira najvišu vrednost na steku.
~ Premešta najvišu vrednost iz stega.
$ Menja najviše dve vrednosti na steku.
@ Menja najviše tri vrednosti na steku, pomera ih nadesno (npr ako je stek 1,2,3,4, pozivanje na @ dovodi do 1,4,2,3).
} { Prebacuje ceo stek nadesno i levo, redom. (npr. kad ima 1,2,3,4, pozivanje } dovodi do u 4,1,2,3 dok { dovodi do u 2,3,4,1).
r Obrće stek.
l Ddaje dužinu steka na stek.
[ Izbacuje h iz steka i kreirajte novi stek, pomerajući h vrednosti iz starog steka na novi.
] Uklanja trenutni stek, pomerite svoje vrednosti na vrh postojećeg steka.
ID Povećanje i smanjenje, redm. Promena odabranog steka, naredbom И označava se stek iznad, i Д označava se stek ispod. Ako ne postoji stek, većina operacija će dovesti do greške.

Ulaz/izlaz

[uredi | uredi izvor]
 o n Izbacuje i ispisuje znak i brojeve, redom.
 i Čita jedan znak iz datoteke, ako je otvorena, i dodaje ga u stek. Znak ne sme biti prikazan kada se čita sa konzole. Kada nema više unosa -1 se ispisuje
 F Otvaranje fajla. Izbacuje x na steka i onda čita x vrednosti sa steka. Ako datoteka nije otvorena, vrednosti određuju ime datoteke. Ako je datoteka otvorena, vrednosti su upisane u datoteku i datoteka je zatvorena.

Refleksija/razno

[uredi | uredi izvor]
 & Izbacuje najveću vrednost na stek i stavlja je u registar. Naredbom & ponovo uzima vrednost iz registra i stavlja je na stek.
 g Izbacuje y i x na stek, i stavlja vrednost x,y u kodni prostor. Prazne ćelije su jednake 0.
 p Izbacuje y, x, i v na stek, i menja vrednost x,y u v.
 S Odmaranje. Izbacuje x na stek i odmara.
 h m s Sat, minut i sekunda, redom.
 ; Kraj izvršavanja.

Primeri

[uredi | uredi izvor]

[4]

Svi primeri se izvode pomoću go-starfish prevodioca.

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

Otvara "zdravo.txt", prikazuje svoj sadržaj i briše.

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

Funkcija

[uredi | uredi izvor]

Poziva funkciju na 0, 1 i izlazi.

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

Izbor stekova

[uredi | uredi izvor]
 "Zdravo "r0["svete"rDv
  ov!?l               <
  I
  o>l?!;
$ starfish stackselect.sf 
Zdravo svete

Prevodilac

[uredi | uredi izvor]

Prevodilac pogledajte ovde.

Reference

[uredi | uredi izvor]
  1. ^ „Code execution”. Fish. Pristupljeno 31. 10. 2018. 
  2. ^ „Mirrors”. Fish. Pristupljeno 31. 10. 2018. 
  3. ^ „Stacks”. Fish. Pristupljeno 31. 10. 2018. 
  4. ^ „Examples”. Starfish. Pristupljeno 31. 10. 2018. 

Spoljašnje veze

[uredi | uredi izvor]