جادو (برنامه‌نویسی)

در زمینه برنامه نویسی کامپیوتر، **جادو** یک اصطلاح غیررسمی برای انتزاع است؛ از آن برای توصیف کد با وظایف پیچیده استفاده می‌شود در حالی که این پیچیدگی را پنهان می‌کند تا یک رابط ساده ارائه دهد. این اصطلاح تا حدودی مسخره آمیز است و اغلب دارای مفاهیم بد است، که نشان می‌دهد رفتار واقعی کد بلافاصله آشکار نمی‌باشد. برای مثال، مکانیسم‌های تایپ و بسته‌بندی پلیمورف پرل اغلب به عنوان «جادویی» نامیده می‌شوند. این اصطلاح به این معنی است که پیچیدگی پنهان حداقل در اصل قابل درک است، در مقایسه با جادو سیاه و جادو عمیق که تکنیک‌های اسرارآمیز را توصیف می‌کند که عمداً پنهان شده یا بسیار دشوار است. با این حال، این اصطلاح می‌تواند به صورت جذابی نیز استفاده شود، که نشان دهنده «جذابیت» در مورد کد است. عمل چنین انتزاعی به عنوان «خودآگاهانه» انجام می‌شود، یک ترکیب از «خودکار» و «جادویی».

## مبهم بودن مرجع
«جادو» به رویه‌ها که محاسبات را بر مبنای داده‌هایی که صراحتاً به آنها ارائه نشده است، با دسترسی به دیگر ماژول‌ها، موقعیت‌های حافظه یا متغیرهایجهانی انجام می‌دهند که آنها نباید این انجام دهند (به عبارت دیگر، آنها به‌طور مرجع شفاف نیستند). بر طبق آخرین مدل‌های معماری نرم‌افزار، حتی وقتی از برنامه نویسی ساختاری استفاده می‌شود، معمولاً ترجیح داده می‌شود برای اینکه هر تابع هر بار به یک شکل رفتار کند همان استدلال‌ها به آن انتقال داده می‌شوند، در نتیجهٔ یکی از اصول اساسی برنامه نویسی کاربردی. وقتی یک تابع این قانون را رعایت نمی‌کند، اغلب گفته می‌گویند که شامل «جادو» می‌باشد.

یک مثال ساده از جادوی منفی کد زیر در **[[پی‌اچ‌پی]]** می‌باشد:
```php
function magic()
{
    global $somevariable;

    echo $somevariable;
}

$somevariable = true;

magic();
```


در حالی که کد بالا واضح می‌باشد، اگر در یک پروژه بزرگ دیده شود، درک این موضوع که متد `()magic` از کجا ارزش خود را دریافت می‌کند، اغلب دشوار می‌باشد. بهتر است آن کد با استفاده از مفهوم زیر نوشته شود:
```php
function noMagic($myvariable)
{
    echo $myvariable;
}

$somevariable = true;

noMagic($somevariable);
```


## نامتعامد

این توصیف *جادو* یا *جادویی* را می‌توان به یک نوع داده، قطعه کد، کلمه کلیدی یا آدرس ماشینی که شامل ویژگی‌هایی می‌باشد، تعمیم داد که به‌وسیلهٔ اشیاء مشابه به اشتراک گذاشته نمی‌شود. ممکن است خواص جادویی مستند باشد یا نباشد.
* در ISO C، دسته‌های فایل (از نوع ) نمی‌توانند با خیال راحت کپی شوند، زیرا آدرس‌های آنها ممکن است جادویی باشد؛ یعنی محیط زمان اجرا ممکن است دسته‌های فایل اصلی را در یک محدوده آدرس کدگذاری شده قرار دهد و رفتار دسته فایل را برای یک کپی ایجاد شده توسط کاربر در آدرس دیگری ارائه نکند. در نتیجه، روال‌های استاندارد کتابخانه، نشانگرهایی را به دسته‌های فایل، از نوع  می‌پذیرند.
* در پرل ۵، دستور `while()` به‌طور ضمنی خط خوانده شده از فایل با  را به متغیر  اختصاص داده و تابع  را به عبارت اعمال می‌کند تا هر رشته‌ای که به درستی خوانده شود، حتی  یا رشته خالی، درست ارزیابی می‌شود و حلقه  را ادامه می‌دهد. این اتفاق برای  در هیچ جای دیگری یا  با هیچ عبارت کنترل دیگری نمی‌افتد.
* در یک شبیه‌ساز، مخصوصاً شبیه‌ساز در حال توسعه، نقاط تماس سیستم دستگاه شبیه‌سازی شده ممکن است جادویی باشد. هنگامی که آنها فراخوانی می‌شوند، شبیه‌ساز ممکن است کد بومی را برای راحتی، سرعت یا دسترسی به سخت‌افزار فیزیکی اجرا کند و CPU و حافظه شبیه‌سازی شده را طوری تنظیم کند که گویی کد اصلی را اجرا کرده است.
** به عنوان مثال، بیانیه  BBC BASIC V به‌طور جادویی با آدرس‌های تماس سیستمی Acorn MOS برخورد می‌کند. به جای تلاش برای انشعاب به کد ARM در آن آدرس‌ها، یک وقفه نرم‌افزاری در سیستم عامل RISC معادل فراخوانی سیستم ایجاد می‌کند. &#x5B; *[[ویکی‌پدیا:تحقیق دست‌اول ممنوع|<span title="This claim needs references to reliable secondary sources. (فوریه ۲۰۱۷)">غیراصلی مورد نیاز است</span>]]* &#x5D; اثر این است که Acorn MOS به اندازه کافی شبیه‌سازی می‌شود تا برنامه‌های BASIC 8 بیتی فاقد زبان اسمبلی بدون تغییر اجرا شوند.
* همچنین در BBC BASIC، نه تنها متغیر عددی  قالب‌بندی چاپ را کنترل می‌کند، بلکه انتساب مستقیم رشته‌های قالب ANSI را نیز می‌پذیرد، که معمولاً یک خطای عدم تطابق نوع می‌باشد.
* در جاوا اسکریپت، ارزیابی  عملگر زمانی با موفقیت انجام می‌شود که عملوند یک شناسه اعلام نشده باشد، که معمولاً منجر به یک  می‌شود.
* هر نظری که روی کد تأثیر بگذارد جادو است.
* آدرس‌های ورودی/خروجی نقشه‌برداری شده با حافظه و متغیرهای فرار نیز از این نظر جادو هستند، اگرچه این اصطلاح معمولاً به کار نمی‌رود.

## انواع
**جادوی عمیق** به تکنیک‌هایی اشاره دارد که به شکل گسترده شناخته شده نیستند و ممکن است عمداً به‌طور پنهان نگهداری شوند. تعداد چنین تکنیک‌هایی در طول زمان کاهش یافته است، به خصوص در زمینه رمزنگاری، که در آن امنیت از طریق مبهم به مقدار فراوانی به سود امنیت از طریق طراحی می‌باشد که اجازه می‌دهد، و اغلب بررسی عمومی رها شده را تشویق می‌کند.

*[[جارگون فایل|فایل Jargon]]* **میان جادوی عمیق**، که به کد برمبنای دانش نظری باطنی اشاره می‌کند، و **جادوی سیاه**، که به کدهای مبتنی بر تکنیک‌هایی اشاره دارد که به نظر کار می‌کنند ولی عاری از توضیح نظری می‌باشند، تمایز ایجاد می‌کند. همچنین **جادوگری سنگین** را تعریف می‌کند که به کدهای برمبنای پیچیدگی‌های مبهم یا غیر مستند سخت‌افزار یا نرم‌افزار خاص اشاره می‌کند. برای مثال، نظر نامحبوب«از شما انتظار نمی‌رود که این را بفهمید»: عده کثیری از خوانندگان Lions' Book، تفسیری با حاشیه نویسی آموزشی دربارهٔ کد منبع هسته نسخه یونیکس نسخه ۶، این تعبیر را که در کد پیدا می‌شود تفسیر کردند تا بعضی از آنها را پیشنهاد دهند. خرد نظری عمیق در قطعه مبهم نمایش داده می‌شد، با این حال در واقع عملکرد «جادویی» آن صرفاً به ویژگی به‌خصوصی از روش بهینه‌سازی کامپایلر C برای سخت‌افزار PDP-11 که نسخه ۶ یونیکس برای اجرا بر روی آن طراحی شده بود وابسته بود.

## جستارهای وابسته
* شماره جادویی (برنامه‌نویسی)
* جعبه سیاه
* برنامه نویسی فرقه بار

## منابع
# بناهان، مایک؛ بردی، دکلن؛ دوران، مارک (۱۹۹۱).
# 
# 
# 

رده:فرهنگ مردمی برنامه‌نویسی رایانه‌ای
رده:فرهنگ مردمی مهندسی نرم‌افزار
رده:مقاله‌های ایجادشده توسط ایجادگر