Download as pdf or txt
Download as pdf or txt
You are on page 1of 32

STUDENT:

ADNA ČORBO

PROFESOR:
DR.SCI. SAMIR RIBIĆ

KURS:
PROGRAMSKI JEZICI I PREVODIOCI
UVOD U FORTH .................................................................................................................................. 3
OSNOVA FORTH JEZIKA ................................................................................................................. 3
POCETAK FORTH-A .........................................................................................................................4
Pisanje programa u FORTH-u..................................................................................................4
Snalaženje u jeziku ..................................................................................................................... 5
Prednosti i mane .......................................................................................................................... 6
ARHITEKTURA FORTH-A ............................................................................................................... 7
VIRTUALNA MAŠINA................................................................................................................... 7
EFIKASNOST ................................................................................................................................. 7
STEKOVI .......................................................................................................................................... 7
Tumačenje i sastavljanje ........................................................................................................... 8
Faktoring ........................................................................................................................................ 9
SINTAKSA FORTH-A...................................................................................................................... 10
Definisanje riječi ........................................................................................................................ 12
Rječnik........................................................................................................................................... 12
Numerički unos .......................................................................................................................... 14
Komande za manipulisanje stekom .................................................................................... 16
Komentari .................................................................................................................................... 17
Stvaranje izlaza.......................................................................................................................... 18
Uvjeti i petlje ................................................................................................................................ 19
Varijable i konstante .................................................................................................................22
Nizovi ............................................................................................................................................ 24
Unos sa tastature ..................................................................................................................... 25
PODATKOVNI TIPOVI .....................................................................................................................26
PRIMJER FORTH PROGRAMA (SUDOKU) ...............................................................................29
REFERENCE .....................................................................................................................................32

PROGRAMSKI JEZICI I PREVODIOCI 2


Nepoznati jezik za većinu studenata i profesionalaca unatoč
činjenici da njegova historija započinje u kasnim 60-ima, niški jezik,
ograničen na praksi programiranja mikrokontrolera, ali
istovremeno preteča strukturiranog programiranja kao i objektno
orijentiranog programiranja. Jezik koji utjelovljuje radikalno
drugačiju filozofiju, koja odstupa od probijene staze, od trenutnih
trendova zbog kojih su mnogi jezici puki stalci u kojima treba
podržati teške i složene biblioteke.

Forth je član klase proširivih interaktivan, brz jer je


interaktivnih jezika koji kompaktan i moćan jer je
uključuje klasične proširiv. Forth je jezik s tačno
implementacije Smalltalka. određenim stilom. Forth je
Proširivo znači da ne postoji razvio Charles (Chuck) Moore
razlika između ključnih riječi početkom 1960-ih. Mooreov rad
(osnovnih riječi) i rutine koje s računalima na MIT-u i u
pišete. Nakon što sastavite Stanford Linear Accelerator
novu definiciju, čak i s Centru ostavio ga je
tastature, ona vam je odmah nezadovoljnim. Forth, tadašnja
dostupna. Interaktivan znači da generacija prevoditelja ALGOL
s njim možete razgovarati s i FORTRAN bila je prespora.
tastaturee. Vrijeme prijelaza za Njegovo rješenje za to bilo je
uređivanje, sastavljanje i pisanje jednostavnog tumača
pokretanje programa pomoću teksta u ALGOL-u koji je čitao
Fortha je drugačija vrsta riječima (bilo koji znak za ispis
računarskog jezika. Forth kôd osim razmaka) i vršio
lako je ukloniti jer je Forth povezane radnje.

PROGRAMSKI JEZICI I PREVODIOCI 3


Riječi su ili primarne (tj. "interpretacije" - shvaćene) ili sekundarne (tj.
„definisane“ u smislu drugih riječi). Nakon svog početnog uspjeha s
prevoditeljem temeljenim na ALGOL-u na MIT-u i Stanfordu, Moore je
nastavio raditi s Burroughs opremom. Ovaj je hardver bio snažno orijentiran
oko stekova. To je uticalo na daljnji razvoj Fortha.
Sprovedbe su napisane na BALGOL, COBOL i SBOL (programski jezik
Burroughs Systems). Omogućile su manipulacijske riječi za niz: DROP, DUP,
SWAP itd. koje se i danas nalaze u modernim sistemima Fortha. Prvi pravi
sistem Fortha koji je nalikovao onome što sada doživljavamo kao Forth
stvorio je Moore na IBM 1130. Veličina riječi ove mašine ograničila je korisnike
na nazive ne više od pet znakova. Da nije bilo ovog IBM-ovog ograničenja,
naziv `Forth 'bio bi" Fourth"- što znači jezik četvrte generacije. Prva Forthova
prijava bio je program za prikupljanje podataka radio teleskopa napisan za
Honeywell H316 u Nacionalnom opservatoriju za radio astronomiju. Ova
implementacija Fortha koristi rječnik za pohranu riječi koje je definisao
korisnik.

Pisanje programa u FORTH-u


Često je potrebno malo više vremena za učenje nego sa drugim jezicima. Kao
i govorni jezici, u Forthu je potrebno naučiti mnogo riječi prije nego što ih
dobro iskoristite. U FORTH jeziku, ono što se na drugim jezicima naziva
funkcijama, postupcima ili potprogramima ovdje se naziva riječima. Forth je
jezik na kojem se od korisnika skriva vrlo malo. Skoro svaka riječ koju smo
upotrijebili na putu prema nekoj drugoj funkciji ima ime i dokumentovana je u
rječniku.
Kao rezultat ove otvorenosti, u rječniku je mnoštvo riječi (upišite WORDS da
biste ih vidjeli). Funkcije u Forthu nazivaju se riječi, u žargonu Fortha. Na
primjer, riječi koje se koriste za definisanje alata za sastavljanje često se
čuvaju u rječniku koji se naziva ASSEMBLER. Kao i u svim računarskim
jezicima, i u Forthu se nalazi žargon. U ovom slučaju, žargon je tehnički jezik i
služi kao skup komunikacijskih alata tako da možemo objasniti svoje ideje
jedni drugima, a da ne budemo zaokupljeni sitnicama. Forth nije samo
vrijedan truda, već je i alat spektakularne produktivnosti u pravim rukama.
Paket za pokretanje Forth-a zapravo je kompaktna kombinacija tumača,
prevoditelja i alata.

PROGRAMSKI JEZICI I PREVODIOCI 4


Naredba ili niz naredbi (riječi) može se izvršiti izravno s tastature ili učitati iz
masovne pohrane kao da je s tastature. U host verzijama Forth-a (i nekim
ugradbenim sistemima) možete preuzeti i unos iz normalne tekstualne
datoteke operativnog sistema, stvorene od normalnog (ne-Fortha).
Programi u Forthu sastavljaju se od kombinacija postojećih riječi (već se
nalaze u rječniku), novih riječi kako ih je definisao korisnik, i kontrolnih
struktura poput IF ... ELSE ... THEN ili DO ... LOOP. Često se nove riječi
interaktivno razvijaju na terminalu prije nego što se konačna (i testirana)
verzija unese pomoću uređivača i spremi na disk, gdje se može pozvati s
tastature ili koristeći drugi program.
Ljepota i moć Fortha leži u interaktivnosti, proširivosti i fleksibilnosti. Nove
riječi mogu se dodavati ili na visokoj ili niskoj (asemebler) razini. Forth je
jedan od rijetkih jezika koji može definisati strukturu podataka i kako se ona
koristi unutar jedne definicije. Ova sposobnost stvaranja novih riječi poznata
je kao definisanje riječi, koje jeziku mogu dodati nove klase operatora. To je
jedan od ključeva izvanredne snage Fortha u rukama iskusnog programera.
Loš programer Fortha jednako je katastrofa kao i u bilo kojem drugom jeziku.
Ako je vaše iskustvo programiranja bilo na tradicionalno organizovanim
jezicima kao što su C ili BASIC, na početku ćete naći programe za čitanje i
pisanje u Forthu pomalo bizarne. Strpljenje donosi bogate nagrade. Forth
postaje mnogo lakše razumljiv jednom kada savladate neke ideje i poigrate
se s jezikom. Najvažnija pomagala u korištenju Forth-a je izbor naziva riječi.
Razmislite o imenu riječi unaprijed. Glagoli, imenice i pridjevi imaju svoje
mjesto u dobrom stilu programiranja Forth. Dobar izbor naziva riječi dovodi
do vrlo čitljivog koda, kao i upotreba bijelog prostora u izvornom kodu.
Možete koristiti bilo koji znak unutar riječi - razumljiva je upotreba onih za
ispis. Nazivi riječi mogu biti dugački do 31 znak (više u nekim
implementacijama) i svi znakovi su značajni.

Snalaženje u jeziku
Programi Fortha zadržavaju većinu svojih radnih varijabli na steku, a ne u
imenovanim varijablama, pa čitanje nekih odjeljaka koda može biti malo
zbunjujuće - čak i za iskusne. Tajna je u tome da su definicije kratke i
jednostavne.

PROGRAMSKI JEZICI I PREVODIOCI 5


Lijeni programeri često čine dobre programere jer olakšavaju život sebi - a
dio olakšavanja života je osiguravanje toga što možete razumijeti ono što kôd
radi za godinu dana od pisanja. Jezik se dobro podvrgava šifriranju odozdo
prema gore. Poput izbora imena riječi, i ovo može biti mač s dvije oštrice. Ne
postoji zamjena za dobro cjelokupno oblikovanje programa, što se može
pravilno izvesti samo odozgo prema dolje. Dizajn i kodiranje odozdo prema
gore izvrsni su za istraživanje matica tehnologije, algoritama i interface-a
niske razine. Sposobnost interaktivnog stvaranja, testiranja i proizvodnje
radnog koda u ranom ciklusu je neprocjenjiva.
Rani radni kôd također pomaže da udovoljite šefu, a kupcima omogućuje
reagovanje i otkrivanje pogrešaka u specifikacijama prije nego što bude
prekasno. Pažljivo korištena ova karakteristika može vam uštedjeti mnogo
vremena. Kodiranje odozdo prema gore ima dodatnu prednost u tome što ga
je lako testirati s interpretatorom Fortha. Budući da ne možete koristiti riječ
sve dok nisu definisane sve njezine komponente, jednostavno testirate
aplikaciju redoslijedom izvornog koda. Svaka komponenta koju testirate
temelji se na prethodno testiranom kodu. Ovo je mnogo pouzdanija strategija
od testiranja pokretanjem dovršene aplikacije. Možda će vam biti korisno
proučiti izvorni kôd programa koji se nalaze u datotekama pomoću vašeg
Forth-a kao vodiča za stil. Stil je takav koji koristimo, a razvijao se kroz više
godina, a ne kroz bilo kakve teorijske argumente. Smatramo da ga mogu
koristiti i autori i oni koji moraju čitati tuđi kod. Pročitajte dokumentaciju
rječnika i provedite neko vrijeme isprobavajući funkcije i promatrajući
njihovo djelovanje na steku.

Prednosti i mane
• PONIŠTENJE KEŠA
• KOMBINOVANA INTERAKTIVNOST
• IMENOVANJE
• MALI HARDVERSKI ZAHJTEVI
• NEMODULARNOST
• BRZINA RADA

PROGRAMSKI JEZICI I PREVODIOCI 6


VIRTUALNA MAŠINA EFIKASNOST
Klasični ili kanonski Forth na svijet Budući da dual-stack procesori
gleda kao na CPU spojen na glavnu imaju vrlo malo registra, reakcija
memoriju i dva steka. Stekovi se ne prekida je izvrsna. RTX2000 od 10
mogu adresirati te su sasvim MHz ima prekidni odgovor od četiri
odvojeni od glavne memorije. ciklusa, 400 nsa, a vidjeli smo i video
C svijet vidi kao CPU spojen na aplikaciju s brzinom prekida od 1
memoriju, koji sadrži popis okvira MHz. Zbog toga se CPU-a s prividno
(obično hrpa okvira) koji moraju biti niskim taktima koriste u području
u memoriji koja se može adresirati. specijaliziranih aplikacija.

STEKOVI
Forth sadrži dva steka, jedan za Ova vrsta podataka uključuje
spremanje povratnih adresa i jedan ograničenja i indekse petlje, podatke
za pohranu podataka. Prvi se niz uklonjene s nizom podataka, da bi se
naziva povratni stek, a drugi se zove smanjila količina manipulacija sa
stek podataka ili parametara. stekom koja bi se inače dogodila.
Povratni paket sadrži povratne Postoji niz riječi koje se koriste za
adrese svih riječi koje su pozvane, prijenos podataka između skupina.
ali još nisu preostale. Povratni stek Stek podataka je učinkovita metoda
koristi se i za spremanje prijenosa podataka između riječi
privremenih podataka koji mogu ući koje čine program Forth. Svaka riječ
u put samo ako se zadrže u steku kojoj su potrebni podaci uzima se s
podataka. vrha steka i vraća rezultate na vrh
steka.

PROGRAMSKI JEZICI I PREVODIOCI 7


Budući da se stekovi koriste za obradu podataka, upotreba postfiksa ili
obrnute poljske notacije (RPN) vrlo je prikladna. U ovom obliku pisanja
aritmetičkih izraza, korišteni podaci dolaze pred operatore.
Upotreba zagrada postaje nepotrebna. To je zbog korištenja sloga za
postizanje prijelaznih rezultata. Iako je upotreba steka u početku
zastrašujuća, nakon nekog vremena postaje prirodno, a na kraju je to
primjetno samo u rijetkim prilikama. Skoro sve Forthove riječi uklanjaju
svoje podatke s vrha steka, a rezultat ostavljaju iza. Riječi poput + i * uklone
dvije stavke, a jednu ostave iza sebe. Postoji Forth riječ .S koja ispisuje
sadržaj steka bez uništavanja prethodnog sadržaja.

Tumačenje i sastavljanje
Forth sadrži i prevoditelja i tumača. Tumačenje znači preuzimanje unesenog
teksta, pretvaranje u obrazac koji mašina može izvršiti, izvršavanje tog
obrasca i odbacivanje izvršnog obrasca. Sažimanje znači uzimanje ulaznog
teksta, potpuno pretvaranje u mašinski izvršni obrazac, zadržavanje
izvršnog oblika i odbacivanje teksta. To može stvoriti program koji se
pokreće vrlo brzo, ali ne možete ništa promijeniti ako prvo ne uredite izvorni
tekst, zatim ga sastavite (koristeći zaseban program koji se zove kompajler),
a zatim učitate izvršni kod kada ga želite pokrenuti. Bilo koji tekst predan
Forthu, bilo s tastature ili s hard diska, izvršava se ili sastavlja. Zapamtite,
sve naredbe Forth-a unaprijed su definisane 'riječi' u njegovim "rječnicima",
te stoga Forth može potražiti adresu određene riječi za kasnije izvršavanje.
Neke riječi u Forthu mijenjaju način na koji prevoditelj razumije tekst. Na
primjer, mogli bismo definisati riječ koja daje kvadrat vrijednosti.

Radnja se izvršava od :. Ona govori odjeljku prevoditelja da započne s


definsanjem nove riječi čije ime slijedi (njenim adresiranjem također),
pomnoženo s kvadratom, a zatim da je sastavi u novu riječ radnje riječi koje
slijede. To bi se nastavljalo zauvijek, osim ako ga ne bismo zaustavili, a to
pružaju "neposredne" riječi poput ; koje se uvijek izvršavaju, bez obzira na to
šta bi prevoditelj inače radio. Djelovanje ; je da zaustavi prevodioca koji
sastavlja adrese riječi i vrati ga u način izvršenja adresa. Postoje i druge
riječi (definirajuće riječi) koje se koriste za stvaranje riječi kao što su : - ovo

PROGRAMSKI JEZICI I PREVODIOCI 8


je jedan od ključeva naprednog korištenja Forth-a. Međutim, u svakom se
trenutku sjetite da je osnova Fortha uvijek vrlo jednostavna. Forth je jezik
izgrađen iz više vrlo jednostavnih ideja, a ne jednog temelja na nekoliko
složenih sistema.

Faktoring
Faktoring je izraz koji programeri Fortha koriste za podjelu složenih funkcija
na nekoliko manjih. Ključna je aktivnost u pisanju dobrog Forth-a. To je
ujedno i ključni razlog zašto su dobro napisani programi Fortha manji od onih
napisanih na mnogim drugim jezicima. Forth potiče ponovnu upotrebu koda u
finoj granici. Zbog dvosmjerne virtuelne mašine, režimi za faktoriranje,
performanse i veličina koda su vrlo niski. Nadmašuju ih prednosti
jednostavne ponovne upotrebe koda, što poboljšava kompaktnost koda,
pouzdanost i održivost. Veličina koda je smanjena jer se kôd zove, a ne
ponavlja. Pouzdanost je poboljšana, jer je mali kod lakše testirati.
Održavanje se poboljšava ako je kôd jednostavan i pojavljuje se samo
jednom.
Ako se kôd pojavljuje samo jednom i nema nuspojava poput izmjene varijabli,
može se u potpunosti prepisati s pouzdanjem pod uvjetom da učinak steka
ostane isti.

PROGRAMSKI JEZICI I PREVODIOCI 9


Sintaksa Forth-a vrlo je jasna. Forth kod se tumači kao niz riječi razgraničenih
razmakom. Gotovo svi znakovi koji nisu whitespace vrijede da su riječi. Kada
interpretator Fortha pročita riječ, on provjerava postoji li definicija u unutrašnjoj
strukturi poznatoj kao Rječnik. Ako se pronađe, ta se definicija izvršava. Inače se
riječ pretpostavlja kao broj i ona se gura na stek. Ako se riječ ne može pretvoriti u
broj, dolazi do pogreške.
Backus-Naur forma (BNF) oznaka je za formalni opis programskih jezika. Iako se
najčešće koristi za određivanje sintakse "konvencionalnih" programskih jezika kao
što su Pascal i C, BNF je također vrijedan kod tumača naredbenog jezika i druge
obrade jezika.
Ovaj rad opisuje proširenje na jednom zaslonu Forth koje transformiše BNF izraze
u izvršne riječi Fortha. To daje Forthu sposobnost jednaku YACC ili TMG, za izradu
radnog parsera iz opisa jezika BNF

PROGRAMSKI JEZICI I PREVODIOCI 10


A small example:

Forthova fleksibilnost čini statičku BNF gramatiku neprikladnom i nema monolitni


prevodilac. Proširenje prevoditelja zahtijeva pisanje nove riječi, umjesto izmjene
gramatike i promjene temeljne implementacije.
"normalna" riječ je podprogram.
Ali, možete napisati korisničku riječ koja se definiše, a koja će promijeniti način na
koji prevoditelj radi. Na primjer, definicija obično započinje dvotačkom (":") i
završava tačkom-zarezom (";"). Ali ako želite, možete promijeniti ono što tačka-
zarez radi i u procesu promijeniti način na koji se definicija riječi "sastavlja",
mijenjajući na taj način prevodilac i mijenjajući gramatiku prepoznatljivog jezika.
Zbog toga se kaže da gramatika nije primjerena - gramatika se može doslovno
mijenjati iz jednog dijela programa u drugi. Učitavanje rječnika može promijeniti ne
samo potprograme čija su imena trenutno prepoznata, već i gramatiku koja se
razrađuje kada definišete novu riječ.

PROGRAMSKI JEZICI I PREVODIOCI 11


Definisanje riječi
Ako upišemo "foo" (nedefinisana riječ), trebali bismo vidjeti nešto slično:

znači da Forth nije mogao pronaći definiciju za foo i to nije valjan broj.
Možemo stvoriti vlastitu definiciju fooa pomoću dvije posebne riječi pod nazivom:
(dvotačka) i; (tačka i zarez). Dvotačka je naš način kazivanja Forth-u da želimo
stvoriti definiciju. Prva riječ nakon : postaje naziv definicije, a ostale riječi (do ;) čine
tijelo definicije. Uobičajeno je da između imena i tijela definicije postoje dva
razmaka. Također Forth je case-insensitive tako da riječi foo, FOO kao i FoO
pozivaju istu komandu. Pokušajte unijeti sljedeće:

Upozorenje: Česta je greška propustiti prostor prije ; . Budući da su riječi Fortha


ograničene prostorom i mogu sadržavati većinu znakova, +; savršeno je valjana
riječ i nije raščlanjena kao dvije odvojene riječi.
Kao što ste, nadamo se, shvatili da naša foo riječ jednostavno dodaje 100 vrijednosti
na vrhu steka. Nije jako zanimljivo, ali treba vam dati predstavu o tome kako rade
jednostavne definicije.

Rječnik
Rječnik sadrži sve izvršne rutine (ili riječi) koje čine Forthov sistem. Programske
rutine unosa su unaprijed definisane u rječniku i postaju dostupne pri pokretanju
sistema. Izborni materijali se po izboru sastavljaju nakon pokretanja sistema.
Korisnički definisane riječi su unosi koje korisnik dodaje. U konfiguraciji za više
korisnika sistemske, izborne definicije dostupne su svim korisnicima, dok su
korisnički definisane riječi dostupne samo korisniku koji ih definiše. Inače, nema
razlike u veličini, brzini ili strukturi. Korisničke riječi možete učiniti dostupnim
drugim korisnicima jednostavnim učitavanjem s ostalim izborima. Osnovni oblik tj.
najčešća vrsta definicije riječi je:

PROGRAMSKI JEZICI I PREVODIOCI 12


Gdje : konstruiše novu definiciju nazvanu ime, a završava se s ; .Kada se nazove
ime, izvršavat će se riječi u tijelu definicijskog imena. U Forthu postoje i druge vrste
riječi: riječi definisane u kodu alata, riječi koje djeluju kao objekti podataka itd. Sve
imaju stavke u rječniku, slične strukture i njima upravljaju ista interna pravila.
Rječnik je temeljni mehanizam kojim Forth raspoređuje memoriju i obavlja
operacije tablice simbola. Budući da rječnik služi u tolike svrhe, važno je da
razumijete kako se njime koristiti. Rječnik je povezani popis unosa varijabilne
dužine, od kojih je svaka riječ i njezina definicija. U većini implementacija rječnik
raste prema visokoj memoriji. Svaki unos u rječnik ukazuje na unos koji mu logično
prethodi.
Adresa sljedeće dostupne ćelije na kraju rječnika stavlja se na stek riječju HERE

Slika 1. "Vrh" rječnika. HERE vraća adresu sljedeće dostupne lokacije.


Upisi u rječniku nisu nužno povezani. Na primjer, u unakrsnim prevoditeljima koji
se koriste za izradu programa za ugradbene sisteme, dio rječnika (ime, veza i
pokazivač na sadržaj - vidi sliku 2) koji se može pretraživati može stajati u
računaru računara, a stvarni sadržaj može stajati u ciljanoj slici koja se izrađuje u
memoriji glavnog računara za kasnije preuzimanje ili spremanje u PROM.

Slika 2. Logička struktura Forth rječnika

PROGRAMSKI JEZICI I PREVODIOCI 13


Numerički unos
Riječ> NUMBER upotrebljava interpreter teksta za pretvaranje niza ASCII brojeva i
interpunkcija u binarne cijele brojeve koji se guraju na stek. Ako nema
interpunkcijske tačke (osim neobaveznog vodećeg znaka minus), niz valjanih
brojeva pretvara se u jedno-ćelijski broj, bez obzira na dužinu. Ako niz važećih
brojeva završi decimalnom tačkom, interpreter teksta pretvorit će ga u dvostruku
ćeliju (dvostruku preciznost) za broj, bez obzira na dužinu, zauzevši dva mjesta
skupa podataka (dio velikog reda na vrhu). U osmo-bitnim i 16-bitnim sustavima
jednocifreni cijeli broj širok je 16 bita, a dvostruki precizni cijeli broj 32 bita. U 32-
bitnim sistemima ove širine su 32, odnosno 64 bita. Na sistemima s opcijskom
rutinom, numerički nizovi koji sadrže E ili e (za eksponent) bit će pretvoreni u broj s
pomičnim zarezom koji zauzima jedno mjesto s nizom plutajućih tačaka.

Cjelovita preciznost i širina CPU podataka


Neki će sistemi, Forth interpretirati na način da bilo koji broj koji sadrži ugrađen
interpunkcijski znak vrijedi kao cijeli dvostruki precizni broj. Jednostruki precizni
brojevi prepoznaju se po nepostojanju posebne interpunkcijske tačke. Konverzije
djeluju na nizovima znakova sljedećeg formata:

gdje je dddd jedna ili više važećih znamenki prema trenutnoj bazi ili radix,
neučinkovitom za korisnika. Korisnička varijabla BASE (Vratite adresu ćelije koja
sadrži trenutni radijski broj pretvorbe) uvijek se koristi kao radix. Svi numerički
nizovi moraju biti završeni praznim ili povratnim kolicima (carriage return) . Ako se
nađe drugi znak - tj. , pojavit će se znak koji nije valjan znak u trenutnoj bazi, niti
interpunkcijski znak niti znak razmaka – tada mogu prekinuti. Unutar broja ne
smije biti razmaka.
Na sistemima koji omogućuju ugrađeni interpunkcijski znak, znakovi prikazani u
tablici dva mogu se pojaviti u broju. Vodeći znak minus, ako postoji, mora
neposredno prethoditi prvom znaku ili interpunkcijskom znaku.

PROGRAMSKI JEZICI I PREVODIOCI 14


Važeći numerički interpunkcijski znakovi
Svi interpunkcijski znakovi funkcionalno su ekvivalentni, uključujući razdoblje
(decimalna tačka). Interpunkcijski znak nema drugu funkciju osim postavljanja
zastave(flag) koja označava njegovu prisutnost. Na nekim sistemima
interpunkcijski znak također uzrokuje prebrojavanje znakova koje slijede nakon
njega, s brojem dostupnim sljedećim riječima pretvorbe broja. Više znakova
interpunkcije mogu biti sadržani u jednom broju; sljedeći nizovi znakova pretvorili
bi se u isti dvostruki precizni cijeli broj 123456:

PROGRAMSKI JEZICI I PREVODIOCI 15


Komande za manipulisanje stekom
Prvo, pogledajmo nekoliko riječi za manipuliranje elementima na vrhu steka.

dup je skračeno za "duplikat" - duplicira gornji element steka.

Daje rezultat:
<- Vrh steka

drop brise element na vrhu steka.

Daje rezultat:
<- Top

swap, zamjenjuje mjesta prva dva elemnta steka:

Daje rezultat:
<- Top

over uzima drugi element sa vrha steka i postavlja njegov dupikat na vrh steka:

Daje rezultat:
<- Top

PROGRAMSKI JEZICI I PREVODIOCI 16


Rot, rotira prva tri elementa sa vrha steka na sljedeci nacin:

Daje rezultat:
<- Top

Komentari
Komentari ugrađeni u jezgru Fortha nalaze se u zagradama. Na primjer:

Riječ mora imati razmak iza nje, tako da se može prepoznati i izvršiti kao naredba
(za početak komentara). Nije potreban razmak prije ograničavača desne zagrade
koji se zatvara. Na većini sustava znak \ (kosa crta) je također definisana, što
ukazuje da je cijeli ostatak trenutnog retka izvornog koda komentar.
Riječ (Imajte na umu prethodnu tačku) je poput ( ali započinje komentar koji će
se prikazati kad se nađe. Ako se dogodi unutar definicije, tekst će se prikazati kada
je definicija sastavljena, a ne kada se izvršava .Obično se koristi u izvornom kodu
za označavanje napretka u izvršavanju, npr .:

Forth komentari se najčešće upotrebljavaju za prikaz argumenata i rezultata


snopa riječi; na primjer, definicija riječi Forth na visokoj razini = je:

Crtice u komentaru razdvajaju argumente riječi (slijeva) od njegovih rezultata.


Prema konvenciji, određena slova imaju specifična, zajednička značenja
kao npr. ima značenje jednoćelijskog potpisanog cijelog broja a
ima značenje booleove vrijednosti s jednom ćelijom (nula je lažna, ne-nula je
istina).
Dakle, u gornjem primjeru, riječ = očekuje dva jednocelična cijela broja i vraća
zastavu istine (true ili false).

PROGRAMSKI JEZICI I PREVODIOCI 17


Stvaranje izlaza
Sada ćemo vidjeti neke riječi koje ispisuju text na ekran.

Najjednostavniji ispis u Forthu je .. Možemo koristiti . da ispišemo vrh steka u istoj


liniji. Na primjer:

Rezultat daje:

Prolazeći ovim redoslijedom, gurnemo 1, zatim ga iskočimo i izlažemo. Tada radimo


isto s 2 i 3. Dalje guramo 4, 5 i 6 na hrpu. Zatim ih iskočimo i objavljujemo jedan po
jedan. Zato su obrnuta posljednja tri broja u izlazu: snop je zadnji, prvi.

emit može se koristiti za ispis brojeva kao ascii znakova. Baš kao . izlazi broj na
vrhu snopa, emitira izlaze tog broja kao ascii znak. Na primjer:

Što daje rezultat:

Za razliku od., emit ne daje nikakav prostor nakon svakog znaka, omogućujući vam
da izgradite proizvoljne nizove izlaza.

cr je skračeno za povratak kočije – jednostavno daje izlaz u novoj liniji:

Daje rezultat:

PROGRAMSKI JEZICI I PREVODIOCI 18


Konačno imamo ." - posebna riječ za ispis stringa. Riječ ." djeluje različito unutar
definicija na interaktivni način ." označava početak niza za izlaz, a kraj niza označen
je sa " . Završna riječ " nije riječ, pa ne treba biti ograničena na prostor. Evo
primjera:

Rezultat je:

Uvjeti i petlje
Forth, kao i većina drugih jezika, ima uvjete i petlje za kontrolu protoka vašeg
programa. Da bismo shvatili kako oni funkcioniraju, prvo moramo razumjeti
booleans u Forthu.

Booleans
U Forthu zapravo ne postoji logični tip. Broj 0 tretira se kao lažni, a bilo koji drugi
broj je istinit, mada je kanonska stvarna vrijednost -1 (svi logički operateri vraćaju
0 ili -1).
Za provjeru da li su dva broja jednaka koristimo :

Ovo daje rezultat:

Možete koristiti i za manje i veće od. provjerava je li druga stavka na vrhu


steka manja od gornje stavke steka i obrnuto za :

PROGRAMSKI JEZICI I PREVODIOCI 19


Boolean operatori And, Or, i Not se pišu kao and, or, i invert:

Prvi redak jednak je 3 <4 i 20 <30 u jeziku koji se temelji na C. Drugi redak je
ekvivalent 3 <4 | 20> 30. Treći redak jednak je! (3 <4).
and, or, i invert sve su bitne operacije. Za dobro oblikovane zastave (0 i -1) oni će
raditi kako se očekuje, ali će dati pogrešne rezultate za proizvoljne brojeve.

IF THEN
Sada napokon možemo doći do uvjeta. Uvjeti u Forthu mogu se koristiti samo
unutar definicija. Najjednostavnija uvjetna izjava u Forthu je IF THEN, što je
ekvivalentno standardu IF izjava u većini jezika. Evo primjera definicije koja
upotrebljava IF i THEN. U ovom primjeru također koristimo mod, koja vraća modul
gornja dva broja na steku. U ovom slučaju, gornji broj je 5, a drugi je ono što je bilo
postavljeno na stek prije nego što pozovete buzz ?. Stoga je 5 mod 0 = boolov izraz
koji provjerava je li vrh steka djeljiv sa 5.

Rezultat:

Važno je napomenuti da THEN označava kraj izjave IF. Na primjer, to ga čini


ekvivalentnim fi u Bashu ili end u Rubyju.
Još jedna važna stvar koju treba shvatiti je da IF troši najveću vrijednost na steku
kada provjeri je li istinita ili lažna.

PROGRAMSKI JEZICI I PREVODIOCI 20


IF ELSE THEN
IF ELSE THEN izjava je ekvivalentna IF / ELSE u većini jezika. Evo primjera njegove
upotrebe:

Izlaz:

Ovog puta IF klauza je sve između IF i ELSE, a ELSE klauza je sve između ELSE i
THEN.

DO LOOP
DO petlja u Forthu najviše nalikuje na FOR petlju za većinu jezika temeljenih na C. U
tijelu DO petlje, posebna riječ i gura trenutni indeks petlje na stek.
Gornje dvije vrijednosti na steku daju početnu vrijednost (uključivo) i završnu
vrijednost (ekskluzivno) za vrijednost i. Početna vrijednost uzima se s vrha steka.
Evo primjera:

PROGRAMSKI JEZICI I PREVODIOCI 21


Izraz je otprilike slican ovome:

Varijable i konstante
Forth vam također omogućuje spremanje vrijednosti u varijabli i konstanti.
Varijable vam omogućuju da pratite promjene vrijednosti bez potrebe da ih
pohranjujete u stek. Konstante vam daju jednostavan način navođenja vrijednosti
koja se neće promijeniti.

Varijable
Budući da ulogu lokalnih varijabli uglavnom igra stek, varijable u Forthu se više
koriste za spremanje stanja koje će možda biti potrebno u više riječi.
Definisanje varijabli je veoma jednostavno:

To u osnovi povezuje određenu memorijsku lokaciju s riječi .


je sada riječ, a sve je samo da gurne svoje memorijsko mjesto na
gomilu:

Na hrpi biste trebali vidjeti vrijednost 1000. Ova Forth implementacija proizvoljno
započinje spremanje varijabli na memorijsku lokaciju 1000.
Riječ ! pohranjuje vrijednost na memorijskoj lokaciji na koju se odnosi varijabla, a
riječ @ preuzima vrijednost s memorijskog mjesta:

PROGRAMSKI JEZICI I PREVODIOCI 22


Ovaj put trebali biste vidjeti vrijednost 123 na steku. 123 balance gura vrijednost i
memorijsku lokaciju na stek, ! pohranjuje vrijednost na toj memorijskoj lokaciji.
Isto tako, @ uzima vrijednost na temelju memorijske lokacije i gura tu vrijednost na
stek. Ako ste upotrebljavali C ili C ++, možete smatrati pokazivačem
koji se dereferencira sa @.
Riječ ? je definisana kao @. i ona ispisuje trenutnu vrijednost varijable. Riječ +!
koristi se za povećanje vrijednosti varijable za određeni iznos (kao što je + = u
jezicima koji se temelje na C).

Ovaj kod daje rezultat:

PROGRAMSKI JEZICI I PREVODIOCI 23


Konstante
Ako imate vrijednost koja se ne mijenja, možete je pohraniti kao konstantu.
Konstante su definisane u jednom redu, kao što je ovaj:

Ovo stvara novi konstantni answer s vrijednošću 42. Za razliku od varijabli,


konstante predstavljaju samo vrijednosti, a ne memorijske lokacije, tako da nema
potrebe za upotrebom @.

Ako ovo pokrenete, vrijednost 84 gura se na stek.


answer se tretira kao da je to broj koji on predstavlja (baš kao što su konstante i
varijable u drugim jezicima).

Nizovi
Forth ne podržava tačno nizove, ali vam omogućuje da dodijelite područje
međusobne memorije, slično poput nizova u C. Da biste dodijelili ovu memoriju,
upotrijebite riječ.

Ovaj primjer stvara memorijsku lokaciju zvanu brojevi i zadržava tri dodatne
memorijske ćelije nakon ove lokacije, dajući ukupno četiri memorijske ćelije.
(ćelije se množe samo sa širinom ćelije, što je u ovoj implementaciji 1)
numbers 0 + daje adresu prve ćelije u nizu. 10 numbers 0 +! pohranjuje vrijednost 10
u prvu ćeliju niza.

PROGRAMSKI JEZICI I PREVODIOCI 24


Lako možemo pisati riječi radi pojednostavljenja pristupa nizu:

preuzima pomak u i vraća memorijsku adresu u tom


pomaku.
pohranjuje 30 za pomak 2 u ,a
ispisuje vrijednost na pomak 2 u .

Unos sa tastature
Forth ima posebnu riječ koja se zove , a koja se koristi za prihvaćanje unosa s
tastature. Kad se izvrši riječ , izvršenje se zaustavlja dok se ne pritisne tipka.
Nakon pritiska na tipku, kôd te tipke se gura na stek.
Ovaj kod radi sljedeće:

Kada pokrenemo ovaj kod nista se ne dešava. To je zato što tumač čeka na unos
vaše tastature. Kada pritisnemo A, broj 65 se pojavljuje sto je njegova ASCII
vrijednost. Isto vrijedi i za B(66) i za C(67) i trebalo bi izgledati ovako:

PROGRAMSKI JEZICI I PREVODIOCI 25


Tip podataka identificira skup dopuštenih vrijednosti za podatkovni objekt. To
nije svojstvo određenog mjesta za pohranu ili položaja na steku. Pomicanje
objekta s podacima ne utječe na njegovu vrstu.
Forth ne zahtijeva provjeru vrste podataka. Dvoumno stanje postoji ako se
nađe pogrešno uneseni objekt podataka.

Notacija Opis
byte 8-bitna vrijednost
cell Fiksna veličina ćelije definisana implementacijom određena je u
adresnim jedinicama i odgovarajućem broju bita. Elementi skupa
podataka, elementi povratnog steka, adrese, izvršni tokeni, zastave i
cijeli brojevi su jedna ćelija.

Veličina ćelije može varirati između implementacija. 32-bitna


implementacija ima veličinu ćelije 4. 64-bitna implementacija ima
veličinu ćelije 8.
doublet 16-bitna vrijednost
octlet 64-bitna vrijednost; samo za 64-bitne sisteme
quadlet 32-bitna vrijednost
Definicije tipa podataka

Komanda Stek dijagram Opis


bljoin ( b.low b2 b3 b.hi -- quad ) Spaja 4 bita u quadlet
bwjoin ( b.low b.hi -- word ) Spaja dva bita u doublet
lbflip ( quad1 -- quad2 ) Obrce bytove u quadletu
lbsplit ( quad -- b.low b2 b3 b.hi ) Razdvaja quadlet u 4 byte
lwflip ( quad1 -- quad2 ) Zamjenjuje doublete u quadlet
lwsplit ( quad -- w.low w.hi ) Razdvaja quadlet u 2 doubleta
wbflip ( word1 -- word2 ) Zamjenjuje bytove u doubletu
wbsplit ( word -- b.low b.hi ) Razdvaja doublet u 2 byte
wljoin ( w.low w.hi -- quad ) Spaja dva doubleta u quadlet
32-bitne funkcije pretvorbe tipa podataka

PROGRAMSKI JEZICI I PREVODIOCI 26


Komanda Stek dijagram Opis
bxjoin ( b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi -- o ) Spaja 8 bytova u octlet
lxjoin ( quad.lo quad.hi -- o ) Spaja dva quadleta u octlet
wxjoin ( w.lo w.2 w.3 w.hi -- o ) Spaja 4 doubleta u octlet
xbflip ( oct1 -- oct2 ) Zamjenjuje bytove u octletu
xbsplit ( o -- b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi ) Razdvaja octlet u 8 bytova
xlflip ( oct1 -- oct2 ) Zamjenjuje quadlete u octletu. Bytovi
u octletima se ne zamjenjuju
xlsplit ( o -- quad.lo quad.hi ) Razdvaja octlet u dva quadleta
xwflip ( oct1 -- oct2 ) Zamjenjuje doublete u octletu. Bytovi
u doubletima se ne mijenjaju.
xwsplit ( o -- w.lo w.2 w.3 w.hi ) Razdvaja octlet u 4 doubleta
64-bitne funkcije pretvorbe tipa podataka

Sažima tipove podataka (korisnički napravljenih) koji se koriste u većini


standarda. Višestruki slučajevi iste vrste u opisu definicije sufiksirani su
pretplatnikom s nizom znakova koji ih razlikuju.

Notacija Tip podatka Veličina (Forth tip)


flag flag 1 cell
true true flag 1 cell
false false flag 1 cell
char character 1 cell
n signed number 1 cell
+n non-negative number 1 cell
u unsigned number 1 cell
u|n number 1 cell
x unspecified cell 1 cell
xt execution token 1 cell
addr address 1 cell
a-addr aligned address 1 cell
c-addr character-aligned 1 cell
address

PROGRAMSKI JEZICI I PREVODIOCI 27


ior error result 1 cell
d double-cell signed 2 cells
number
+d double-cell non-negative 2 cells
number
ud double-cell unsigned 2 cells
number
d | ud double-cell number 2 cells
xd unspecified cell pair 2 cells
colon-sys definition compilation implementation
dependent
do-sys do-loop structures implementation
dependent
case-sys CASE structures implementation
dependent
of-sys OF structures implementation
dependent
orig control-flow origins implementation
dependent
dest control-flow implementation
destinations dependent
loop-sys loop-control parameters implementation
dependent
nest-sys definition cells implementation
dependent
i * x, j * x, k * x any data type 0 or more cell

PROGRAMSKI JEZICI I PREVODIOCI 28


PROGRAMSKI JEZICI I PREVODIOCI 29
PROGRAMSKI JEZICI I PREVODIOCI 30
PROGRAMSKI JEZICI I PREVODIOCI 31
o A BNF PARSER IN FORTH, Bradford J. Rodriguez
o Forth Programmer’s Handbook, Edward K. Conklin,
Elizabeth D. Rather and the technical staff of FORTH, Inc.,
Copyright © 1997, 1998 by FORTH, Inc. All rights reserved.
o THINKING FORTH, Leo Brodie,
c 1984, 1994, and 2004 by Leo Brodie, version 1.0
o Programming Forth, Stephen Pelc, Copyright (c) 2003,
2004, 2005, MicroProcessor Engineering Limited
o Forth-Standard.org
https://forth-standard.org/standard/usage#section.3.1
o Easy Forth by Nick Morgan
https://skilldrick.github.io/easyforth
o Forth.com
o Sudoku puzzle solver, Jorge Acereda

PROGRAMSKI JEZICI I PREVODIOCI 32

You might also like