Avanti Indietro Indice

2. AVETE BISOGNO DELL'ASSEMBLY?

Beh, non vorrei interferire con ciò che state facendo, ma ecco alcuni consigli derivanti da una esperienza ottenuta faticosamente.

2.1 Pro e contro

I vantaggi dell'assembly

L'assembly può esprimere cose molto a basso livello:

Gli svantaggi dell'assembly

L'assembly è un linguaggio molto a basso livello (più in basso c'è solo la codifica a mano delle istruzioni in codice binario).

Ciò significa:

Valutazioni

Tutto sommato, potreste notare che nonostante l'uso dell'assembly sia talvolta necessario (o semplicemente utile, in alcuni casi), sarà il caso che:

Anche nei casi in cui l'assembly è necessario (ad esempio, nello sviluppo di sistemi operativi), scoprirete che non ne serve poi molto e che i principi precedenti continuano a valere.

A questo riguardo, date un'occhiata ai sorgenti del kernel di Linux: poco assembly, giusto lo stretto necessario, il che ha come risultato un sistema operativo veloce, affidabile, portabile e mantenibile. Anche un gioco di successo come DOOM è stato scritto quasi completamente in C, con solo una minuscola parte scritta in assembly per renderlo più veloce.

2.2 Come NON usare l'assembly

Procedura generale per ottenere codice efficiente

Come dice Charles Fiterman su comp.compilers circa il confronto tra codice assembly generato a mano o automaticamente,

«L'uomo dovrebbe sempre vincere, ed eccone i motivi:

L'uomo vince perché sa usare la macchina.»

Linguaggi con compilatori ottimizzanti

I linguaggi quali ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++, tra gli altri, dispongono di compilatori ottimizzanti liberi che ottimizzeranno il grosso dei vostri programmi (e spesso otterranno risultati migliori rispetto all'assembly manuale anche per cicli stretti), permettendovi nel frattempo di concentrarvi su dettagli più ad alto livello, il tutto senza vietarvi di ottenere qualche punto percentuale di prestazioni in più nella maniera espressa sopra, una volta che il vostro progetto avrà raggiunto un'impostazione stabile.

Certo, ci sono anche compilatori ottimizzanti commerciali per la maggior parte di quei linguaggi!

Alcuni linguaggi hanno compilatori che producono codice C, che può essere ulteriormente ottimizzato da un compilatore C. LISP, Scheme, Perl e molti altri fanno parte di questa categoria. La velocità è abbastanza buona.

Procedura generale per accelerare il vostro codice

Per quanto riguarda l'accelerazione del vostro codice, dovreste restringerla alle parti di un programma che uno strumento di profiling ha decisamente identificato come un collo di bottiglia.

Perciò, se identificate qualche porzione di codice come troppo lenta, dovreste:

Come ultima cosa, prima che vi riduciate a scrivere assembly, dovreste ispezionare il codice generato, per controllare che il problema risieda proprio nella cattiva generazione del codice, visto che potrebbe anche non essere così: il codice generato dal compilatore potrebbe essere migliore di quanto avreste potuto fare voi, specialmente sulle moderne architetture multi-pipelined! Le parti lente di un programma potrebbero essere intrinsecamente tali. I più grossi problemi sulle architetture moderne con processori veloci sono dovuti a ritardi di accesso alla memoria, cache-miss, TLB miss, e page fault; l'ottimizzazione sui registri diventa inutile, ed otterrete risultati migliori riprogettando le strutture dati ed il threading per ottenere una miglior località nell'accesso alla memoria. Potrebbe forse essere d'aiuto un approccio completamente diverso al problema.

Ispezione del codice generato dal compilatore

Ci sono molte ragioni per ispezionare il codice assembly generato dal compilatore. Ecco cosa potete fare con tale codice:

Il modo canonico per far generare codice assembly è invocare con il flag -S il vostro compilatore. Ciò funziona con la maggior parte dei compilatori UNIX, compreso il compilatore C di GNU (GCC), ma nel vostro caso le cose potrebbero andare diversamente. Nel caso di GCC, con l'opzione -fverbose-asm verrà prodotto codice assembly più comprensibile. Certo, se volete ottenere buon codice assembly, non dimenticate di dare i soliti consigli e le solite opzioni per l'ottimizzazione!


Avanti Indietro Indice