08-04-2015, 08:43 PM
Onda da pocnemo sa jednim kratkim kursom za programski jezik Forth.
Pisem ga iz glave i cini mi se da je sasvim prikladno da ima 4 dela.
Samo za apsolutne pocetnike!
Programski jezik Forth -- P R V I D E O -- Osnovne strukture podataka
Forth ima samo jedan podatkovni tip. Ovaj tip se zove cell ili celija. Celija moze imati jednu ili vise adresibilnih jedinica zavisno od masine na kojoj se izvrsava. Na primer ako je adresibilna jedinica bajt a Forth sistem je 32-bit onda je cell ravno 4. Postoje masine koje imaju cell = 1 ali u tom slucaju adresibilna jedinica je obicno veca od jednog bajta jer 8-bitni Forth sistem ne bi imao smisla. Obicno je tada adresibilna jedinica 16-bit rec ili 32-bit rec, jednostavno receno sistem moze da adresira samo na granicama od 2 ili 4 bajta poravnato.
Generalno gledano jedna celija predstavlja osnovnu jedinicu skladistenja podatka. Da bi se fleksibilnost povecala neki sistemi takodje pruzaju pristup delovima celije ako su adresibilni te se tako na primer moze pristupiti visem bajtu ili nizem bajtu u 16-bit sistemu.
1. Varijable ------------------------------------------
Varijabla se u Forth sistemu definise na sledeci nacin:
variable test \ U C-u to izgleda ovako: unsigned int test
Sada se variable moze koristiti us istemu na sledeci nacin:
10 test ! \ C ekvivalent: test = 10
Fort je stek orijentisani jezik i sve operacije se obavljaju na steku. Da bi se uspesno izvrsila neka operacija operandi moraju vec biti na steku.
Na primer:
1 2 + \ Ovo parce koda ce staviti na vrh steka 1 potom ce gurnuti na vrh broj 2 i izvrsiti operaciju sabiranja. Sabiranje ce uzeti prvi (br: 2) i sledeci (br: 1) sa steka sabrati ih i ostaviti rezultat (br: 3) na vrhu steka.
Oduzimanje? U ovom slucaju se uvek oduzima prvi element od drugog, dakle 1 2 - daje rezultat -1.
Kako videti sadrzaj steka? Komanda .s stampa sadrzaj steka nedestruktivno, na primer:
1 2 .s
ok je uobicajeni interaktivni prompt sistema. On se stampa kada je ulazni tekstualni bafer iscrpljen i sistem ceka dalje komande.
ok-2 znaci da je preostalo jos dva elementa na steku. Ovkav tip inikacije je nestandardan i na razlicitm sistemima se moze videti drugaciji prompt kada je nesto ostalo na steku.
Vrh steka se lako moze destruktivno odstampati na sledeci nacin:
1 .
Tacka ce odstampati 1 u ovom slucaju i nista nece ostati na steku, pod time mislim destruktino odstampati.
Sada mozemo korisiti varijable na sledeci nacin.
Citanje varijable:
test @ . \ Ovaj kod bi trebalo da odstampa 10 imajuci u vidu gore navedeni primer skladistenja u varijablu test.
kucanjem imena varijable na stek se stavlja njena adresa a rec @ dohvata varijablu i stavlja je na vrh steka umesto njene adrese.
Inkrementiranje varijable se obavlja na sledeci nacin:
test @ 1+ test ! \ Ovde je jasno da prvo dohvatamo varijablu test a potom uvecavamo za jedan pozivanjem reci 1+ ili ( 1 + ) i potom storniramo novu vrednost u varijablu test.
1 test +! \ Ovo je kraci nacin na se inkrementira varijabla. Rec +! sabira trenutnu vrednost varijable test sa drugim elementom na steku
2. Konstanta --------------------------------------------
Konstanta je brojka asocirana sa imenom. Definise se na sledeci nacin:
10 constant deset
Sada ako u kodu koristimo deset to je kao da smo otkucali 10. Na vrhu steka ce se pojaviti 10.
Konstanta deset nije promenljiva, tj to je finalizovana vrednost.
3. Vrednosti --------------------------------------------
Vrednost je nesto izmedju konstante i varijable. Na isti nacin se cita kao konstanta ali ima specijalni nacin za upis (promenu vrednosti)
1 value vr
Citanje vrednosti:
vr 1 + . \ Ovaj izraz stampa broj 2
Upis u vrednost:
2 to vr \ Ovaj izraz postavlja vrednost vr na 2.
vr 1 + . \ Ovaj izraz sada stampa 3.
4. Komentari --------------------------------------------
Kao sto ste vec verovatno primetili rec \ je linijiski komentar i sve sto se nadje iza ovog simbola se ignorise.
Vrlo je vazno da ne zaboravite space iza slash karaktera.
Forth poseduje jos jedan mehanizam za komentare a to su zagrade. sve sto je u zagradama je ( komentar). Obrati paznju na space pre reci komentar!
5. Matematika, postfix
Postfix je efikasan nacin da se nesto izracuna bez zagrada i problema oko prioriteta operatora. Takodje ova notacija je veoma prirodna i bliska coveku evo zasto:
Kada zelite da saberete dva broja prvo morate da imate brojeve a potom ih sabirate kao u skoli:
123
101
-----
+224
Veoma je tesko to uraditi ovako (123 + 101) a pogotovo ako ste kompjuter
Postfix notacija se veoma puno koristila za HP inzenjerske kalkulatore. A i danas se koristi kao medju jezik izmedju parsera i generatora koda. Glavni razlog je upravo jednostavnost obrade od strane kompjutera.
Da bismo konvertovali infix izraz u postfix izraz potrebno je samo pomeriti operatore za jedno mesto udesno. Primer:
Infix: (12 + 4)*3 - 5
Postfix: 12 4 + 3 * 5 -
Voila, bez zagrada!
Mislim da ste sada spremi da se poigrate u interktivnom terminalu. Mozete skinuti jedan o otvorenih Forth sistema gForth ili Win32For i istrazite varijable i postfix.
Uskoro deo 2: kontrolne strukture.
Pozdrav,
M.
PS Ako je nesto nejasno ili lose prikazano molim ukazite.
Pisem ga iz glave i cini mi se da je sasvim prikladno da ima 4 dela.
Samo za apsolutne pocetnike!
Programski jezik Forth -- P R V I D E O -- Osnovne strukture podataka
Forth ima samo jedan podatkovni tip. Ovaj tip se zove cell ili celija. Celija moze imati jednu ili vise adresibilnih jedinica zavisno od masine na kojoj se izvrsava. Na primer ako je adresibilna jedinica bajt a Forth sistem je 32-bit onda je cell ravno 4. Postoje masine koje imaju cell = 1 ali u tom slucaju adresibilna jedinica je obicno veca od jednog bajta jer 8-bitni Forth sistem ne bi imao smisla. Obicno je tada adresibilna jedinica 16-bit rec ili 32-bit rec, jednostavno receno sistem moze da adresira samo na granicama od 2 ili 4 bajta poravnato.
Generalno gledano jedna celija predstavlja osnovnu jedinicu skladistenja podatka. Da bi se fleksibilnost povecala neki sistemi takodje pruzaju pristup delovima celije ako su adresibilni te se tako na primer moze pristupiti visem bajtu ili nizem bajtu u 16-bit sistemu.
1. Varijable ------------------------------------------
Varijabla se u Forth sistemu definise na sledeci nacin:
variable test \ U C-u to izgleda ovako: unsigned int test
Sada se variable moze koristiti us istemu na sledeci nacin:
10 test ! \ C ekvivalent: test = 10
Fort je stek orijentisani jezik i sve operacije se obavljaju na steku. Da bi se uspesno izvrsila neka operacija operandi moraju vec biti na steku.
Na primer:
1 2 + \ Ovo parce koda ce staviti na vrh steka 1 potom ce gurnuti na vrh broj 2 i izvrsiti operaciju sabiranja. Sabiranje ce uzeti prvi (br: 2) i sledeci (br: 1) sa steka sabrati ih i ostaviti rezultat (br: 3) na vrhu steka.
Oduzimanje? U ovom slucaju se uvek oduzima prvi element od drugog, dakle 1 2 - daje rezultat -1.
Kako videti sadrzaj steka? Komanda .s stampa sadrzaj steka nedestruktivno, na primer:
1 2 .s
ok je uobicajeni interaktivni prompt sistema. On se stampa kada je ulazni tekstualni bafer iscrpljen i sistem ceka dalje komande.
ok-2 znaci da je preostalo jos dva elementa na steku. Ovkav tip inikacije je nestandardan i na razlicitm sistemima se moze videti drugaciji prompt kada je nesto ostalo na steku.
Vrh steka se lako moze destruktivno odstampati na sledeci nacin:
1 .
Tacka ce odstampati 1 u ovom slucaju i nista nece ostati na steku, pod time mislim destruktino odstampati.
Sada mozemo korisiti varijable na sledeci nacin.
Citanje varijable:
test @ . \ Ovaj kod bi trebalo da odstampa 10 imajuci u vidu gore navedeni primer skladistenja u varijablu test.
kucanjem imena varijable na stek se stavlja njena adresa a rec @ dohvata varijablu i stavlja je na vrh steka umesto njene adrese.
Inkrementiranje varijable se obavlja na sledeci nacin:
test @ 1+ test ! \ Ovde je jasno da prvo dohvatamo varijablu test a potom uvecavamo za jedan pozivanjem reci 1+ ili ( 1 + ) i potom storniramo novu vrednost u varijablu test.
1 test +! \ Ovo je kraci nacin na se inkrementira varijabla. Rec +! sabira trenutnu vrednost varijable test sa drugim elementom na steku
2. Konstanta --------------------------------------------
Konstanta je brojka asocirana sa imenom. Definise se na sledeci nacin:
10 constant deset
Sada ako u kodu koristimo deset to je kao da smo otkucali 10. Na vrhu steka ce se pojaviti 10.
Konstanta deset nije promenljiva, tj to je finalizovana vrednost.
3. Vrednosti --------------------------------------------
Vrednost je nesto izmedju konstante i varijable. Na isti nacin se cita kao konstanta ali ima specijalni nacin za upis (promenu vrednosti)
1 value vr
Citanje vrednosti:
vr 1 + . \ Ovaj izraz stampa broj 2
Upis u vrednost:
2 to vr \ Ovaj izraz postavlja vrednost vr na 2.
vr 1 + . \ Ovaj izraz sada stampa 3.
4. Komentari --------------------------------------------
Kao sto ste vec verovatno primetili rec \ je linijiski komentar i sve sto se nadje iza ovog simbola se ignorise.
Vrlo je vazno da ne zaboravite space iza slash karaktera.
Forth poseduje jos jedan mehanizam za komentare a to su zagrade. sve sto je u zagradama je ( komentar). Obrati paznju na space pre reci komentar!
5. Matematika, postfix
Postfix je efikasan nacin da se nesto izracuna bez zagrada i problema oko prioriteta operatora. Takodje ova notacija je veoma prirodna i bliska coveku evo zasto:
Kada zelite da saberete dva broja prvo morate da imate brojeve a potom ih sabirate kao u skoli:
123
101
-----
+224
Veoma je tesko to uraditi ovako (123 + 101) a pogotovo ako ste kompjuter
Postfix notacija se veoma puno koristila za HP inzenjerske kalkulatore. A i danas se koristi kao medju jezik izmedju parsera i generatora koda. Glavni razlog je upravo jednostavnost obrade od strane kompjutera.
Da bismo konvertovali infix izraz u postfix izraz potrebno je samo pomeriti operatore za jedno mesto udesno. Primer:
Infix: (12 + 4)*3 - 5
Postfix: 12 4 + 3 * 5 -
Voila, bez zagrada!
Mislim da ste sada spremi da se poigrate u interktivnom terminalu. Mozete skinuti jedan o otvorenih Forth sistema gForth ili Win32For i istrazite varijable i postfix.
Uskoro deo 2: kontrolne strukture.
Pozdrav,
M.
PS Ako je nesto nejasno ili lose prikazano molim ukazite.