59 votes

Qu'est-ce que le nom mangling et comment fonctionne-t-il?

Veuillez expliquer en quoi consistent les mutilations de noms, comment cela fonctionne, quel problème il résout et dans quels contextes et quelles langues est utilisé. Stratégies de gestion des noms (par exemple, quel nom est choisi par le compilateur et pourquoi) un plus.

45voto

Norman Ramsey Points 115730

Dans le langage de programmation de votre choix, si un identifiant est exporté à partir d'un compilés séparément de l'unité, il a besoin d'un nom par lequel il est connu au moment de la liaison. Name mangling résout le problème de la surcharge des identificateurs dans les langages de programmation. (Un identifiant est "surchargé" si le même nom est utilisé dans plus d'un contexte ou avec plus d'une signification.)

Quelques exemples:

  • En C++, une fonction ou une méthode get peut-être surchargé à plusieurs types.

  • Dans Ada ou Modula-3, la fonction get peut apparaître dans plusieurs modules.

Plusieurs types et plusieurs modules couvrent l'habitude contextes.

Les méthodes typiques:

  • Carte de chaque type de chaîne et de l'utilisation du combiné de haut niveau de l'identificateur de type "chaîne" comme le lien-temps nom. Commun en C++ (surtout facile depuis la surcharge est autorisé uniquement pour les fonctions/méthodes et uniquement sur les types d'argument) et Ada (où vous pouvez surcharger les types de résultats ainsi).

  • Si un identifiant est utilisé dans plus d'un module ou d'espace de noms, de joindre le nom du module avec le nom de l'identificateur, par exemple, List_get au lieu de List.get.

Selon quels caractères sont légaux en lien-le temps des noms, vous pouvez avoir à faire des mutilations; par exemple, il peut être nécessaire d'utiliser le trait de soulignement comme une façon de "s'échapper" de caractère, de sorte que vous pouvez distinguer

  • List_my.get -> List__my_get

à partir de

  • List.my_get -> List_my__get

(Certes, cet exemple est d'atteindre, mais comme un compilateur écrivain, j'ai garantir que distincts des identifiants dans le code source de la carte distincts lien-temps les noms. C'est toute la raison et le but pour le nom de déformation.)

26voto

Andrew Hare Points 159332

En termes simples, la gestion des noms est un processus par lequel les compilateurs modifient les noms des identifiants dans votre code source afin d'aider l' éditeur de liens à éliminer les ambiguïtés de ces identifiants.

Wikipedia a un excellent article sur ce sujet avec plusieurs excellents exemples.

5voto

Reed Copsey Points 315315

Name mangling est un moyen par lequel les compilateurs de modifier le "compilé" nom d'un objet, pour la rendre différente de celle que vous avez spécifiée de manière cohérente.

Cela permet à un langage de programmation de la flexibilité nécessaire pour fournir le même nom à plusieurs, objets compilés, et de manière cohérente à la recherche de l'objet approprié. Par exemple, cela permet à plusieurs classes avec le même nom existe dans différents espaces (souvent en ajoutant l'espace de noms dans le nom de la classe, etc).

De l'opérateur et de la surcharge de méthode dans de nombreux langages de faire un pas de plus - chaque méthode se termine par une "déformation" du nom de la bibliothèque compilé afin de permettre à plusieurs méthodes sur un type d'exister avec le même nom.

5voto

John Fouhy Points 14700

En python, le nom du modificateur est un système qui classe les variables ont des noms différents à l'intérieur et à l'extérieur de la classe. Le programmeur "active" en mettant deux caractères de soulignement au début du nom de la variable.

Par exemple, je peux définir une classe simple avec quelques membres:

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

En python pratique, un nom de variable en commençant par un trait de soulignement est "interne" et ne fait pas partie de l'interface de classe, et donc les programmeurs ne doivent pas compter sur elle. Cependant, il est toujours visible:

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

Un nom de variable en commençant par deux caractères de soulignement est encore public, mais c'est le nom de déformation et donc plus difficile d'accès:

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

Si nous savons comment le nom de modificateur de travaux, cependant, nous pouvons parvenir à:

>>> f._Foo__z
5

c'est à dire le nom de la classe est ajouté au début du nom de la variable avec un supplément de soulignement.

Python n'a pas de notion de "privé" par rapport au "public" membres; tout est public. Nom du modificateur est le meilleur signal possible un programmeur peut envoyer que la variable ne doit pas être accessible depuis l'extérieur de la classe.

3voto

Sannny Points 310

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

Name mangling est le processus utilisé par les compilateurs C++ donner à chaque fonction dans votre programme un nom unique. En C++, en général, des programmes ont au moins quelques fonctions avec le même nom. Ainsi, le nom de déformation peut être considérée comme un aspect important dans le C++.

Exemple: Généralement, les noms des membres sont uniquement générés par la concaténation du nom de la membre de la classe par exemple, compte tenu de la déclaration:

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

val devient quelque chose comme:

  // a possible member name mangling
     val__11Class1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X