Что называется mangling, и как это работает?

Пожалуйста, объясните, что такое имя, как он работает, как он работает, какую проблему он решает, и в каких контекстах и ​​языках используется. Стратегии изменения имени (например, какое имя выбрано компилятором и почему) плюс.

38
22 авг. '09 в 3:20
источник поделиться
8 ответов

В языке программирования по вашему выбору, если идентификатор экспортируется из отдельно скомпилированного модуля, ему требуется имя, с помощью которого оно известно во время ссылки. Название mangling решает проблему перегруженных идентификаторов в языках программирования. (Идентификатор "перегружен", если одно и то же имя используется в нескольких контекстах или имеет более одного значения.)

Некоторые примеры:

  • В С++ функция или метод get может быть перегружена несколькими типами.

  • В Ada или Modula-3 функция get может отображаться в нескольких модулях.

Несколько типов и несколько модулей охватывают обычные контексты.

Типичные стратегии:

  • Сопоставьте каждый тип с строкой и используйте объединенный идентификатор высокого уровня и "введите строку" в качестве имени времени ссылки. Common в С++ (особенно легко, поскольку перегрузка разрешена только для функций/методов и только для типов аргументов) и Ada (где вы также можете перегружать также типы результатов).

  • Если идентификатор используется в более чем одном модуле или пространстве имен, соедините имя модуля с именем идентификатора, например List_get вместо List.get.

В зависимости от того, какие символы являются законными в именах ссылок, вам, возможно, придется выполнять дополнительное манипулирование; например, может быть необходимо использовать символ подчеркивания как символ "escape", поэтому вы можете различать

  • List_my.getList__my_get

от

  • List.my_getList_my__get

(По общему признанию, этот пример подходит, но, как писатель компилятора, я должен гарантировать, что различные идентификаторы в исходной кодовой карте обозначаются разными именами ссылок. В этом вся причина и цель имени коверкание.)

35
22 авг. '09 в 5:40
источник

Связанные вопросы


Похожие вопросы

Проще говоря, манипуляция имен - это процесс, с помощью которого компиляторы меняют имена идентификаторов в вашем исходном коде, чтобы помочь linker в неоднозначности между этими идентификаторами.

В Википедии есть замечательная статья по этому вопросу с несколькими замечательными примерами.

23
22 авг. '09 в 3:25
источник

Название mangling - это средство, с помощью которого компиляторы модифицируют "скомпилированное" имя объекта, чтобы оно отличалось от того, что вы указали в последовательно.

Это позволяет языку программирования гибко предоставлять одно и то же имя нескольким, скомпилированным объектам и иметь последовательный способ поиска соответствующего объекта. Например, это позволяет нескольким классам с тем же именем существовать в разных пространствах имен (часто, добавляя пространство имен в имя класса и т.д.).

Перегрузка операторов и методов на многих языках делает это еще дальше - каждый метод заканчивается "искаженным" именем в скомпилированной библиотеке, чтобы разрешить существование нескольких методов одного типа с тем же именем.

4
22 авг. '09 в 3:27
источник

В python имя-mangling - это система, в которой переменные класса имеют разные имена внутри и вне класса. Программист "активирует" его, поставив два символа подчеркивания в начале имени переменной.

Например, я могу определить простой класс с некоторыми членами:

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

В практике python имя переменной, начинающееся с подчеркивания, является "внутренним", а не частью интерфейса класса, поэтому программисты не должны полагаться на него. Однако это все еще видно:

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

Имя переменной, начинающееся с двух символов подчеркивания, по-прежнему общедоступно, но оно искажено с именами и, следовательно, более трудным для доступа:

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

Если мы знаем, как работает работа с именами, мы можем получить:

>>> f._Foo__z
5

то есть. имя класса добавляется к имени переменной с дополнительным подчеркиванием.

Python не имеет понятия 'private' против 'public' членов; все открыто. Манипуляция имени - это самый сильный сигнал, который программист может отправить, что переменная не должна быть доступна извне класса.

2
22 авг. '09 в 4:54
источник

Источник: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

Обработка имени - это процесс, используемый компиляторами С++, дает каждой функции в вашей программе уникальное имя. В С++ обычно программы имеют по меньшей мере несколько функций с тем же именем. Таким образом, определение имени может рассматриваться как важный аспект в С++.

Пример:          Обычно имена участников генерируются уникально путем объединения имени элемента с именем класса, например. с учетом декларации:

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

val становится чем-то вроде:

  // a possible member name mangling
     val__11Class1
2
12 марта '14 в 21:14
источник

В Fortran требуется указать mangling, потому что язык нечувствителен к регистру, что означает, что Foo, FOO, fOo, foo и т.д. все будут решаться с тем же символом, чье имя должно быть каким-то образом нормировано. Различные компиляторы реализуют mangling по-разному, и это источник больших проблем при взаимодействии с C или двоичными объектами, скомпилированными с другим компилятором. Например, GNU g77/g95 всегда добавляет завершающее подчеркивание к имени с нижним регистром, если только имя не содержит одного или нескольких символов подчеркивания. В этом случае добавляются два символа подчеркивания.

Например, следующая процедура

    program test
    end program 

    subroutine foo()
    end subroutine

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

Производит следующие искаженные символы:

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

Чтобы вызвать код Fortran из C, необходимо вызвать правильно обработанное имя подпрограммы (очевидно, что в нем учитываются различные стратегии манипуляции, которые действительно независимы от компилятора). Чтобы вызвать код C из fortran, C-написанный интерфейс должен экспортировать правильно искаженные имена и перенаправить вызов в процедуру C. Затем этот интерфейс можно вызвать из Fortran.

0
22 авг. '09 в 5:08
источник

Большая часть объектно-ориентированного языка обеспечивает функцию перегрузки функции. Перегрузка функций Если какой-либо класс имеет несколько функций с одинаковыми именами, но с разными типами параметров и номером, то они, как говорят, перегружены. Перегрузка функций позволяет использовать одно и то же имя для разных функций.

Способы перегрузки функции

  • Изменив количество аргументов.
  • Элемент списка Имея разные типы аргументов.

Как перегрузка функций достигается при смене имени?
Компилятор С++ различает разные функции при генерации объектного кода - он изменяет имена, добавляя информацию о аргументах на основе типа и количества аргументов. Эта методика добавления дополнительной информации для формирования имен функций называется именем Mangling. Стандарт С++ не указывает какую-либо конкретную технику для управления именами, поэтому разные компиляторы могут добавлять различную информацию к именам функций. Я запустил программу-образец на 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;
}

В этой программе есть 3 функции с именем fun с разницей в зависимости от количества аргументов и их типов. Имя этих функций искажено, как показано ниже:

ayadav@gateway1:~$ nm ./a.out |grep fun
000000000040058c W _ZN3ABC3funEff
00000000004005a0 W _ZN3ABC3funEif
000000000040057a W _ZN3ABC3funEll
  • ABC - это командная строка для имени класса
  • fun - общая строка для имени функции
  • ff два типа аргументов float- > f
  • ll два аргумента longof > l typeof
  • если первый целочисленный аргумент- > я и один аргумент float- > f
0
24 дек. '15 в 8:42
источник

В то время, когда были созданы редакторы ссылок, такие языки, как C, FORTAN и COBOL, не имели пространств имен, классов, членов классов и т.д. Для управления объектно-ориентированными функциями, такими как редактор ссылок, который не поддерживает их, требуется управление именами. Тот факт, что редактор ссылок не поддерживает дополнительные функции, часто пропускается; люди подразумевают это, заявляя, что из-за редактора ссылок требуется изменение имени.

Так как существует много различий между языковыми требованиями для поддержки того, что происходит с именем man, нет простого решения проблемы того, как его поддерживать в редакторе ссылок. Редакторы Link предназначены для работы с выводами (объектных модулей) из множества компиляторов и поэтому должны иметь универсальный способ поддержки имен.

0
21 нояб. '17 в 3:15
источник

Посмотрите другие вопросы по меткам или Задайте вопрос