31.05.2013 Views

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!