Ugrás a tartalomhoz

name mangling

A Wikiszótárból, a nyitott szótárból


Főnév

name mangling (tsz. name manglings)

  1. (informatika) Name mangling – magyarul: névtorzítás vagy névmanipuláció – egy olyan folyamat, amely során a fordító (compiler) a forráskódbeli neveket módosítja, hogy azok egyértelműek legyenek a fordított (gépi) kódban. Ez különösen fontos a többféle azonos nevű elem (pl. függvények, osztályok, névterek) kezelésénél, amikor a célplatform nem támogatja közvetlenül a név túlterhelést.



🧠 1. Miért van rá szükség?

Fő ok:

A C++ például lehetővé teszi a függvény túlterhelést (ugyanaz a név, más paraméterlista), de az alacsony szintű linker csak egyedi nevekkel tud dolgozni.

💡 Name mangling segítségével a fordító új, egyedi azonosítókat hoz létre, amelyek tükrözik a paraméterek típusait, névtereket, osztályokat, stb.



🔧 2. Hogyan működik?

A fordító minden entitás nevét átalakítja:

  • Az új név tartalmazza:
    • az eredeti nevet
    • a paramétertípusokat
    • a névtereket / osztályokat
    • esetleg a visszatérési típust

Példa (GCC stílusú mangling):

void foo(int x);
void foo(double x);

→ A fordító belsőleg:

_foo_int → _Z3fooi
_foo_double → _Z3food
  • Z a mangling előtag
  • 3foo → név hossza + név
  • iint, ddouble



📦 3. Hol használatos?

  • C++, Rust, Swift, D, stb.
  • Nem használja a klasszikus C, ahol nincsen név túlterhelés



🛠️ 4. Demangle: név visszafejtése

Unixon használható például a c++filt parancs:

$ echo "_Z3fooi" | c++filt
foo(int)

🧩 5. Problémák

  • 🔥 ABI inkompatibilitás: két különböző fordító eltérő mangling-szabályokat használhat → a binárisok nem kompatibilisek
  • 🧪 Debugging nehezebb: a mangled nevek nehezen olvashatók
  • 🔒 Name mangling nem egységes: GCC ≠ MSVC ≠ Clang



📌 6. Névtorzítás elkerülése

Ha C++-ból C-függvényt akarunk hívni (vagy fordítva), akkor a C linkage használható:

extern "C" void foo();

Ez megmondja a fordítónak, hogy ne manglingelje a foo nevet → így C-kompatibilis lesz.



🧾 7. Összefoglalás

A name mangling:

  • Egy automatikus folyamat, amely a fordító által generált egyedi szimbólumneveket hoz létre
  • Különösen fontos olyan nyelvekben, ahol van:
    • függvény túlterhelés
    • névterek
    • osztály alapú szervezés
  • Hasznos, de okozhat kompatibilitási és debugolási problémákat