موضوع مقاله: دستکاری نام | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # دستکاری نام | مقدمه: در ساخت کامپایلر، دستکاری نام (که به آن دکوراسیون نام نیز گفته می‌شود) روشی است که در بسیاری از زبان‌های برنامه‌نویسی جدید و سطح بالا برای حل مشکلات ناشی از نیاز به تعریف کردن اسامی منحصر به فرد در هنگام ترجمه به زبان سطح پایین‌تر استفاده می‌شود. | ## بخش 1: دستکاری نام | این روش، راهی را برای کدگذاری اطلاعات اضافی در نام یک متغیر، تابع، ساختار، کلاس یا نوع‌دادهی دیگر ارائه می‌دهد تا اطلاعات بیشتری از طرف کامپایلرها به پیونددهنده‌ها منتقل شود تا بتوانند اسامی مشترک را از یکدیگر تمیز دهند. چرا که این ویژگی در زبان‌های سطح پایین‌تر (مثلاً اسمبلیها) وجود ندارد و نیاز است که با استفاده از راه دیگری به حل تداخل‌های به وجود آمده در نام‌ها پرداخته شود. نیاز به چنین روشی زمانی به چشم می‌آید که در یک زبان برنامه‌نویسی، امکان تعریف موجودیت‌های مختلف با شناسه‌ی یکسان فراهم باشد (تا زمانی که فضای نام یا امضاءهای متفاوتی داشته باشند). هر کد هدفی که توسط کامپایلر تولید شده باشد، معمولاً توسط برنامه‌ای به نام پیونددهنده به قطعات دیگری از کد هدف (که ممکن است توسط همین کامپایلر یا کامپایلر دیگری تولید شده باشند) متصل می‌شود. برای مثال برای آن که یک تابع را به درستی به کد اصلی متصل کند، نیاز به نام، تعداد پارامترها و نوع پارامترهایش دارد. کمک به پیونددهنده در تشخیص دادن این که توابع و شیءها در تمام ماژول‌ها به‌طور یکسانی تعریف شده باشند. کمک به پیونددهنده در دادن پیغام خطای مناسب در هنگام مواجهه با تداخل‌های غیرقابل رفع. در ابتدا دستکاری نام تنها برای هدف اول ایجاد شد ولی بعدها در کامپایلرها از آن برای اهداف دیگر نیز استفاده شد. به همین دلیل ممکن است برخی کامپایلرها تنها هدف اول را به کمک دستکاری نام انجام دهند و برای انجام دادن دو کار دیگر از روش‌های دیگری بهره بگیرند. چگونگی دستکاری نام کامپایلرهای مختلف، به روش‌های مختلفی این کار را انجام می‌دهند. | ## بخش 2: دستکاری نام | اما در نهایت همهٔ آنها نام‌ها را در زبان مقصد به طریقی تغییر می‌دهند که به یک مجموعه نام منحصر به فرد برای موجودیت‌های برنامه برسند. دو تابع با نام یکسان، مجبورند که امضاءهای متفاوتی داشته باشند (امضای توابع شامل تعداد، نوع و ترتیب ورودی‌های و خروجی‌هایش است). از همین تفاوت می‌توان استفاده کرد تا برای توابع نام‌های منحصر به فردی تولید کرد. می‌توان قبل از نام تابع نوع خروجی‌اش را ذکر کرد و پس از آن نیز نوع ورودی‌هایش را به ترتیب آورد و تمام این‌بخش‌ها را با استفاده از زیر خط از هم جدا کرد. C با وجود این که دستکاری نام معمولاً در زبان‌هایی که از اضافه بار توابع پشتیبانی نمی‌کنند (مانند C و classic Pascal) نیاز نمی‌شود، از آن‌ها در برخی کاربردها برای ارائهٔ اطلاعات بیشتر در مورد توابع استفاده می‌شود. به عنوان مثال کامپایلرهایی که هدفشان اجرا شدن برنامه در پلتفرم‌های مایکروسافت ویندوز است، از قراردادهای فراخوانی مختلفی پشتیبانی می‌کنند که شیوهٔ ارسال پارامترها به زیرروال‌ها و دریافت نتایج برگردانده شده را مشخص می‌کنند. از آنجا که این قراردادهای فراخوانی با هم سازگاری ندارند، کامپایلرها از دستکاری استفاده می‌کنند تا بفهمند برای صدا کردن یک زیرروال از کدام قرارداد باید استفاده شود. این موضوع به زیرروال‌های نوشته شده در زبان‌های مذکور این امکان را می‌دهد که توسط کتابخانه‌های ویندوز و با استفاده از قرارداد فراخوانی متفاوتی نسبت به پیش‌فرض خودشان صدا زده شوند. این تفاوت باعث می‌شود که در برخی مواقع خاص در هنگام تبدیل کردن کد به نسخهٔ ۶۴ بیتی، تعدادی ارجاع حل‌نشده باقی‌بماند. در استاندارد ++C روش خاصی برای دستکاری نام مشخص نشده‌است بنابراین کامپایلرهای مختلف ممکن است اطلاعات متفاوتی را در اسم‌ها وارد کنند. | ## بخش 3: دستکاری نام | نمونه‌های اولیهٔ کامپایلرهای ++C کد منبع را به کد زبان C تبدیل می‌کردند و سپس آن کد باید به کد هدف که قابل اجرا بر روی ماشین است تبدیل شود. حتی بعدها که کامپایلرهایی برای ++C نوشته شدند که کد منبع را مستقیماً به کد قابل اجرا بر روی ماشین تبدیل می‌کردند، پیونددهنده‌های سیستم عموماً از نمادهای ++C پشتیبانی نمی‌کردند و در نتیجه دستکاری نام کماکان نیاز بود. ++C همچنین شامل ساختارها و ویژگی‌های پیچیده‌ای نظیر کلاس‌ها، قالب‌ها، فضاهای نام و سربارگذاری عملگرها می‌باشد که معنی یک نماد مشخص را بسته به موقعیتی که در آن استفاده می‌شود، تغییر می‌دهد. فراداده در مورد این ویژگی‌ها، با استفاده از دستکاری نام نمادها ممکن است ابهام‌آمیز باشند. از آنجا که سیستم‌های دستکاری نام برای این ویژگی‌ها میان کامپایلرهای مختلف یکسان نیستند، تنها تعداد کمی از پیونددهنده‌ها می‌توانند کد شیءای که توسط کامپایلرهای مختلف تولید شده‌اند را پیوند دهند. در ++C نام متغیر یک فضای نام نیز دستکاری می‌شود به این صورت که اسم فضای نام به آن اضافه می‌شود تا بتوان متغیرهایی با نام یکسان در فضاهای نام متفاوت داشت. کامپایلرهای ++C اسم متغیرهای C را نیز برای تشخیص فضای نامی که متغیر C در آن قرار دارد دستکاری می‌کند. مثالی پیچیده‌تر در زبان ++C در ابتدای این بخش یک مثال سادهٔ فرضی از دستکاری نام در زبان ++C آورده شد. برای نام‌های تو در تو (شامل فضاهای نام و کلاس‌ها)، به دنبالشان یک N می‌آید و پس از آن یک دنباله از طول‌ها و شناسه‌ها (منظور طول شناسهٔ بعدی است) قرار می‌گیرد، و در آخر یک E. در واقعیت، استانداردی برای نحوهٔ دستکاری نام‌ها در زبان ++C وجود ندارد و کامپایلرهای مختلفی که برای آن وجود دارند به روش‌های گوناگونی این کار را انجام می‌دهند. | ## جمع‌بندی | به‌طور کلی هر زبانی که در آن قابلیت تعریف موجودیت‌های مختلف با نام‌های یکسان (اضافه بار) وجود داشته باشد می‌تواند به این لیست اضافه شود.