Tagged pointers?

Saku-foorumi » Classic Amiga » Ohjelmointi » Viestit 2003 » Tagged pointers? « Edellinen Seuraava »

Kirjoittaja Viesti
 

tomppa
Lauantaina, 15. marraskuuta, 2003 - klo 21.57:   
Liekö kellään mielipiteitä miten tuollainen merkittypointteri(sinnepäin suomennos) olisi fiksuinta toteuttaa Amigassa. Eli ideahan on että jokainen pointteri kantaa mukanaan tietoa siitä millaiseen dataan osoittaa. Yksinkertaisimmillaan tyyliin
struct Pointteri {
int tag;
void *pointteri; /* tai voidin sijaan union..*/
};

Olisiko tuo fiksumpaa toteuttaa esim. käyttämällä pari bittiä osoitteesta tagiin, tietysti maskaten tagibitit tarvittaessa pois. Huonona puolena tuo rajoittaa tietysti käytettävää muistialuetta.
Structin käyttö olisi ehkä siisteintä mutta jos pointtereita käytetään paljon structien välittäminen arvona lienee hidasta? Pointterit 'struct Pointteri':iin taas menee hieman sekavaksi...
Pitäisikö jotain tiettyjä juttuja muistaa ottaa huomioon yhteensopivuuden suhteen, jos käytetään em. tyyppistä osoitteen bittien vääntelyä.
AmigaBasicissähän taisi olla juuri jotain häröä kun luotettiin siihen että MC68000 'maskaa' automaattisesti ylimääräiset bitit? Mikä on tietysti eri asia kuin tämä...
Anyway, mikä lienee luotettavin/nopein/kaunein tapa tuollaiseen.

 

Joanna
Lauantaina, 15. marraskuuta, 2003 - klo 22.58:   
Ylimpiä osoitebittejä ovat käyttäneet hyvin monet ja niistä on ollut mitä kummallisimpia seuraksia. Muunmuassa Emacs editori läytti tuollaisia omassa Lisp-tulkissaan ja siitä tuli aika ilkeitä ongelmia portattaesssa koodia eri arkkitehtuureille (kaikissa Integer ei ole samanmittainen kuin pointteri). Lisäksi niiden maskaaminen käsin joka kohdassa ohjelmaa on aika riskialtista eikä ole lainkaan varmaa että kaikki muisti on siinä osassa osoiteavaruutta mitä ohjelman tekijä on kuvitellut.

Esimerkiksi Pegasoksessa (ja AmigaOnessa?) voi hyvin olla 2 gigatavua todellista muistia, tulevissa jopa enemmän. Semmoisen kanssa muistiosoitteen ylimpiä bittejä ei yksinkertaisesti jää vapaaksi mihinkään tuollaiseen.

Eli on parempi heti alussa tehdä se jotenkin muuten koska tuollaisen muuttaminen sitten kun ohjelma on kokonaan kirjoitettu on uskomattoman iso rulijanssi.

Tietty. jos kyseessä on joku 68k assulla tehty viritelmä joka on muutenkin laiteriippuvainen ja jonka ei tarvitse toimia tulevissa koneissa... :)

 

tomppa
Sunnuntaina, 16. marraskuuta, 2003 - klo 2.34:   
Joanna: Juuri tuonsuuntaisia sivuvaikutuksia vähän odotinkin. Vaikka tällä hetkellä ohjelman ei tarvitsisi pyöriä kuin omassa A1200:ssa niin ei siitä silti tahallaan viitsi tehdä epäportattavaa. Varsinkin kun tuota olisi kiva päkertää x86 linuxillakin, aika veemäistä saada toimimaan molemmissa ilman rumia kikkailuja... Suunnilleen kaikki yksityiskohdat erilaisia kuin Amylla.

 

tomppa
Sunnuntaina, 16. marraskuuta, 2003 - klo 2.36:   
Tosin voisi olla ihan hauskaa tehdä tuollainen assylla, säännöistä välittämättä, periaatteella 'toimii mun koneella'. Rentouttavaa ikäänkuin ;-)

 

miksuh
Maanantaina, 17. marraskuuta, 2003 - klo 17.09:   
No en ehdi just nyt tota sen enempää miettiä, mutta:

"Structin käyttö olisi ehkä siisteintä mutta jos pointtereita käytetään paljon structien välittäminen arvona lienee hidasta? Pointterit 'struct Pointteri':iin taas menee hieman sekavaksi... "

Itse tekisin ton varmaankin juuri structien avulla. Eikä se osotin struct pointeriin nyt niin hirveän sekavaksi välttämättä menisi, riippuu siitä miten homma toteutettu.

Itse en käyttäisi pelkkää vanhan tyyppistä struct:a ja osotionta siihen, vaan tekisin typedef:llä oman tietotyypin tosta. typedef:n käyttö helpottaa ja selkiyttyy hommaa monesti, esim sillon jos structeja tai osottimia niihin halutaan välittää.

 

tomppa
Tiistaina, 18. marraskuuta, 2003 - klo 2.56:   
Juu kyseessä olisi siis pienen Lisp-tulkin väsääminen, eli suurin osa toiminnasta on juuri pointtereiden käsittelyä, siksi en viitsisi kopioida funktioiden välillä turhaan noita structeja. Helpoin tapa lieneekin käyttää yhtä globaalia structia 'osoiterekisterinä' pinolla tuettuna. Pointtereita kun ei kuitenkaan tarvita yleensä kuin tuota yhtä kerrallaan. Vähän rumaa mutta täytyypä testata.

 

itix
Tiistaina, 18. marraskuuta, 2003 - klo 15.55:   
Perus-A1200:ssa on se 'hyvä' puoli että CPU:n osoiteavaruus on vain 24 bittiä. Ylimmät 8 bittiä voi käyttää muihin tarkoituksiin ilman mitään maskaamista.

En tiedä onnistuisiko tuo jos käyttää 64bit pointtereita? Silloin ei tarvitsisi struktuuria ja muistia voisi osoittaa suoraan pointterilla. Rumaa tuokin mutta voisi riittää AmigaOS-ympäristöön.

 

tomppa
Keskiviikkona, 19. marraskuuta, 2003 - klo 7.08:   
itix: Perus A1200 eli 68ec020, vai? Olin siinä luulossa että tuossa on täysin 32bittinen osoiteväylä. Aina oppii jotain uutta.

Muistinhallintaan liittyen: Olen vähän leikitellyt ajatuksellä että koko Lisp-tulkkiin liittyvän muistinhallinnan, roskankeruineen erottaisi omaksi prosessiksi. Eli yksi roskankeruu ohjelma huolehtii jaetusta muistista, muut pelkän perustulkin sisältävät prosessit kysyvät GC:ltä perusosoitteen minkä perusteellä lukevat, kirjoittavat ja mahd. ajavat koodia jaetussa muistissa. Jos unohdetaan tusinan verran synkronointiin ja muuhun liittyviä ongelmia tuolla systeemillä olisi omat hyvät puolensa; erottelu muistinhallinnan ja 'muun' välillä olisi selkeä, lisp-prosesseilla olisi selkeä tapa jakaa muistia etc.
Eli mitenkäs tuollainen muistin jakaminen ajo/luku/kirjoitus tarkoituksessa, mitään ansoja noin yhteensopivuuden kannalta. Pitää kato olla AOS5 yhteensopiva ;-)

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: