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 edytuj

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 edytuj

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 edytuj

  1. Danny Kalev: Czym jest dekorowanie nazw. [dostęp 2009-05-25]. (ang.).
  2. a b Dekorowanie nazw. [dostęp 2009-05-25].