پیشنویس:خرد کردن نام
در ساخت کامپایلر ، خرد کردن نام (که به آن دکوراسیون نام نیز گفته می شود) روشی است که در بسیاری از زبان های برنامه نویسی جدید برای حل مشکلات ناشی از نیاز به تعریف کردن اسامی منحصر به فرد استفاده میشود.
این روش، راهی را برای رمزگذاری اطلاعات افزوده در نام یک تابع، ساختار، کلاس یا دادهساختارهای دیگر ارائه میدهد تا اطلاعات بیشتری از طرف کامپایلرها به پیونددهندهها منتقل شود.
نیاز به چنین روشی زمانی به چشم میآید که در زبان برنامهنویسی، امکان تعریف موجودیتهای مختلف با شناسهی یکسان تا زمانی که فضای نام و یا امضاءهای متفاوتی دارند (مانند بار اضافی توابع) فراهم باشد.
هر کد هدفی که توسط کامپایلر تولید شده باشد، معمولا توسط برنامهای به نام پیونددهنده به قطعات دیگری از کد هدف (که ممکن است توسط همین کامپایلر و یا کامپایلر دیگری تولید شده باشند) متصل میشود. پیونددهنده برای این کار نیاز به اطلاعات جامعی از هر موجودیت برنامه دارد. برای مثال برای آن که یک تابع را به درستی به کد اصلی متصل کند، نیاز به نام، تعداد پارامترها و نوع پارامترهایش و ... دارد.
مثال ها
[ویرایش]C
[ویرایش]با وجود این که خرد کردن نام معمولا در زبانهایی که از بار اضافی توابع پشتیبانی نمیکنند (مانند C و calssic Pascal) نیاز نمیشود، از آنها در برخی کاربردها برای ارائهی اطلاعات بیشتر در مورد توابع استفاده میشود. به عنوان مثال کامپایلرهایی که هدفشان اجرا شدن برنامه در پلتفرمهای مایکروسافت ویندوز است، از قراردادهای فراخوانی مختلفی پشتیبانی میکنند که شیوهی ارسال پارامترها به زیرروالها و دریافت نتایج برگردانده شده را مشخص میکنند. از آنجا که این قراردادهای فراخوانی با هم سازگاری ندارند، کامپایلرها از خرد کردن استفاده میکنند تا بفهمند برای صدا کردن یک زیرروال از کدام قرارداد باید استفاده شود.
روش خرد کردن توسط مایکروسافت ایجاد شد و پس از آن به صورت غیر رسمی توسط کامپایلرهای دیگری مانند Digital Mars، Borland و GNU GCC در هنگام کامپایل کردن کد برای پلتفرمهای ویندوز استفاده شد. حتی بعدها در زبانهای دیگری مانند Pascal، D، Delphi، Fortran و C# به کار رفت. این موضوع به زیرروالهای نوشته شده در زبانهای مذکور این امکان را میدهد که توسط کتابخانههای ویندوز و با استفاده از قرارداد فراخوانی متفاوتی نسبت به پیشفرض خودشان صدا زده شوند.
هنگام کامپایل کردن مثالهای زیر که به زبان C هستند:
int _cdecl f (int x) { return 0; }
int _stdcall g (int y) { return 0; }
int _fastcall h (int z) { return 0; }
کامپایلرهای 32 بیتی به ترتیب موارد زیر را خروجی میدهند:
_f _g@4 @h@4
در stdcall
و fastcall
که روشهایی برای خرد کردن نام هستند، به ترتیب تابع به صورت _name@X
و @name@X
رمزگذاری میشود که X تعداد بایتهای ورودی(ها) در لیست پارامترها (شامل آنهایی که در fastcall
در ثباتها پاس داده میشوند) در مبنای ۱۰ است. در حالت cdecl
صرفا یک زیرینخط ابتدای اسم تابع قرار میدهیم.
قرارداد ۶۴ بیتی در ویندوز، در ابتدای اسم زیرینخط ندارد. این تفاوت باعث میشود که در برخی مواقع خاص در هنگام تبدیل کردن کد به نسخهی ۶۴ بیتی، تعدادی ارجاع حل نشده باقی بماند.
C++
[ویرایش]همچنین ببینید
[ویرایش]- رابط برنامه نویسی برنامه
- رابط باینری برنامه
- کنوانسیون فراخوان
- مقایسه دستگاههای مجازی کاربردی
- رابط کاربری خارجی
- رابط بومی جاوا
- الزام آور زبان
- ایستادن
- SWIG
منابع
[ویرایش]لینک های خارجی
[ویرایش]- Linux Itanium ABI برای C ++ ، از جمله طرح نامگذاری
- مشخصات استاندارد Macintosh C / C ++ ABI
- c ++ filtre - برای حذف نمادهای رمزگذاری شده C ++ برای کامپایلرهای GNU / Intel فیلتر کنید
- undname - ابزار msvc برای demangle کردن نام ها.
- demangler.com - یک ابزار آنلاین برای دیوانه کردن نمادهای GCC و MSVC C ++
- سیستم زمان اجرا Objective-C - از زبان برنامه نویسی Objective-C اپل 1.0
- کنوانسیون های فراخوان برای کامپایلرهای مختلف C ++ توسط آگنر مه ، شامل توضیحات مفصلی در مورد نقشه های نامشخص برای کامپایلرهای مختلف x86 و x64 C ++ (pp) است. 24-42 در نسخه 2011-06-08)
- نام C ++ Mangling / Demangling کاملاً توضیح دقیق درباره طرح mangling نام کامپایلر Visual C ++
- PHP UnDecorateSymbolName یک اسکریپت php که نام عملکردهای Microsoft Visual C را ویران می کند.
- مخلوط کردن کد C و C ++
- مدیریت نماد - "لینک دهنده ها و لودرها" توسط جان R. لووین
- mangling نام تغییر یافته توسط Fivos Kefallonitis