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

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

مبهم بودن مرجع

ویرایش

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

یک مثال ساده از جادوی منفی کد زیر در PHP می باشد:

function magic()
{
    global $somevariable;

    echo $somevariable;
}

$somevariable = true;

magic();


در حالی که کد بالا واضح می باشد، اگر در یک پروژه بزرگ دیده شود، درک این موضوع که متد ()magic از کجا ارزش خود را دریافت می کند، اغلب دشوار می باشد. بهتر است آن کد با استفاده از مفهوم زیر نوشته شود:

function noMagic($myvariable)
{
    echo $myvariable;
}

$somevariable = true;

noMagic($somevariable);

نامتعامد

ویرایش

هر SV [مقدار اسکالر] ممکن است جادویی باشد، یعنی ویژگی های خاصی دارد که یک SV معمولی ندارد

— Larry Wall

این توصیف جادو یا جادویی را می توان به یک نوع داده ، قطعه کد، کلمه کلیدی یا آدرس ماشینی که شامل ویژگی هایی می باشد، تعمیم داد که بوسیله اشیاء مشابه به اشتراک گذاشته نمی شود. ممکن است خواص جادویی مستند باشد یا نباشد.

  • در ISO C ، دسته‌های فایل (از نوع FILE ) نمی‌توانند با خیال راحت کپی شوند، زیرا آدرس‌های آنها ممکن است جادویی باشد. یعنی محیط زمان اجرا ممکن است دسته‌های فایل اصلی را در یک محدوده آدرس کدگذاری شده قرار دهد و رفتار دسته فایل را برای یک کپی ایجاد شده توسط کاربر در آدرس دیگری ارائه نکند. در نتیجه، روال‌های استاندارد کتابخانه، نشانگرهایی را به دسته‌های فایل، از نوع FILE * می‌پذیرند.
  • در پرل 5، دستور while(<file_handle>) به طور ضمنی خط خوانده شده از فایل با <file_handle> را به متغیر $_ اختصاص داده و تابع defined() را به عبارت اعمال می کند تا هررشته ای که به درستی خوانده شود، حتی "0" یا رشته خالی ، درست ارزیابی می شود و حلقه while() را ادامه می دهد. این اتفاق برای <file_handle> در هیچ جای دیگری یا while() با هیچ عبارت کنترل دیگری نمی افتد.
  • در یک شبیه ساز ، مخصوصاً شبیه ساز در حال توسعه، نقاط تماس سیستم دستگاه شبیه سازی شده ممکن است جادویی باشد. هنگامی که آنها فراخوانی می شوند، شبیه ساز ممکن است کد بومی را برای راحتی، سرعت یا دسترسی به سخت افزار فیزیکی اجرا کند و CPU و حافظه شبیه سازی شده را طوری تنظیم کند که گویی کد اصلی را اجرا کرده است.
    • به عنوان مثال، بیانیه CALL BBC BASIC V به طور جادویی با آدرس های تماس سیستمی Acorn MOS برخورد می کند. به جای تلاش برای انشعاب به کد ARM در آن آدرس ها، یک وقفه نرم افزاری در سیستم عامل RISC معادل فراخوانی سیستم ایجاد می کند.  </link>[ غیراصلی مورد نیاز است ] اثر این است که Acorn MOS به اندازه کافی شبیه سازی می شود تا برنامه های BASIC 8 بیتی فاقد زبان اسمبلی بدون تغییر اجرا شوند.
  • همچنین در BBC BASIC، نه تنها متغیر عددی @% قالب‌بندی چاپ را کنترل می‌کند، بلکه انتساب مستقیم رشته های قالب ANSI printfرا نیز می‌پذیرد، که معمولاً یک خطای عدم تطابق نوع می باشد.
  • در جاوا اسکریپت ، ارزیابی typeof عملگر زمانی با موفقیت انجام می شود که عملوند یک شناسه اعلام نشده باشد، که معمولاً منجر به یک ReferenceError می شود.
  • هر نظری که روی کد تاثیر بگذارد جادو است.
  • آدرس‌های ورودی/خروجی نقشه‌برداری شده با حافظه و متغیرهای فرار نیز از این نظر جادو هستند، اگرچه این اصطلاح معمولاً به کار نمی‌رود.

انواع

ویرایش

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

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

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

ویرایش

منابع

ویرایش
  1. بناهان، مایک؛ بردی، دکلن؛ دوران، مارک (1991).
  2. "perlop – perldoc.perl.org". 7 September 2010. Retrieved 17 February 2011.
  3. "27. Keywords" (PDF). BBC BASIC Reference Manual (1st ed.). Cambridge, England: Acorn Computers. October 1992. pp. 229, 349. ISBN 1-85250-103-0. Retrieved 9 May 2007.
  4. "Deep Magic". Jargon File.