Czym jest namaszczenie nazwy i jak to działa?

Proszę wyjaśnić, co to jest manipulowanie nazwami, jak to działa, jaki problem rozwiązuje oraz w jakich kontekstach i językach jest używany. Strategie manipulowania nazwami (np. jaka nazwa jest wybrana przez kompilator i dlaczego) Plus.

Author: Stefano Borini, 2009-08-22

10 answers

W wybranym języku programowania, jeśli identyfikator jest eksportowany z osobno skompilowanej jednostki, potrzebuje nazwy, pod którą jest znany w czasie połączenia. Name mangling rozwiązuje problem przeciążonych identyfikatorów w językach programowania. (Identyfikator jest "przeciążony", jeśli ta sama nazwa jest używana w więcej niż jednym kontekście lub z więcej niż jednym znaczeniem.)

Niektóre przykłady:

  • W C++ funkcja lub metoda get może być przeciążona w wielu typy.

  • W Ada lub Modula-3 Funkcja get może pojawić się w wielu modułach.

Wiele typów i wiele modułów obejmuje zwykłe konteksty.

Typowe strategie:

  • Mapuj każdy typ na łańcuch znaków i użyj połączonego identyfikatora wysokiego poziomu I "type string" jako nazwy czasu łącza. Powszechne w C++ (szczególnie łatwe, ponieważ przeciążenie jest dozwolone tylko dla funkcji/metod i tylko dla typów argumentów) i Ada (gdzie można przeciążenie typów wyników, jak również).

  • Jeśli identyfikator jest używany w więcej niż jednym module lub przestrzeni nazw, połącz nazwę modułu z nazwą identyfikatora, np. List_get zamiast List.get.

W zależności od tego, jakie znaki są legalne w nazwach czasu łącza, może być konieczne dodatkowe zniekształcenie; na przykład, może być konieczne użycie podkreślenia jako znaku "ucieczki", aby można było rozróżnić

  • List_my.get -> List__my_get

Od

  • List.my_get -> List_my__get

(co prawda ten przykład sięga, ale jako kompilator muszę zagwarantować, żeodrębne identyfikatory w kodzie źródłowym mapują różne nazwy czasu łącza . To jest cały powód i cel wymachiwania nazw.)

 35
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-22 02:40:03

Mówiąc najprościej, name-mangling jest procesem, w którym Kompilatory zmieniają nazwy identyfikatorów w kodzie źródłowym, aby pomóc linkerowi w rozróżnianiu pomiędzy tymi identyfikatorami.

Wikipedia ma wspaniały artykuł na ten temat z kilkoma świetnymi przykładami.

 24
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-22 00:25:50

Name mangling jest sposobem, za pomocą którego Kompilatory modyfikują "skompilowaną" nazwę obiektu, aby stała się inna niż podana w spójny sposób.

To pozwala językowi programowania na elastyczność w dostarczaniu tej samej nazwy wielu, skompilowanych obiektów i mają spójny sposób wyszukiwania odpowiedniego obiektu. Na przykład, pozwala to na istnienie wielu klas o tej samej nazwie w różnych przestrzeniach nazw (często poprzez prepending przestrzeni nazw do klasy nazwa, itp.).

Przeciążenie operatorów i metod w wielu językach idzie o krok dalej - każda metoda kończy się" zniekształconą " nazwą w skompilowanej bibliotece, aby umożliwić istnienie wielu metod na jednym typie o tej samej nazwie.

 4
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-22 00:27:19

W Pythonie, name-mangling jest systemem, w którym zmienne klasy mają różne nazwy wewnątrz i na zewnątrz klasy. Programista "aktywuje" ją poprzez umieszczenie dwóch znaków podkreślenia na początku nazwy zmiennej.

Na przykład, mogę zdefiniować prostą klasę z niektórymi członkami:

>>> class Foo(object):
...  def __init__(self):
...   self.x = 3
...   self._y = 4
...   self.__z = 5
... 

W praktyce Pythona nazwa zmiennej zaczynająca się od podkreślenia jest "wewnętrzna" i nie jest częścią interfejsu klasy, więc programiści nie powinni na niej polegać. Jednak nadal jest widoczny:

>>> f = Foo()
>>> f.x
3
>>> f._y
4

Nazwa zmiennej zaczynająca się od dwóch podkreślników jest nadal Publiczna, ale jest zniekształcona przez nazwę i przez to trudniejsza do uzyskania:

>>> f.__z  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__z'

Jeśli jednak wiemy, jak działa wymachiwanie nazwą, możemy to zrobić:

>>> f._Foo__z
5

Tzn. nazwa klasy jest poprzedzana nazwą zmiennej z dodatkowym podkreśleniem.

Python nie ma pojęcia "prywatny" w porównaniu do "publicznych" członków; wszystko jest publiczne. Nazwa-mangling jest najsilniejszy-możliwy sygnał programista może wysłać, że zmienna nie powinna być dostępna spoza klasy.

 2
Author: John Fouhy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-22 01:54:49

Source:http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

Name mangling jest procesem używanym przez kompilatory C++ nadającym każdej funkcji w programie unikalną nazwę. W C++ ogólnie programy posiadają co najmniej kilka funkcji o tej samej nazwie. Tak więc mangling nazw może być uważany za ważny aspekt W C++.

Przykład: Zwykle nazwy członków są unikalnie generowane przez połączenie nazwy członka z klasą np. podaną deklaracją:

class Class1
 {
        public:
            int val;
            ...
  };

Val staje się czymś w rodzaju:

  // a possible member name mangling
     val__11Class1
 2
Author: Santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 18:14:27

W Fortran, nazwa mangling jest potrzebna, ponieważ język jest niewrażliwy na wielkość liter, co oznacza, że Foo, FOO, fOo, foo itp.. wszystkie będą miały ten sam symbol, którego nazwa musi być w jakiś sposób znormalizowana. Różne Kompilatory implementują mangling w różny sposób, co jest źródłem wielkich problemów podczas łączenia się z C lub obiektami binarnymi skompilowanymi za pomocą innego kompilatora. Na przykład GNU G77/G95 zawsze dodaje końcowy podkreślnik do nazwy pisanej małymi literami, chyba że nazwa zawiera już jeden lub więcej znaków podkreślam. W tym przypadku dodawane są dwa podkreślenia.

Na przykład, następujący układ

    program test
    end program 

    subroutine foo()
    end subroutine

    subroutine b_ar()
    end subroutine
    subroutine b_a_r()
    end subroutine

Tworzy następujące zniekształcone symbole:

0000000000400806 g     F .text  0000000000000006              b_ar__
0000000000400800 g     F .text  0000000000000006              foo_
000000000040080c g     F .text  0000000000000006              b_a_r__

Aby wywołać Kod Fortran z C, należy wywołać odpowiednio zniekształconą nazwę procedury (oczywiście biorąc pod uwagę możliwe różne strategie manglingu, aby być naprawdę niezależnym od kompilatora). Aby wywołać kod C z fortran, interfejs napisany w języku C musi wyeksportować poprawnie zniekształcone nazwy i przesłać wywołanie do procedury C. Interfejs ten można następnie wywołać z Fortran.

 0
Author: Stefano Borini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-22 02:19:39

Większość języka obiektowego zapewnia funkcję przeciążania. Przeciążenie Funkcji Jeśli jakakolwiek klasa ma wiele funkcji o tych samych nazwach, ale różnych parametrach typu i numeru, to mówi się, że są przeciążone. Funkcja overloading pozwala używać tej samej nazwy dla różnych funkcji.

Sposoby przeciążenia funkcji

  1. poprzez zmianę liczby argumentów.
  2. pozycja listy poprzez posiadanie różnych typów kłótnia.

Jak można osiągnąć przeciążenie funkcji za pomocą namaglowania nazw?
Kompilator C++ rozróżnia różne funkcje podczas generowania kodu obiektowego-zmienia nazwy dodając informacje o argumentach na podstawie typu i liczby argumentów. Ta technika dodawania dodatkowych informacji do form nazw funkcji nazywa się Namaglowaniem nazw. Standard C++ nie określa żadnej konkretnej techniki manipulowania nazwami, więc różne Kompilatory mogą dołączać różne informacje do nazw funkcji. Uruchomiłem przykładowy program na gcc4. 8. 4.

class ABC
{       
 public:
  void fun(long a, long b) {}
  void fun(float a, float b) {} 
  void fun(int a, float b) {}   
};
int main()
{
 ABC obj;
 obj.fun(1l,2l);
 obj.fun(1,2.3f);
 obj.fun(3.2f,4.2f);
 return 0;
}

Ten program posiada 3 Funkcje o nazwie fun, różniące się w zależności od liczby argumentów i ich typów. Nazwy tych funkcji są zniekształcone jak poniżej:

ayadav@gateway1:~$ nm ./a.out |grep fun
000000000040058c W _ZN3ABC3funEff
00000000004005a0 W _ZN3ABC3funEif
000000000040057a W _ZN3ABC3funEll
  • ABC jest ciągiem poleceń dla nazwy klasy
  • fun jest ciągiem potocznym dla nazwy funkcji
  • FF two float-> F Typ argumentów
  • ll dwa długie - > l Typ argumentów
  • if first integer argument - > i i jeden argument float - > f
 0
Author: Ajay yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 05:42:04

W czasie projektowania edytorów linków, języki takie jak C, FORTAN i COBOL nie miały przestrzeni nazw, klas, członków klas i innych rzeczy. Manipulowanie nazw jest wymagane do obsługi funkcji obiektowych, takich jak edytor linków, który ich nie obsługuje. Często pomija się fakt, że edytor linków nie obsługuje dodatkowych funkcji; ludzie sugerują to mówiąc, że ze względu na edytor linków wymagane jest manipulowanie nazwą.

Ponieważ jest tak wiele różnice między wymaganiami językowymi, aby obsługiwać to, co robi name mangling, nie ma prostego rozwiązania problemu, jak go obsługiwać w edytorze linków. Edytory linków są zaprojektowane do pracy z wyjściami (modułami obiektowymi) z różnych kompilatorów i dlatego muszą mieć uniwersalny sposób obsługi nazw.

 0
Author: user34660,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 00:15:06

Wszystkie poprzednie odpowiedzi są poprawne, ale tutaj jest perspektywa Pythona / rozumowanie z przykładem.

Definicja

Jeśli zmienna w klasie ma przedrostek __ (tzn. dwa podkreślniki) & nie ma przyrostka __ (tzn. dwa podkreślniki lub więcej), to jest uważana za prywatny identfier. Interpreter Pythona konwertuje dowolny prywatny identyfikator i zmienia nazwę na _class _ _ identfier

Example:
MyClassName --> _myClassName
__variable --> __variable

Dlaczego

Jest to potrzebne, ponieważ aby uniknąć problemów, które może być spowodowana nadpisywaniem atrybutów. Innymi słowy, aby nadpisać, interpreter Pythona musi być w stanie zbudować oddzielny identyfikator dla metody potomnej w stosunku do metody nadrzędnej i za pomocą __ (podwójnego podkreślenia) umożliwić pythonowi to. W poniższym przykładzie, bez _ _ help ten kod nie zadziałałby.

class Parent:
    def __init__(self):
       self.__help("will take child to school")
    def help(self, activities):
        print("parent",activities)

    __help = help   # private copy of original help() method

class Child(Parent):
    def help(self, activities, days):   # notice this has 3 arguments and overrides the Parent.help()
        self.activities = activities
        self.days = days
        print ("child will do",self.activities, self.days)


# the goal was to extend and override the Parent class to list the child activities too
print ("list parent & child responsibilities")
c = Child()
c.help("laundry","Saturdays")
 0
Author: CPU 100,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 08:26:44

Odpowiedzi tutaj są niesamowite, więc jest to tylko dodatek z mojego małego doświadczenia: używam nazwy mangling, aby wiedzieć, jakie narzędzia (gcc / vs /...) i jak parametry przeszły do stosu i z jaką konwencją wywołania mam do czynienia, i to na podstawie nazwy więc na przykład jeśli see _main wiem, że to Cdecl to samo dla innych

 0
Author: robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 10:36:18