Dekorowanie nazw (ang. name mangling, name decoration) – technika stosowana przez kompilatory współczesnych języków programowania w celu wygenerowania unikatowych nazw funkcji, struktur, klas oraz innych typów danych[1][2]. Schemat generowania unikalnych nazw różni się w zależności od tego jaki kompilator został zastosowany[2].
Geneza
Potrzeba stosowania dekorowania nazw przez kompilatory wynika z konfliktu pomiędzy wymaganą unikalnością nazw a stosowaną we współczesnych językach programowania techniką przeciążania nazw.
Dekorowanie nazw w C dla Microsoft Windows
Jakkolwiek technika dekorowania nazw ogólnie nie jest wymagana przez języki programowania, które nie wspierają przeciążania funkcji (np. C i Pascal), jednak w pewnych przypadkach jest stosowana aby poszerzyć zakres informacji opisujących funkcje.
Na przykład kompilator dedykowany platformie Microsoft Windows wspiera obsługę konwencji wywołania, które określają sposób przekazywania parametrów do funkcji i odsyłania wyniku przez funkcję. Ponieważ różne konwencje wywołania nie są ze sobą kompatybilne, kompilator dekoruje nazwy symbolami określającymi, która z nich ma zostać użyta.
Schemat dekorowania nazw zaproponowany przez Microsoft, wspierany przez kompilatory Digital Mars, Borland i GNU gcc, używany jest przy kompilowaniu kodu na platformę Windows. Schemat ten jest również stosowany przez inne języki, takie jak Pascal, D, Delphi, Fortran i C#.
Po kompilacji poniższego przykładu w C:
int _cdecl f (int x) {return 0;}
int _stdcall g (int y) {return 0;}
int _fastcall h (int z) {return 0;}
32-bitowy kompilator wygeneruje:
_f
_g@4
@h@4
Dekorowanie nazw funkcji stdcall
i fastcall
stosuje schemat _nazwa@X
i @nazwa@X
, gdzie nazwa jest nazwą funkcji, a X określa liczbę bajtów argumentów funkcji. W przypadku funkcji cdecl
, dekorowanie polega wyłącznie na dodaniu prefiksu „_”.
Przypisy