Пожалуйста, объясните, что такое имя, как он работает, как он работает, какую проблему он решает, и в каких контекстах и языках используется. Стратегии изменения имени (например, какое имя выбрано компилятором и почему) плюс.
Что называется mangling, и как это работает?
Ответ 1
В языке программирования по вашему выбору, если идентификатор экспортируется из отдельно скомпилированного модуля, ему требуется имя, с помощью которого оно известно во время ссылки. Название mangling решает проблему перегруженных идентификаторов в языках программирования. (Идентификатор "перегружен", если одно и то же имя используется в нескольких контекстах или имеет более одного значения.)
Некоторые примеры:
-
В С++ функция или метод
get
может быть перегружена несколькими типами. -
В Ada или Modula-3 функция
get
может отображаться в нескольких модулях.
Несколько типов и несколько модулей охватывают обычные контексты.
Типичные стратегии:
-
Сопоставьте каждый тип с строкой и используйте объединенный идентификатор высокого уровня и "введите строку" в качестве имени времени ссылки. Common в С++ (особенно легко, поскольку перегрузка разрешена только для функций/методов и только для типов аргументов) и Ada (где вы также можете перегружать также типы результатов).
-
Если идентификатор используется в более чем одном модуле или пространстве имен, соедините имя модуля с именем идентификатора, например
List_get
вместоList.get
.
В зависимости от того, какие символы являются законными в именах ссылок, вам, возможно, придется выполнять дополнительное манипулирование; например, может быть необходимо использовать символ подчеркивания как символ "escape", поэтому вы можете различать
-
List_my.get
→List__my_get
от
-
List.my_get
→List_my__get
(По общему признанию, этот пример подходит, но, как писатель компилятора, я должен гарантировать, что различные идентификаторы в исходной кодовой карте обозначаются разными именами ссылок. В этом вся причина и цель имени коверкание.)
Ответ 2
Проще говоря, манипуляция имен - это процесс, с помощью которого компиляторы меняют имена идентификаторов в вашем исходном коде, чтобы помочь linker в неоднозначности между этими идентификаторами.
В Википедии есть замечательная статья по этому вопросу с несколькими замечательными примерами.
Ответ 3
Название mangling - это средство, с помощью которого компиляторы модифицируют "скомпилированное" имя объекта, чтобы оно отличалось от того, что вы указали в последовательно.
Это позволяет языку программирования гибко предоставлять одно и то же имя нескольким, скомпилированным объектам и иметь последовательный способ поиска соответствующего объекта. Например, это позволяет нескольким классам с тем же именем существовать в разных пространствах имен (часто, добавляя пространство имен в имя класса и т.д.).
Перегрузка операторов и методов на многих языках делает это еще дальше - каждый метод заканчивается "искаженным" именем в скомпилированной библиотеке, чтобы разрешить существование нескольких методов одного типа с тем же именем.
Ответ 4
В 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' членов; все открыто. Манипуляция имени - это самый сильный сигнал, который программист может отправить, что переменная не должна быть доступна извне класса.
Ответ 5
Источник: 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
Ответ 6
В 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.
Ответ 7
Большая часть объектно-ориентированного языка обеспечивает функцию перегрузки функции. Перегрузка функций Если какой-либо класс имеет несколько функций с одинаковыми именами, но с разными типами параметров и номером, то они, как говорят, перегружены. Перегрузка функций позволяет использовать одно и то же имя для разных функций.
Способы перегрузки функции
- Изменив количество аргументов.
- Элемент списка Имея разные типы аргументов.
Как перегрузка функций достигается при смене имени?
Компилятор С++ различает разные функции при генерации объектного кода - он изменяет имена, добавляя информацию о аргументах на основе типа и количества аргументов. Эта методика добавления дополнительной информации для формирования имен функций называется именем 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 с разницей в зависимости от количества аргументов и их типов. Имя этих функций искажено, как показано ниже:
[email protected]:~$ 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
Ответ 8
В то время, когда были созданы редакторы ссылок, такие языки, как C, FORTAN и COBOL, не имели пространств имен, классов, членов классов и т.д. Для управления объектно-ориентированными функциями, такими как редактор ссылок, который не поддерживает их, требуется управление именами. Тот факт, что редактор ссылок не поддерживает дополнительные функции, часто пропускается; люди подразумевают это, заявляя, что из-за редактора ссылок требуется изменение имени.
Так как существует много различий между языковыми требованиями для поддержки того, что происходит с именем man, нет простого решения проблемы того, как его поддерживать в редакторе ссылок. Редакторы Link предназначены для работы с выводами (объектных модулей) из множества компиляторов и поэтому должны иметь универсальный способ поддержки имен.