Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Forth, za one sa razlčitim rasporedom vijuga...
#1
Neću previše pričati o Forth.

Ne treba ga mešati sa Fortran, nema nikave veze sa njim, nije ni nalik.

Dovoljno će biti to da znate da se kod može editovati i testirati za vrema dok MCU radi svoj "posao", potom pomoću par naredbi sa terminala upisati u fleš ako vam odgovara, takođe dok radi.
Može se na primer u eksternoj memoriji držati dva-tri različita operativna Forth sistema i u "letu" zameniti jedan drugim...

Ne zavisite više ni od čijeg razvojnog okruženja i alata, sve može biti potpuno vaše.

Forth sistem se implementira u sam MCU, u nekoliko kilobajta prostora. Tu se nalazi operativni sistem i kros kompajler, ostatak memorije je i više nego dovoljan za veoma složene zahteve.

Sam MCU postaje kompletno razvojno okruženje ili izvršna naprava, kako god...

Možete biti sve vreme povezani terminalom sa MCU i "čačkati" po svemu dok MCU radi, sve vam je pod apsolutnom kontrolom do poslednjeg bita u MCU i do bilo koje lokacije bilo kog memorijskog prostora na MCU.

Forth može prekompajlirati i samog sebe, a po vašoj želji.
Možete u svakom trenutku napraviti sopstveni Forth, samo vama razumljiv, a možete koristiti i ANSI forth.

Ukratko, neverovatna fleksibilnost i mogućnosti, brzina bliska brzini nečeg pisanog u asm, takođe i količina zauzetog prostora u flešu.
Sami sve možete praviti od prapočetaka do neverovatno složenih sistema.

Editor može biti notepad ili bilo šta slično, potom tekst iskopirate u terminal i "plunete" u MCU.

Nema ograničenja, istovremeno je tik iznad asm, takođe i vrlo visok nivo pisanja, od kontrole orijentacije pina do lansiranja nečeg u svemir.
Meta-jezik koji se proteže od najnižeg do najvišeg nivoa pisanja.
Njegova osnovna jedinica je REČ, to je službeno ime. REČ može biti definicija jednog bita u memoriji, a može biti i definicija čitavog procesa koji sadrži mnogo objekata.

Funkcija u C može vratiti samo jednu vrednost, dok u Forth povratak iz REČI (događaja) može vratiti neograničen broj podataka, do nivoa količine stack memorije, a tu je skoro sva memorija stack :-)

I ako mislite da nije rasprostranjen i komercijalan, Forth sve vreme "tutnji" ispod vaših Windows, Linux, OSX.., kontrolišući najbrže delove vašeg hardvera. Tu je ali ga ne vidite.

Forth je jednostavno način razmišljanja, filozofija svoje vrste.

Nije za lenje već za entuzijaste. Krije neograničenu moć.

Zahtevan je na početku, posle svemoćan. Traži potpun preokret u načinu razmišljanja, i dok se ne nauči baš dosta rada, potom postaje vrlo superioran i ekstremno zahvalan alat, sa kojim se neverovatno elegantno i lako radi.

Maksimum mogućnosti će pokazati na specijalizovanim stack procesorima, ali i na običnim PIC MCU sjajno radi.
Na stack procesorima parira brzinom i složenošću zadataka, dvostruko bržem standardnom MCU.

Zaslužuje veoma posebno mesto u programerskom svetu. Takođe pripada programerima koji se razlikuju...

Nije komercijalan zato što programer može korisnika učiniti zavisnim, kao od kiseonika, do te mere da mu niko ne sme dati otkaz, a to se gazdama ni malo ne sviđa... Jedino je tu poenta nekomercijalnosti.

Rado ga koristi vojska i aero-space institucije, zbog vanseriskih mogućnosti on-line testiranja i izmena koda.

Dovoljno će biti tri-četiri linka da ne gušim dalje. Kog bude zainteresovalo tu će sve potrebno naći:

http://punchandbrodie.com/leo/forth.html

http://en.wikipedia.org/wiki/Forth_%28pr...anguage%29

http://web.archive.org/web/2011071616303...ilers.html

http://web.archive.org/web/2011072407422...forge.net/

Pozz
Reply
#2
Da, Forth je nesto totalno posebno u programerskom svetu.

Glavna stvar je ta sto Forth moze da bude istovremeno i interpreter (kao sto je spomenuto, da se odmah iz terminala izvrsi neka rec) i kompajler (napisete program koji se prevede u masinski jezik).

Takodje je zanimljivo da se ceo Forth moze napisati u "samom sebi". Recimo potrebno je napraviti desetak reci koje su napisane u ASM i sve ostalo se posle kombinuje od tih reci i prave slozenije funkcije. Svi ostali jezici, i interpreteri i kompajleri, moraju da imaju mnogo vecu bazu/osnovu koja je pisana u ASM i zato se Forth moze maksimalno optimizovati za neku konkretnu CPU platformu ili specificnu aplikaciju.

Zbog takve male baze koja je potrebna za osnovne funkcije (reci), veoma je lako Fort portovati na druge platforme ili ga emulirati sa nekim drugim jezicima poput JavaScript Smile

Evo jedan zanimljiv online primer "zivog" Forth interpretera napisanog u JavaScript, probajte ...
http://forthfreak.net/jsforth80x25.html

---

@Macola Treba negde da iskopamo Zokijev Forth za PIC16C84 i da psotavimo ovde HEX da moze neko da proba i da se igra sa tim.
Prosto neverovatno kako to moze lepo da radi, interaktivni terminal i to sve u manje od 1kB memorije!!!
Reply
#3
Evo, setih se stare teme.

Nađoh neki youtube primer interaktivnog rada u Forth sa Arduino.
Nije bitno što nije PIC, sve to isto tako može i PIC.

https://www.youtube.com/watch?v=M-Xt1ShKW3c
Reply
#4
Imao bi tu što šta da kaže naš član mveselic koji je napravio svoj pravi pravcati Forth stack procesor, tj. čitav Forth kompjuter.

Baš bih voleo da prezentuje mogućnosti svog moćnog "Frog" :-). Mislim da je stigao do četvrte generacije svog "Frog" a možda i dalje od tog.

Čekamo te Mlađo :-)
Reply
#5
http://www.forth.org/
http://flashforth.com/
Reply
#6
(10-22-2014, 10:13 AM)mikikg Wrote: @Macola Treba negde da iskopamo Zokijev Forth za PIC16C84 i da psotavimo ovde HEX da moze neko da proba i da se igra sa tim.
Prosto neverovatno kako to moze lepo da radi, interaktivni terminal i to sve u manje od 1kB memorije!!!

Cao Miki,

Zoki je koristio FlashForth, Macola je dao link u nekom od postova nize. U medjuvremenu FlashForth je unapredjen i podrzava vise procesora. Mislim da mu treba malo vise memorije nego sto si pomenuo.
Lepo si rekao, Forth je interpereter i kompajler. Mozda je potrebno malo detaljnije objasniti sta to znaci.

Da razjasnim prvo deo vezan za interpreter.
Kada se kaze interpreter onda se obicno misli na izvrsavanje byte koda od strane virtuelne masine. Virtuelna masina mora da postoji jer se primitive jezika ne mogu izvrsavati na RISC arhitekturi. Sve implementacije Forth sistema imaju virtuelnu masinu ili virtuelno okruzenje koje abstrahuje RISC arhitekturu i prilagodjava je jeziku Forth.
Medjutim Forth takodje ima i takozvani spoljasnji interpreter ili tekstualni interpreter koji prihvata tekst iz nekog izvora i kompajlira ga ili interpretira.

Posto sam pomenuo kompajler bilo bi dobro da i o njemu reci nekoliko reci. Spoljasnji interpreter moze zavisno od svog stanja ili da koristi cisto interpretiranje teksta (izvrsavanje) ili da kompajlira kod za kasnije izvrsavanje. Kompajler je uvek dostupan i moguce je kompajlirati za vreme interpretiranja a takodje i interpretirati za vreme kompajliranja.
Ovo daje posebnu moc sistemu jer posle nekog vremena programer tipicno razvije svoj dodatak jeziku ili kako se to kaze domenski jezik koji na najefikasniji nacin opisuje applikaciju.

Dakle jezik je prosiriv, i interaktivan, radi u okviru run-time okruzenja ili virtuelne masine, ima iregularnu gramatiku i postfix notaciju. Ovo svakako nije mainstream jezik kao sto je Macola i pomenuo ali se jako puno koristi medju hobistima, na univerzitetima i u svemirskim istrazivanjima. Kolicina memorije koja je potrebna za funkcionalan sistem je mnogo manja u usporedbi sa ostalim programskim jezicima kod koje se generise je kompaktan i ceo jezik je jednostavan za razumevanje.

Macola je postovao odlican video koji lepo demonstrira tipican Forth sistem. Lepo se vide razlicite funkcionalnosti kao sto su interpretiranje, kompajliranje novih definicija i multithreading. Sve je to svetlosnim godinama ispred bilo kog modernog C kros kompajlerskog sistema, udobnije i fleksibilnije za rad.

Ako je neko zainteresovan mogu napisati jos po neku rec o ovom jeziku i sistemu koga sam razvio i uspesno korstio tokom godina. Zapravo ja taj sistem i dalje koristim i mislim da sam jedan od retkih placenih Forth programera, u mom slucaju indirektno placenih jer pisanje koda nije moj opis posla.

Pozdrav,
Mladen
Reply
#7
Hvala Maki što si se javio!

Oko Forth je uobičajen problem da programeri koji su navikli na neki drugi sistem možda pipnu malo po Forth-u i već na početku imaju neku predrasudu da sve moraju praviti sami i da je mnoogo teško.

Na žalost ne znaju da su mnogi ostavili veoma bogate biblioteke u Forth za sve i svašta što se može zamisliti, i takođe da uopšte nije toliko teško koliko se zamišlja.
Uopšte ne shvataju da nije potrebno neko preterano uloženo vreme da se pređe na Forth i napiše nešto korisno što radi, za početak.

Interaktivni rad je neprevaziđeno bogatstvo koje samo Forth nudi, a takođe i ukidanje potrebe za nekim silnim kompajlerima i debugerima. Sve se nalazi unutar samog MCU, bio on PIC, ARM ili tvoj Forth predisponirani stack procesor Frog (sa kojim sam se lično uverio da radi dvostruko žešće od ostalih MCU sa istim clock).

Takođe ne shvataju da posle unošenja Forth sistema u neki MCU prestaje potreba za bio kojim drugim alatom osim običnog terminala koji se može podići i na "mrtvom" 186 od pre mnogo godina, možda i na većini modernih telefona.

Fajlovi se mogu čuvati kao .txt fajlovi i otvarati bilo čim što može otvarati tekst, takođe se terminal može podići na bilo kom OS bez ikakve posledice ili problema po Forth.
Forth će lagodno operisati interaktivno pomoću terminala na bilo kom OS, tako da postaje nebitno koji OS programer na računaru ima.
Jednostavno nema više verzija alata za  ovaj OS i onaj OS, samo običan terminal.
Windows, Linux, OSX postaje sasvim sve jedno...

Biću za početak prvi zainteresovani  učenik (ponavljač :-), posebno što sam imao prilike da vidim fascinantne mogućnosti Forth-a u nekoliko projekata koje smo ostvarili dok smo zajedno radili, i koji dan danas savršeno rade.
Neki sa Philipsovim ARM, neki na tvom Frog sistemu.

Tada sam naučio da nešto čačnem po Forth i uspešno sam par puta izmenio neke delove rada mašina na zahtev korisnika.
Na žalost, tu je se tada završilo moje učenje Fort i ne mogu da prežalim što to nisam do kraja odradio.
Sada mi stoji obećanje nekog slobodnog vremena u 24h :-), zbog novog vrlo rasterećujućeg posla koji sam prihvatio, i nastaviću sa Forth posebno što sam popi**eo kad mi je pukao displej na kompu i što sam u novi ponovo morao da instaliram alate za C.

Tako ću zauvek steći savšeno imunu platformu, gde mi više potpuno nije bitno da li sam čak zaboravio da ponesem lap top na teren, a kamo li da li mi je neka instalacija "pukla" ili je možda zastarela pa mora da se obnovi.
Biće dovoljno da na privesku za ključeve imam USB stick sa terminalčetom kog mogu da podignem na bilo čemu i kom može biti smešteno na stotine čitavih programa od nekih mašina i da mi pri tom ostane 3/4 fleša za neku muziku ili slično :-)

Imam jedan komad tvog razvojnog sistema Frog3 i kad se malo opet "navučem" na Forth biću veoma zainteresovan za tvoj najmoderniji Frog koji imaš jer ne sumnjam da to radi kao dve rakete i da može baš mnogo toga.

Predlažem da za početak napraviš neku prezentaciju sistema i verujem da će se pojaviti zainteresovani kad vide šta to može, takođe kad vide da se Forth istovremeno "proteže" od asm do najsloženijeg objektno orijentisanog pisanja.
Praktično poklapa neverovatan raspon mogućnosti i načina pisanja i samih mogućnosti sistema, a takođe je korisniku (za razliku od bilo kog drugog sistema) dostupan i vidljiv i poslednji bit bilo čega u bilo kom delu memorije samog MCU, što uobičajeno ne može u toj meri ni sa najsavremenijim debugerima u bilo kom drugom sistemu.

Biće posebno interesantno opisati prednosti i snažne mogućnosti predisponiranog stack procesora, poput tvog Frog, koji "prirodno" radi sa Forth i nije emulacija Forth sistema u standardnim RISC, jer u RISC se naravno gubi neki deo mogućnosti, i ako je čak i taj način superioran u odnosu na klasične sisteme.

U napred hvala za bilo koji tekst o tome,

Pozdrav prijatelju,
Macola
Reply
#8
I ja se prijavljujem za "ponavljacki" kurs za Forth! Smile
Reply
#9
deluje jako interesantno, bar za citanje i razmisljanje, ne planiram da programiram, bar ne u forth-u.
Reply
#10
Ubledeli,

Ljudi su jednostavno veoma različiti ali zato vole rado da se priklone masovnim pojavama (kud svi Turci tu i mali Mujo).

Rasprostranjenost nečeg uopšte ne govori dovoljno o kvalitetu istog.

Na primer:
Za rasprostranjenost engleskog jezika imamo da zahvalimo tome što su bili kolonijalna sila koja je okupirala više od 50 država u mnogo dugom vremenskom periodu.
Jednostavno, velika sila ga je namentnula, što naravno ne znači nikako da je najbolji i najupotrebljiviji.
Na primer, nemački je neuporedivo precizniji tehnički jezik u kom se stvarno teško može doći u dilemu oko tačnog cilja onog što je izrečeno ili napisano oko tehničkih detalja.

Tako je na primer i sa masovno korišćenim programskim jezicima.
Omasovljeni su oni koji se lakše daju kontrolisati u smislu da otkaz koji da jedan programer ne otežava preterano zamenu tog programera drugim koji nastavlja tamo gde je prethodni prestao.
Firme koje prave mnogo novca programiranjem, ni malo ne žele da zavise od jednog ili nekoliko programera, što se kod Forth može postići kao od šale, mada ne mora, zato što se i Forth može pisati po ANSI standardima, ali to zavisi samo od savesti programera.

Da li pisati u Forth ili u nekom drugom sistemu?

To je pitanje ličnog izbora.
Programera i njegovu veštinu ne čini jezik ili sistem koji koristi, već veština dobre organizacije koda i dobre optimizacije istog, a naravno i ergonomičnost toga što je napravljeno za krajnjeg korisnika.

Dobre i optimalne programe programer može napraviti u bilo kom sistemu ili jeziku, ako je dobar programer.
Apsolutno nema veze u čemu piše.

Forth nudi nešto što ni jedan sistem nema u toj meri: apsolutno najbrže razvojno okruženje.

-Napišeš na terminalu, stisneš enter, egzekucija trenutno,
-Napišeš na terminalu, stisneš enter, kompilacija trenutno,
-Napišeš na terminalu, stisneš enter, upisivanje na bilo koju lokaciju (RAM, flash, EEPROM, registar) trenutno,
-Napišeš na terminalu, stisneš enter, dohvatanje i ispisivanje na terminalu podataka sa bilo koje lokacije (RAM, flash, EEPROM, registar) trenutno,

Dakle besprekidna puna interaktivnost u radu.
Pisao si nešto i zadovoljan si tim, staviš marker i dopišeš parče koda koje želiš da testiraš, to se izvršava u RAM dok lepo ne istestiraš i uobličiš kod, potom ga jednom naredbom upišeš u flash.

Testiranje steb by step kakvo nigde ne možeš izvesti bez gubljenja užasnog vremena na: kompilaciju potom upisivanje u flash kod standardnih sistema, potom testiranje, pa ako nešto nije baš najbolje, onda opet sve to od početka.

Naravno da postoje i mane.
Forth nije za lenje ljude koji bi samo da odnekud skinu neku biblioteku, gurnu u MCU i to radi.
Zbog niže rasprostranjenosti od na primer C jezika, naravno da je i dostupno manje gotovih stvari na netu.

Međutim, tako se i ne uči programiranje jer kopiranjem nikad nećeš ni naučiti...

Ko nauči da radi u Forth, taj se automatski oslobađa lenjosti i postaje bolji programer i u drugim jezicima.
Stiče bolji osećaj šta se stvarno događa sa detaljima unutra i posle bolje razume "nevidljive" probleme u drugim jezicima.
To je zato što je u Forth čitav sistem do poslednje lokacije vidljiv programeru.

Pozz
Reply
#11
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 Smile
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.
Reply
#12
https://www.youtube.com/watch?v=7ha78yWRDlE
postfix objasnjen
Reply
#13
Programski jezik Forth -- D R U G I   D E O -- Kontrolne strukture

2.1 Stanje sistema

Forth sistem moze biti ili u stanju interpretiranja ili u stanju kompajliranja. Tekst interpreter ce pozvati kompajler kada naidje na : a kompajler zavrsava definiciju kada naidje na ;
Algoritam tekst interpretera izgleda ovako:
Uzmi jednu rec iz tekstualnog bafera. Proveri da li je u recniku, ako jeste izvrsi je ako je aktivno stanje interpretiranja, kompajliraj ako je aktivan kompajler. Ako tekst nije u recniku onda probaj da je konvertujes u broj.
Ako je konverzija uspesna stavi broj na stek a ako nije prijavi gresku: nedefinisana rec.
Kako sto se vidi tekstualni interpreter je vrlo jednostavan. Ulazni token ( komad teksta delimitiran space-ovima ) moze biti broj ili vec definisana rec. Ostalo je greska.
Kada je interpreter aktivan tekst se parsuje i izvrsava i potom odbacuje. U toku ovog izvrsavanja moguce je takodje i generisati kod kao bocni efekat kao u slucaju definicije varijabli ili konstanti.

Primer:
: invert ( n1 -- n2 )
-1 xor ;


Tekst interpreter pocinje tako sto potrazi adresu : u recniku i izvrsi je. Efekat : je da pokrene kompajler i da definise novu rec "invert" i da kompajlira sve ostale reci koje dolaze u trenutnu definiciju.
Dakle -1 ce biti kompajliran kao "stavi -1 na stek" dok ce xor biti kompajliran kao poziv i potom ; koji ce zaustaviti kompajler, finalizovati definiciju i vratiti sistem u stanje interpretiranja.
Tekst u zagradama je komentar! Zove se stek slika. Pokazkuje stanje steka pre -- i posle izvrsavanja reci. U ovom slucaju rec konzumira jedan element n1 i vraca jedan element n2. Ako ima vise elemenata kao ulaz ili izlaz na steku element koji je skroz desno je vrh steka.

2.2 Specijalne reci

Rec kao : ili variable su definisuce reci. One su uvek napred parsirajuce i definisu nesto u recniku. Dakle za takve reci potreban je uvek tekst koji sledi kao u gorenjem primeru ": invert" su neodvojiva celina.
U slucaju da se naidje na terminator linije (CRLF) odmah iza definisuce reci sistem baca izuzetak. Sve definisuce reci sa napravljene pomocu najosnovnije definisuce reci koja se zove create.
Create pravi novi unos u recnik. Recnik je simbol tebela koji interpreter pretrazuje za svaki token.

Immediate reci se uvek izvrsavaju cak i u modu kompajliranja. U prethondom primeru to je rec ;. Ova rec mora da se izvrsi da bi stopirala kompajler ali takodje ova rec nesto novo kompajlira da bi se zavrsila definicija.
Sta ova rec kompajlira u potpunosti zavisi od toga kako je Forth sistem napravljen.
Sve kontrolne strukture u jeziku Forth su immediate reci koje nesto kompajliraju u memoriju ali takodje se i izvrsavaju i menjaju trenutno stanje sistema.

2.3 if/then if/else/then

Sve kontrolne strukture zahtevaju stanje kompajliranja jer generisu kod. Nije moguce izvrsiti if u stanju interpretiranja i sistem ce baciti izuzetak ako korisnik to pokusa.
U skladu sa postfix notacijom za ovu kontrolnu strukturu prvo je potrebno generisati uslov pre pozivanja reci if. Primer:

variable count

: count-- ( -- )
counter @ 0> if 1 counter +! then ;


count-- ce umanjiti varijablu count za jedan kada god je pozovemo u slucaju da je veca od nule. Ovde izraz "counter @ 0>" ostavlja na vrhu steka true ili false koga konzumira if i zavisno od toga ili izvrsava telo strukture do then ili preskace izvrsavanje tela i samo skace na then.
Sada ovaj primer mozemo unaprediti tako sto cemo napraviti indikator da smo dosli do nule tako da ostatak sistema moze nesto da uradi:

variable count
variable finished


: count-- ( -- )
counter @ 0> if 1 counter +! else true finished ! then ;


Sada je jasno gde se nalazi kod za else blok. Then dakle uvek zavrsava if kontrolnu strukturu i moze se prevoditi "uslov if istinita akcija else neistinita akcija then nastavi dalje".

2.4 begin/until

Ovakva vrsta uslovne petlje je vrlo cesto koriscena. begin oznacava njen pocetak a until zahteva true/false flag na steku pre pozivanja:
Primer:

: ms ( n -- )
begin
ms_delay 1- dup
0= until drop;


dup - gura kopiju prvog elementa vrh na steka. To znaci da su sada prva dva elementa ista. Drop je radi obrunto, skida sa steka jedan element i odbacuje ga.
Ovde ms_delay predstavlja kasnjenje od jedne milisekunde a rec ms prihvata jedan parametar na steku i zove kasnjenje odgovarajuci broj puta. Naravno ovaj kod je suvise naivan jer ne pokriva slucaj 0 ms. Kako bi sam resio ovaj problem?

2.5 begin/while/repeat

Ova kontrolna stuktura je slicna kao begin\until sa razlikom da se uslov prihvata ranije tj pre nogo sto se telo petlje izvrsi. Na ovaj nacin izbegava se problem od 0 ms.
Primer:

: ms ( n -- )
begin
dup
while
ms_delay 1-
repeat drop ;

Ako je parametar 0 while ce ga skinuti sa steka i preneti izvrsavanje iza repeat a u usprotnom ako je parametar razlicit od nule while blok ce bit izvrsen.
Odmah je jasno da sve kontrolne reci koje odlucuju kako se se izvrsiti kontolna struktura uzimaju parametar sa steka ( if, until, while ...) zato je vecini potreban dup ispred njih. drop je tu da ispostuje stek sliku i da ostavi stek bez prosledjenog parametra.

2.6 do/loop

Ovo kontolna stuktura je vrlo slicna for petlji u drugim jezicima. Zahteva parametre za opseg na steku pre do dela, primer:

: test ( -- )
10 0 do i . loop ;


Rezultat izvrsavanja ove definicija je: 0 1 2 3 4 5 6 7 8 9. do konzumira 10 i 0 i koristi ih za brojanje. Trenutni indeks se moze staviti na stek pomocu reci "i".
Kao sto se vidi opseg je [0,10) kao i u drugim jezicima. Da bi se izaslo iz do/loop petlje pre vremena MORA se koristiti rec "leave". Leave pocisti okruzenje koje je podeseno za brzo izvrsavanje loop petlje. U slucaju da se to ne obavi sistem moze da padne!
Drugi nacin da se napusti petlja je: "unloop exit". Ova fraza omogucava da se odmah izadje iz definicije bez da se nastavlja izvrsavanje od loop. Exit se ponasa slicno kao return u drugim jezicima.

Primer:
: test ( -- )
10 0 do i . i 5 = if leave then loop ;

Test sada stampa brojeve od 0 do 5.
Postoji jos varijacija na temu vezanih za do/loop kao sto su: ?do/loop ili do/+loop koaje prepustam citaocu da istrazi.
Kraj drugog dela.

Nadam se da je nekom ovo interesantno i korisno. Ako ne, kazite ljudi, da ne trosim tastaturu Smile

Pozdrav,
M.
Reply
#14
Ja mislim da je korisno da se napiše nešto o tom jeziku pa ako nekoga neće možda sada interesirati možda će u nekoj bližoj budućnosti. Ja čekam da malo ove vrućine padnu pa da se prihvatim učenja ili C-a ili Fortha jer će mi trebati za mjerni instrument(curve tracer) jer će se sve vrtiti oko dva PICa, pa iako ću sigurno trebati pomoć oko programiranja da ne budem baš totalni neznalica koji će samo blijedo gledati u hrpetinu koda.
Reply
#15
@mveselic

Maki, očigledno testiraš koliko pažljivo čitamo (znam te ortak :-). Evo ja sam bio pažljiv na času.

U objašnjenju 2.3 zar ne bi trebalo da bude ovako:

variable counter

: count-- ( -- )
counter @ 0> if 1 counter -! then ;

U prevodu na običan govorni jezik: formiraj varijabliu >counter<,
potom napravi novu reč >count--<.

Reč-funkcija >count--< sastojaće se od sledećih događaja: dohvati vrednost varijable counter ( counter @ ),
uporedi njenu pročitanu vrednost sa 0 i ako je vrednost veća od 0 ( 0> if) onda  vrednost varijable (  counter )  umanji za 1 i storiraj ( 1 counter -! ), then zaključuje uslov if.


Postoji slična "anomalija" i u if-else.

Ili možda grešim ipak pošto mnogo godina to nisam ni pipnuo?

Pozdrav Maki
Reply
#16
(08-10-2015, 07:47 PM)Macola Wrote: @mveselic

Maki, očigledno testiraš koliko pažljivo čitamo (znam te ortak :-). Evo ja sam bio pažljiv na času.

U objašnjenju 2.3 zar ne bi trebalo da bude ovako:

variable counter

: count-- ( -- )
counter @ 0> if 1 counter -! then ;

U prevodu na običan govorni jezik: formiraj varijabliu >counter<,
potom napravi novu reč >count--<.

Reč-funkcija >count--< sastojaće se od sledećih događaja: dohvati vrednost varijable counter ( counter @< ),
uporedi njenu pročitanu vrednost sa 0 i ako je vrednost veća od 0 ( 0> if) onda  vrednost varijable (  counter )  umanji za 1 i storiraj ( 1 counter -! ), then zaključuje uslov if.


Postoji slična "anomalija" i u if-else.

Ili možda grešim ipak pošto mnogo godina to nisam ni pipnuo?

Pozdrav Maki

U pravu si Macola.
Nisam testirao nista u pitanju je greska.
Trebalo bi da stoji -1 counter +!
Mislim da je definicija -! nepotrebna i nikada je nisam koristio niti sam na nju naisao.

M.
Reply
#17
Hvala na razjašnjenju oko moje zablude o -!. Dakle uobičajeno je( -1 variable +! ).

Bio sam pažljiv na času :-)

Velki pozdrav,
Macola
Reply
#18
Eh da, još jedna dilema oko kreiranja verijable;

Kod tebe stoji ( variable count ) i pretpostavljam da je greška u kucanju. Posle se pojavljuje reč ( count-- ) a koristi se varijabla ( counter )

Po slobodi sam pretpostavio da je u stvari ( variable counter ) ?

Tj. sa ispravkom greške u kucanju trebalo bi da konačno bude ovo:

variable counter

: count-- ( -- )
 counter @ 0> if -1 counter +! then ;

Samo potvrdi da je ok pa da guramo dalje. Verujem da je nekoliko zainteresovanih za ovo  i da će vredeti tvoje pisanje o tome.
Znam da si preopterećen i da ti ovo zahteva dodatni napor, ali eto ima zainteresovanih.
Reply
#19
(08-10-2015, 09:52 PM)Macola Wrote: Eh da, još jedna dilema oko kreiranja verijable;

Kod tebe stoji ( variable count ) i pretpostavljam da je greška u kucanju. Posle se pojavljuje reč ( count-- ) a koristi se varijabla ( counter )

Po slobodi sam pretpostavio da je u stvari ( variable counter ) ?

Tj. sa ispravkom greške u kucanju trebalo bi da konačno bude ovo:

variable counter

: count-- ( -- )
 counter @ 0> if -1 counter +! then ;

Samo potvrdi da je ok pa da guramo dalje. Verujem da je nekoliko zainteresovanih za ovo  i da će vredeti tvoje pisanje o tome.
Znam da si preopterećen i da ti ovo zahteva dodatni napor, ali eto ima zainteresovanih.

Tako je! Izgleda da sam malo odlutao pisuci taj primer. Ali dobro je da si tu Smile

M.
Reply
#20
Evo kog zanima Flash Forth 5.0 za PIC18F4620.

Dovoljno je uneti pomoću nekog programatora poput ICD", ICD3, Pickit2, Pickit3 ili sličnog FF_UART.hex iz priloga i na PIC postaviti RS232 sa MAX232 i kablom se povezati sa PC.
Ima na netu gomila o tome kako zakačiti MAX232 na 18F seriju:
https://www.google.rs/search?q=pic+18f+u...24&bih=628

Tera term se može skinuti ovde:
https://www.google.rs/search?q=tera+term...ygPK9ZmoAQ

Terminalče se diže munjevito i treba ga setovati tako da mu serijska komunikacija bude: COMx (po potrebi korisnika), Baud rate 38400, data 8 bit, parity NONE, Flow control NONE, font "Terminal".

Trenutak po uključenju napajanja PIC na Tera term će se pojaviti poruka: "FlashForth PIC18F4620  19.01.2015"

Po pritisku enter:  "ok<#,ram>"
I po naredbi "words" sistem će izlistati listu reči od kojih se sastoji ovako netaknut Forth sistem.
Evo fotke o tome.



Inače, sistem startuje kao munja.

Evo i hex fajla za PIC18F4620 (ko ga ima na lageru):

 
.rar   FF_UART.rar (Size: 10,62 KB / Downloads: 8)


Sada već možemo interaktivno vežbati...
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)