Newsgroup: it.comp.lang.c++
Titolo: Cosa si intende per "name mangling"?

Che cosa si intende per Name Mangling e quali problemi pone?
Grazie,
Christian
=========================================================
Of all the things I've ever lost, I miss my mind the most
=========================================================
    Christian Prinoth     |  For replies please remove
 
c.pr...@flashnet.it
  |  ANTISPAM from the address
=========================================================

Che cosa si intende per Name Mangling e quali problemi pone?
E` la stessa funzionalita` che la Microsoft, piu` eufemisticamente,
chiama "name decoration": i nomi presentati dal compilatore C++ al
linker sono "decorati" (ovvero "massacrati":-) con l'indicazione
degli esatti tipi coinvolti.  Questo tipo di approccio e` del tutto
indispensabile per consentire l'overloading, e impedisce comunque
di chiamare per errore una funzione che coincide per nome, ma non
per tipi di argomenti.
Ogni compilatore ha il proprio specifico algoritmo, comunque ad
esempio con Microsoft VC++5.0...:
Compilatore		Linker
double f(double);	?f@@YANN@Z
void f(void);		?f@@YAXXZ
int f(int);		?f@@YAHH@Z
e cosi` via.
I problemi possono venire se si devono passare i nomi di queste
funzioni "decorate" a strumenti di programmazione che NON sono
in grado di ``tradurre'' fra la forma nota al compilatore e
quella "decorata" nota invece al linker; in questi casi sara`
necessario utilizzare il poco-leggibile "nome decorato".  Ad
esempio, la funzione di sistema GetProcAddress (usata spesso
in congiunzione con la LoadLibrary) richiede appunto l'uso del
nome "vero", cioe` "decorato".  Farebbe comodo avere a propria
disposizione un paio di routine per tradurre fra le due forme
come lo fa un certo compilatore, naturalmente!
Alcuni, erroneamente, pensano che un ulteriore "problema" sia
il fatto che questa decorazione differisce fra diverse marche
(o versioni) di compilatori, e cio` impedisce di linkare una
libreria di classi realizzata, ad esempio, con Borland C++ 5.0,
ad un programma realizzato, ad esempio, con Microsoft VC++ 5.0.
Questo, in realta`, non e` "un problema" causato dal mangling,
bensi` un *servizio* che il mangling ci da`: infatti, visto che
ogni compilatore fa a modo suo per quel che riguarda dettagli
cruciali come il layout dei dati, delle v-tables, eccetera, e`
decisamente _meglio_ che simili link falliscano subito piuttosto
che non (apparentemente) riuscire e poi causare crash.  Questo
e` spiegato piuttosto bene da Stroustrup in "Design and Evolution
of the C++ Programming Language".  Su alcune piattaforme, come
ad esempio Win32, esistono standard binari per l'interscambio
fra diversi linguaggi (nel caso di Win32, il Component Object
Model, COM), neppure limitati al solo C++ ma assai piu` estesi
come campo di applicazione, ed e` a questo livello che si puo`
ottenere il funzionamento di applicazioni "miste" con diversi
linguaggi (o diversi compilatori per lo stesso linguaggio).
Alex
--
 ____    Alex Martelli, Bologna, Italia -- email: 
al...@magenta.com
 \SM/___                                 
http://magenta.com/~alex
  \/\bi/     You never know what is enough unless you know what
     \/          is more than enough.

>>>>> "Christian" == Christian Prinoth <c.pr...@ANTISPAMflashnet.it> writes:
    Christian> Che cosa si intende per Name Mangling e quali problemi
    Christian> pone?  Grazie, Christian
Per "name mangling" si intende il processo per cui i compilatori C++
modificano il nome delle funzioni secondo parametri interni, al fine
di permettere al linker di effettuare i collegamenti giusti in caso di
funzioni e metodi overloaded. Ovviamente il name-mangling deve essere
coerente con il tipo di argomenti di una funzione (non č che il
compilatore aggiunge caratteri a caso... ;-)
Ciao,
Andrea