پرش به محتوا

پیش‌نویس:خرد کردن نام

از ویکی‌پدیا، دانشنامهٔ آزاد

در ساخت کامپایلر ، خرد کردن نام (که به آن دکوراسیون نام نیز گفته می شود) روشی است که در بسیاری از زبان های برنامه نویسی جدید برای حل مشکلات ناشی از نیاز به تعریف کردن اسامی منحصر به فرد استفاده می‌شود.

این روش، راهی را برای رمزگذاری اطلاعات افزوده در نام یک تابع، ساختار، کلاس یا داده‌ساختار‌های دیگر ارائه می‌دهد تا اطلاعات بیشتری از طرف کامپایلر‌ها به پیوند‌دهنده‌ها منتقل شود.

نیاز به چنین روشی زمانی به چشم می‌آید که در زبان برنامه‌نویسی،‌ امکان تعریف موجودیت‌های مختلف با شناسه‌ی یکسان تا زمانی که فضای نام و یا امضاء‌های متفاوتی دارند (مانند بار اضافی توابع) فراهم باشد.

هر کد هدفی که توسط کامپایلر تولید شده باشد، معمولا توسط برنامه‌ای به نام پیوند‌دهنده به قطعات دیگری از کد هدف (که ممکن است توسط همین کامپایلر و یا کامپایلر دیگری تولید شده باشند) متصل می‌شود. پیوند‌دهنده برای این کار نیاز به اطلاعات جامعی از هر موجودیت برنامه دارد. برای مثال برای آن که یک تابع را به درستی به کد اصلی متصل کند، نیاز به نام، تعداد پارامتر‌ها و نوع پارامتر‌هایش و ... دارد.

مثال ها

[ویرایش]

با وجود این که خرد‌ کردن نام معمولا در زبان‌هایی که از بار اضافی توابع پشتیبانی نمی‌کنند (مانند 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 صرفا یک زیرین‌خط ابتدای اسم تابع قرار می‌دهیم.

قرارداد ۶۴ بیتی در ویندوز، در ابتدای اسم زیرین‌خط ندارد. این تفاوت باعث می‌شود که در برخی مواقع خاص در هنگام تبدیل کردن کد به نسخه‌ی ۶۴ بیتی، تعدادی ارجاع حل نشده باقی بماند.

همچنین ببینید

[ویرایش]

منابع

[ویرایش]

لینک های خارجی

[ویرایش]