Mozda se neki secaju da sam nekada davno poceo da pisem PASCAL kompajer.
Imao sam vremena, a onda su dosli poslovi (hvala bogu) obimni, ali i zaradilo se za tih 7-8 godina. Prosle godine se sve polako ugasilo. I eto od nove godine nista ne radim, ali u junu opet krecem u neki veci posao.
Oni koji se secaju znaju da se profesionalno bavim mikrokontrolerima, pisem u asembleru i C-u CodeWarrior. Ali i ja sam hobista, hobi mi je da napisem PASCAL kompajler.
PASCAL je mali i sazet jezik kao stvoren za MCU-ove, ali tu vlada C. Ja sam za osnovu uzeo najstariji standard ISO 7185 koji je najblizi referentnoj definiciji PASCAL-a koju je dao njegov tvorac Nikolas Virt. Zapravo vise sam se drzao Virtove definicije.
Kada sam poceo, to je bio megalomanska zamisao. Jedan covek iz hobija tesko da moze da uradi ovo sto sam zamislio.
Zato sam od nove godine nastavio, ali sam smanjio apetite. Tu sada dolazi preispitivanje mojih odluka, pa ocekujem komentare i savete nekolicine vrsnih forumasa cije postove stalno pratim.
Prva odluka je bila da zadrzim drasticnu strogost u pogledu kompatibilnosti tipova koju je uveo Virt, a koja je ublazena kasnijim standardima PASCALA.
Ovo treba da iskljuci besmislene iskaze kada se mesaju babe i zabe. Jednostavno, nije dozvoljeno dodeliti oznacenu vrednost neoznacenoj, dok je obrnuto moguce samo, ako oznacena vrednost svojim tipom obuhvata neoznacenu. O dodeljivanju karaktera celobrojnim vrednostima i slicno nema ni govora.
Druga odluka je da se tip vrednosti oznacenog bajta (shortint) prostire od -127 do 127. Isto vazi i za dvobajtne i cetvorobajtne vrednosti. Pitate se zasto ne od -128 do 127. Razlog je prost: ako je X = -128 onda Y := -X daje varijabli Y vrednost -128. Ovo je glupost, to je uocio Virt i kod njega je na isti nacin definisan skup vrednosti oznacenih brojeva.
Treca odluka je da skupove ogranicim na najvise 32 elementa (4 bajta). Moja procena je da za MCU aplikacije ne treba vise.
Cetvrta odluka je da nizova ogranicim na 256 elemenata (0..255). Ovo je dovoljno u najvecem broju slucajeva, a ako zatreba duzi niz, onda se mra preci na dvodimenzionalni niz ili visedimenzioni, ali ako ima dovoljno RAM-a. Razlog je jednostavnije pisanje kompajlera, nemam dva slucaja kod nizova: za manje od 257 elemenata i vise od 256.
Peta odluka je najdrasticnija. Ogranicio sam broj clanova u izrazu na 2. Moze Niz[a+b] := c+d, ali ne moze a := b+c+d. Izraz sa vise clanova mora se razbiti u dva iskaza. Ovo je rezultat mog ubedjenja stecenog analizom stotina hiljada redova izvornog koda, koje sam napisao za ovih 7-8 godina. Ne secam se da mi je vise od 0.5% slucajeva trebao izraz u iskazu sa vise od 2 clana.
Sta dobijam time, pa nemam medjurezultat koji moram da pamtim na steku. Ovim sam iskljucio mnoge slucajeve koji se pojavljuju prilikom kompajliranja. Sto je jos vaznije, kompajler treba testirati za sve slucajeve, a to bi bio dosadan posao u nedogled.
I uzgred, imao sam, a jos je imam, nedoumicu kako tretirati unarni operator not (u C-u ~) sobzirom da zelim totalnu strogost po pitanju tipova. Ovo zato sto je not x = -x-1, pa se moze smatrati i aritmetickim operatorom, ali i ligickim jer deluje jednako na sve bitove podatka.
Tako je -not x = x+1.
Dakle, sta vi mislite. I sa ovim ogranicenjima ceka me tezak posao, isplati se ako ih ocenjujete da nisu ogranicenja i za aplikaciju.
Pozdrav.
Imao sam vremena, a onda su dosli poslovi (hvala bogu) obimni, ali i zaradilo se za tih 7-8 godina. Prosle godine se sve polako ugasilo. I eto od nove godine nista ne radim, ali u junu opet krecem u neki veci posao.
Oni koji se secaju znaju da se profesionalno bavim mikrokontrolerima, pisem u asembleru i C-u CodeWarrior. Ali i ja sam hobista, hobi mi je da napisem PASCAL kompajler.
PASCAL je mali i sazet jezik kao stvoren za MCU-ove, ali tu vlada C. Ja sam za osnovu uzeo najstariji standard ISO 7185 koji je najblizi referentnoj definiciji PASCAL-a koju je dao njegov tvorac Nikolas Virt. Zapravo vise sam se drzao Virtove definicije.
Kada sam poceo, to je bio megalomanska zamisao. Jedan covek iz hobija tesko da moze da uradi ovo sto sam zamislio.
Zato sam od nove godine nastavio, ali sam smanjio apetite. Tu sada dolazi preispitivanje mojih odluka, pa ocekujem komentare i savete nekolicine vrsnih forumasa cije postove stalno pratim.
Prva odluka je bila da zadrzim drasticnu strogost u pogledu kompatibilnosti tipova koju je uveo Virt, a koja je ublazena kasnijim standardima PASCALA.
Ovo treba da iskljuci besmislene iskaze kada se mesaju babe i zabe. Jednostavno, nije dozvoljeno dodeliti oznacenu vrednost neoznacenoj, dok je obrnuto moguce samo, ako oznacena vrednost svojim tipom obuhvata neoznacenu. O dodeljivanju karaktera celobrojnim vrednostima i slicno nema ni govora.
Druga odluka je da se tip vrednosti oznacenog bajta (shortint) prostire od -127 do 127. Isto vazi i za dvobajtne i cetvorobajtne vrednosti. Pitate se zasto ne od -128 do 127. Razlog je prost: ako je X = -128 onda Y := -X daje varijabli Y vrednost -128. Ovo je glupost, to je uocio Virt i kod njega je na isti nacin definisan skup vrednosti oznacenih brojeva.
Treca odluka je da skupove ogranicim na najvise 32 elementa (4 bajta). Moja procena je da za MCU aplikacije ne treba vise.
Cetvrta odluka je da nizova ogranicim na 256 elemenata (0..255). Ovo je dovoljno u najvecem broju slucajeva, a ako zatreba duzi niz, onda se mra preci na dvodimenzionalni niz ili visedimenzioni, ali ako ima dovoljno RAM-a. Razlog je jednostavnije pisanje kompajlera, nemam dva slucaja kod nizova: za manje od 257 elemenata i vise od 256.
Peta odluka je najdrasticnija. Ogranicio sam broj clanova u izrazu na 2. Moze Niz[a+b] := c+d, ali ne moze a := b+c+d. Izraz sa vise clanova mora se razbiti u dva iskaza. Ovo je rezultat mog ubedjenja stecenog analizom stotina hiljada redova izvornog koda, koje sam napisao za ovih 7-8 godina. Ne secam se da mi je vise od 0.5% slucajeva trebao izraz u iskazu sa vise od 2 clana.
Sta dobijam time, pa nemam medjurezultat koji moram da pamtim na steku. Ovim sam iskljucio mnoge slucajeve koji se pojavljuju prilikom kompajliranja. Sto je jos vaznije, kompajler treba testirati za sve slucajeve, a to bi bio dosadan posao u nedogled.
I uzgred, imao sam, a jos je imam, nedoumicu kako tretirati unarni operator not (u C-u ~) sobzirom da zelim totalnu strogost po pitanju tipova. Ovo zato sto je not x = -x-1, pa se moze smatrati i aritmetickim operatorom, ali i ligickim jer deluje jednako na sve bitove podatka.
Tako je -not x = x+1.
Dakle, sta vi mislite. I sa ovim ogranicenjima ceka me tezak posao, isplati se ako ih ocenjujete da nisu ogranicenja i za aplikaciju.
Pozdrav.