Name mangling — compiler yoki runtime source code’dagi nomni boshqa, odatda qo‘shimcha ma’lumot kodlangan symbol nomiga aylantirish jarayonidir. Bu ayniqsa function overloading, namespace, class method va generic type mavjud tillarda linker bir xil yozilgan elementlarni farqlashi uchun kerak. Mangled nom inson o‘qishi uchun mo‘ljallanmagan va compiler ABI’sining qismidir.
Symbolga ma’lumot kodlash
C tilida function nomi ko‘pincha object file’da source’dagi nomga yaqin bo‘ladi. C++ da esa render(int) va render(double) linker uchun ikki alohida symbol bo‘lishi kerak. Compiler function nomi, namespace, class va parameter type’larini kodlab unique nom yaratadi. Turli compiler yoki ABI turli format ishlatishi mumkin.
Object file symbol jadvali mangled nomni saqlaydi. Linker shu nom orqali declaration va definitionni bog‘laydi. Debugger hamda stack trace vositasi demangling qilib, foydalanuvchiga source’ga yaqin ko‘rinishni qaytaradi. Unix vositalarida demangler yoki nm parametrlaridan foydalanish mumkin.
ABI va interoperabilitet
Name mangling formatini o‘zgartirish oldindan compile qilingan kutubxona bilan binary compatibilityni buzadi. Shu sababli platform ABI version, calling convention, object layout va exception modeli bilan birga symbol kodlashini ham belgilaydi. Bir xil tilning ikki toolchain’i source-compatible, lekin binary-incompatible bo‘lishi mumkin.
C++ kutubxonani C yoki boshqa tilga ochishda extern "C" kabi linkage specification manglingni C usuliga moslaydi. Bu function signature’ni avtomatik portativ qilmaydi: type, ownership, allocation va error handling uchun barqaror Foreign Function Interface shartnomasi zarur. Public native API’da oddiy C-compatible surface ko‘pincha uzoq muddatli barqarorlik beradi.
Private nomlar bilan chalkashlik
Ba’zi tillar encapsulation uchun ham “name mangling” atamasini ishlatadi. Python class ichidagi __value nomini class nomi bilan o‘zgartirib, subclass’da tasodifiy to‘qnashuvni kamaytiradi. Bu haqiqiy access control emas: o‘zgartirilgan nomni bilgan kod qiymatga kira oladi. Compiler symbol mangling esa asosan linking va overloadni ifodalashga xizmat qiladi.
JavaScript bundler minification paytida local variable nomlarini qisqartiradi; bu ham boshqa maqsad. Obfuscation kodni tushunishni qiyinlashtiradi, ammo xavfsizlik chegarasi bermaydi. Termin kontekst bilan talqin qilinadi.
Diagnostika
“Undefined symbol” xatosida declaration bilan definition signature’i, compiler ABI, architecture va visibility tekshiriladi. Bitta const, namespace yoki calling convention farqi boshqa mangled nom yaratishi mumkin. Export qilingan symbollar ro‘yxatini release’lar orasida taqqoslash kutilmagan ABI buzilishini erta topadi. Debug symbol alohida saqlansa, production binary kichik qoladi, crash report esa build ID orqali to‘g‘ri symbol fayliga bog‘lanadi.
Tooling va build konfiguratsiyasi
Symbol visibility manglingdan alohida boshqariladi. Hidden symbol binary ichida bo‘lishi, ammo dynamic export table’da ko‘rinmasligi mumkin. Export allowlist public ABI yuzasini kichraytiradi va ichki implementatsiyaning tasodifiy dependencyga aylanishini cheklaydi. Link-time optimization functionni inline qilib, alohida symbolni butunlay yo‘qotishi mumkin; profiler va debugger optimized frame’ni shunga mos talqin qiladi. Plugin host exact mangled C++ symbolga bog‘lansa compiler update’da buzilishi oson. Versionlangan C entry point, capability negotiation va struct size maydoni turli plugin versiyalarini xavfsizroq bog‘laydi. Build pipeline exported ABI reportni saqlab, removal va signature o‘zgarishini release reviewga chiqaradi.
Bog‘liq tushunchalar
ABI, Linker, Symbol table, Function overloading, Demangling, Foreign Function Interface, Calling convention