موضوع مقاله: جادو (برنامه‌نویسی) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # جادو (برنامه‌نویسی) | مقدمه: در زمینه برنامه نویسی کامپیوتر، جادو یک اصطلاح غیررسمی برای انتزاع است؛ از آن برای توصیف کد با وظایف پیچیده استفاده می‌شود در حالی که این پیچیدگی را پنهان می‌کند تا یک رابط ساده ارائه دهد. | ## بخش 1: جادو (برنامه‌نویسی) | این اصطلاح تا حدودی مسخره آمیز است و اغلب دارای مفاهیم بد است، که نشان می‌دهد رفتار واقعی کد بلافاصله آشکار نمی‌باشد. برای مثال، مکانیسم‌های تایپ و بسته‌بندی پلیمورف پرل اغلب به عنوان «جادویی» نامیده می‌شوند. این اصطلاح به این معنی است که پیچیدگی پنهان حداقل در اصل قابل درک است، در مقایسه با جادو سیاه و جادو عمیق که تکنیک‌های اسرارآمیز را توصیف می‌کند که عمداً پنهان شده یا بسیار دشوار است. با این حال، این اصطلاح می‌تواند به صورت جذابی نیز استفاده شود، که نشان دهنده «جذابیت» در مورد کد است. عمل چنین انتزاعی به عنوان «خودآگاهانه» انجام می‌شود، یک ترکیب از «خودکار» و «جادویی». مبهم بودن مرجع «جادو» به رویه‌ها که محاسبات را بر مبنای داده‌هایی که صراحتاً به آنها ارائه نشده است، با دسترسی به دیگر ماژول‌ها، موقعیت‌های حافظه یا متغیرهایجهانی انجام می‌دهند که آنها نباید این انجام دهند (به عبارت دیگر، آنها به‌طور مرجع شفاف نیستند). بر طبق آخرین مدل‌های معماری نرم‌افزار، حتی وقتی از برنامه نویسی ساختاری استفاده می‌شود، معمولاً ترجیح داده می‌شود برای اینکه هر تابع هر بار به یک شکل رفتار کند همان استدلال‌ها به آن انتقال داده می‌شوند، در نتیجهٔ یکی از اصول اساسی برنامه نویسی کاربردی. وقتی یک تابع این قانون را رعایت نمی‌کند، اغلب گفته می‌گویند که شامل «جادو» می‌باشد. | ## بخش 2: جادو (برنامه‌نویسی) | در ISO C، دسته‌های فایل (از نوع ) نمی‌توانند با خیال راحت کپی شوند، زیرا آدرس‌های آنها ممکن است جادویی باشد؛ یعنی محیط زمان اجرا ممکن است دسته‌های فایل اصلی را در یک محدوده آدرس کدگذاری شده قرار دهد و رفتار دسته فایل را برای یک کپی ایجاد شده توسط کاربر در آدرس دیگری ارائه نکند. در نتیجه، روال‌های استاندارد کتابخانه، نشانگرهایی را به دسته‌های فایل، از نوع می‌پذیرند. در پرل ۵، دستور while به‌طور ضمنی خط خوانده شده از فایل با را به متغیر اختصاص داده و تابع را به عبارت اعمال می‌کند تا هر رشته‌ای که به درستی خوانده شود، حتی یا رشته خالی، درست ارزیابی می‌شود و حلقه را ادامه می‌دهد. در یک شبیه‌ساز، مخصوصاً شبیه‌ساز در حال توسعه، نقاط تماس سیستم دستگاه شبیه‌سازی شده ممکن است جادویی باشد. هنگامی که آنها فراخوانی می‌شوند، شبیه‌ساز ممکن است کد بومی را برای راحتی، سرعت یا دسترسی به سخت‌افزار فیزیکی اجرا کند و CPU و حافظه شبیه‌سازی شده را طوری تنظیم کند که گویی کد اصلی را اجرا کرده است. به جای تلاش برای انشعاب به کد ARM در آن آدرس‌ها، یک وقفه نرم‌افزاری در سیستم عامل RISC معادل فراخوانی سیستم ایجاد می‌کند. همچنین در BBC BASIC، نه تنها متغیر عددی قالب‌بندی چاپ را کنترل می‌کند، بلکه انتساب مستقیم رشته‌های قالب ANSI را نیز می‌پذیرد، که معمولاً یک خطای عدم تطابق نوع می‌باشد. در جاوا اسکریپت، ارزیابی عملگر زمانی با موفقیت انجام می‌شود که عملوند یک شناسه اعلام نشده باشد، که معمولاً منجر به یک می‌شود. | ## بخش 3: جادو (برنامه‌نویسی) | آدرس‌های ورودی/خروجی نقشه‌برداری شده با حافظه و متغیرهای فرار نیز از این نظر جادو هستند، اگرچه این اصطلاح معمولاً به کار نمی‌رود. انواع جادوی عمیق به تکنیک‌هایی اشاره دارد که به شکل گسترده شناخته شده نیستند و ممکن است عمداً به‌طور پنهان نگهداری شوند. تعداد چنین تکنیک‌هایی در طول زمان کاهش یافته است، به خصوص در زمینه رمزنگاری، که در آن امنیت از طریق مبهم به مقدار فراوانی به سود امنیت از طریق طراحی می‌باشد که اجازه می‌دهد، و اغلب بررسی عمومی رها شده را تشویق می‌کند. فایل Jargon میان جادوی عمیق، که به کد برمبنای دانش نظری باطنی اشاره می‌کند، و جادوی سیاه، که به کدهای مبتنی بر تکنیک‌هایی اشاره دارد که به نظر کار می‌کنند ولی عاری از توضیح نظری می‌باشند، تمایز ایجاد می‌کند. همچنین جادوگری سنگین را تعریف می‌کند که به کدهای برمبنای پیچیدگی‌های مبهم یا غیر مستند سخت‌افزار یا نرم‌افزار خاص اشاره می‌کند. برای مثال، نظر نامحبوب«از شما انتظار نمی‌رود که این را بفهمید»: عده کثیری از خوانندگان Lions' Book، تفسیری با حاشیه نویسی آموزشی دربارهٔ کد منبع هسته نسخه یونیکس نسخه ۶، این تعبیر را که در کد پیدا می‌شود تفسیر کردند تا بعضی از آنها را پیشنهاد دهند. | ## جمع‌بندی | خرد نظری عمیق در قطعه مبهم نمایش داده می‌شد، با این حال در واقع عملکرد «جادویی» آن صرفاً به ویژگی به‌خصوصی از روش بهینه‌سازی کامپایلر C برای سخت‌افزار PDP-11 که نسخه ۶ یونیکس برای اجرا بر روی آن طراحی شده بود وابسته بود.