Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
caso si precisi l'opzione ADDSYM. Nel nostro esempio, non<br />
Il progranima sariì una variante del classico "Hello n~orld": abbiamo usato né l'una né l'altra cosa, dovremmo dunque<br />
sentirci al siciiro. Non è così. Perché oltre agli hunk-del->ug,<br />
main (int argc, char *argv [ I )<br />
possono comparire nel codice oggetto e nell'eseguihile<br />
t<br />
degli hunk-symbol, che contengono i nomi dei simboli<br />
if (argc==2) printf ("Hello World %s\nT', argv [l] ) ;<br />
definiti esternamente: questo accade anche se non è stata<br />
Delay (50) ; usata né l'opzione -d del compilatore. né l'opzione<br />
return 5; ADDSYM del linker.<br />
Qciesto risibile programiua compilato con il Lattice 5.04<br />
senza alcuna opzione particolare per LC. occupa la bellezza<br />
di 6516 hyte. Troppi. veramente troppi: se andiamo a<br />
vedere la mappa generata dal linker troveremo una<br />
quarantina eli funzioni inserite automaticamente dal<br />
compilatore, clie non appaiono affatto nel sorgente: non<br />
sarà possibile. per caso, eliminarne qualcuna?<br />
In verità si possono elirilinare tutte e si può addirittura<br />
arrivare, con qualche sacrificio, a scrivere un progra~n~iia<br />
che faccia esattamente la stessa cosa in poco piìi di 350 byte<br />
(se non si richiede la compatibilità Workt->ench). Sarebbe<br />
quasi come un programiila scritto in Asseriibly e tutto<br />
questo con poche modifiche e con qualche opzione ben<br />
scelta.<br />
Ci sono dunque almeno 6K di overhead nel nostro esempio:<br />
questi 6K SLI un programma, mettiamo, di 100K. a motivo<br />
dei vantaggi che assicurano. possono sicuramente essere<br />
tollerati, ma su un programmino di 10 o 20K si fanno sentire<br />
inolto e iiioltiplicati per 20-30, il numero approssimativo eli<br />
~itility da directory C: che normalmente possono trovarsi su<br />
un sisterna neanche poi tanto esteso. fanno 120-150K, che<br />
non sono certo pochi per un floppy. Ma c'è anche cla notare<br />
un'altra cosa: una paste dell'overliead. come vedremo,<br />
cresce in proporzione al programma. e quindi piii questo è<br />
lungo, n~aggiore è l'overhead: i 6K sono solo teorici, spesso<br />
sono ben di piìi.<br />
I'rirna di iniziare la nostra "cura dimagrante", vorrei però che<br />
si capisse perché e stato scelto questo prograniriia ese~iipio:<br />
esso comprende diie f~inzionalità clie sono fra le ~iiaggiori<br />
responsabili dell'increiiieilto della lunghezza dei<br />
progratnmi: le funzioni di I/O e la gestione clei parametri<br />
della linea di comando. Mediante una serie di rinunce e di<br />
compromessi a questi livelli si può arrivare a ridurre<br />
clrasticamente il programma. I1 programma comprende,<br />
inoltre, la chiamata diretta a una funzione eli libreria <strong>Amiga</strong><br />
(Delay) e non corilprende invece 1'~iso di f~inzioni<br />
maten~atiche. che escl~idiamo dalla presente trattazione.<br />
Le informazioni di debug<br />
IJna delle prime cose da verificare è la presenza delle<br />
inforri~azioni per il debugger. Se si coriipila con il Lattice<br />
cisando le opzioni di debugging (-dx), nel codice oggetto<br />
verranno inseriti degli hunk-debug che, a loro volta,<br />
saranno poi aggiunti da Blink all'eseguibile, ma solo nel<br />
L'unica n~aniera per escludere questi hunk dal codice<br />
destinato al rilascio è usare l'opzione NODEBIIG (ND) con<br />
Blink: è la sola clie assicura l'assoluta mancanza di<br />
informazioni di dehiig. Nel nostro esempio appare un solo<br />
hunk-synlbol, che contiene il simbolo esterno -Delay,<br />
essendo Ilelay praticarilente l'unica f~inzione esterna<br />
cliiamata dal nostro modulo. Ovviamente, in Lin sorgente<br />
con un iiiaggior numero di chiamate esterne la quantità<br />
delle inforriiazioni siii simboli esterni crescerà di<br />
conseguenza.<br />
Se effettiiiatiio il linking con l'opzione NODEBUG otteniaiiio<br />
un eseguibile di 6492 by~e. con un guadagno di 24 byte:<br />
pocliini, direte voi; tila il sinibolo era uno solo: provate ad<br />
iminaginare cosa succederebbe con 70 o 100 chiamate<br />
esterne a f~inzioni dal nome magari un po' piìi lungo, del<br />
tipo BltBitMapKastPort ...<br />
Il numero di hunk<br />
Anche il nuriiero di Iiunk influisce sulle dimensioni<br />
dell'esegiiibile. Da una paste ogni Iiunk implica un certo<br />
overhead contenente le inforiliazioni relative all'hunk<br />
stesso. Ma dall'altra, e in maniera piìi incisiva. la divisione<br />
del codice in pii1 hunk induce necessariamente il linker a<br />
gener:ire altri hiink contenenti le informazioni di<br />
rilocazione: gli liunk-reloc32.<br />
Questi inciclono in maniera &iriabile sulle diriiensioni del<br />
coclice. ma c'è da notare che l'aumento degli hunk di codice<br />
e di dati accompagnato all'aumento della lunghezza del<br />
sorgente implica un aurilento esponenziale delle<br />
informazioni di rilocazione, che possono tranquillamente<br />
raggiungere I'orcline delle centinaia (e delle migliaia nei<br />
programmi rilolto lunghi e fraiilmentati). 11 nostro<br />
microscopico sorgente contiene I~en 3 hunk code e 1 liunk<br />
data assielile a 4 Iiunk reloc32 per un totale di 16 rilocazioni<br />
(ognuna delle quali occupa alnieno 4 byte).<br />
Ora. Iiiink e rilocazioni sono poche in qiiesto caso. perché<br />
fra le opzioni di default del coriipilatore vi è l'opzione -bl<br />
che indica di usare. per i riferimenti esterni, degli<br />
scostamenti relativi ai registri indirizzi e non dei valori<br />
Lissoluti a 32 bit: se proviamo a coiiipilare il programma con<br />
l'opzione -120 (con riferimenti esterni a 32 hit) otterreriiino<br />
questi risultati: Iiinghezza ciell'eseguibile 7200 byte, 5 hunk<br />
code o dat:i, 4 hunk-reloc32 con iin totale eli 145 (!)<br />
rilocazioni. Quindi se vogliamo ridurre le dimensioni del<br />
sorgente sari Ixne evitare accurata~iiente l'uso di -h0 e