زبان‌های برنامه‌نویسی محرمانه

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

زبان برنامه نویسی محرمانه یک زبان برنامه نویسی است که برای تست کردن محدودیت‌های طراحی دیگر زبان‌های برنامه نویسی طراحی شده است. کلمه محرمانه این زبان‌ها را از دیگر زباهای برنامه نویسی که برای نوشتن نرم‌افزار استفاده می‌شوند متمایز می‌کند. معمولاً نویسنده‌های برنامه‌های محرمانه خیال ندارند جریان برنامه نویسی را منحرف کنند به جز در مواردی خاص مانند الگوهای visuospatial که برای این متظور در نظر گرفته شده‌اند. این زبانها مورد علاقه هکرها و افرادی است که می‌خواهند جریان داده را به هم بزنند. مورد استفاده بودن از اهداف طراحان زبان‌های محرمانه نیست بلکه معمولاً هدف آنها حذف یا جایگزینی اشکال قراردادی در زبان است که هنوز زبان را تورینگ کامل نگاه می‌دارد.

تاریچه[ویرایش]

اولین و هنوز یکی از مثال‌های استاندارد زبان INTERACAL است در سال ۱۹۹۲ توسط Don Woods وJames M Lyon طراحی شد که با زبانهای برنامه نویسی که کاربران معمول با آن آشنا هستند تفاوت‌هایی دارد. این زبان از قسمت‌هایی از زبان‌های برنامه نویسی تقلید می‌کند مانند زبانهای فورترن,کوبول و زبان اسمبلی که از قسمت‌هایی از آن تقلید شده است. سابق بر این پیاده سازی INTERCAL با IBM System/360 بود و کامپیوترهای آتاری که بعد از آن به حیات خود ادامه نداد و بنابراین این زبان در برهه‌ای از میان رفت. احیاگران زبان در ۱۹۹۰ در جریان ساخت سیستم عامل یونیکس به وسیله زبان سی از یک زبان محرمانه استفاده کردند. در سال 1992 Wouter van Ootmerssen یک زبان برنامه نویسی مبتنی بر پشته را ابداع کرد که به طور ذاتی کدهای آن بسیار مبهم و ناخوانا بود اما نکته قابل توجه این بود که در این زبان از یک کامپایلر با ۱۰۲۴ بایت استفاده می‌شود اما با اصلاحاتی این زبان جز زبان‌های محرمانه محبوب شد نام این زبان _brainf است.

اصطلاحات برنامه نویسی محرمانه[ویرایش]

Turing Tarpit یک زبان توینگ کامل است که تعداد عملگر و دستورها اجزای مشابه آن خیلی کم است. این شامل brainf,osic,tue می‌شود. Turning tarpit یک تورینگ تارپیت با کدگذاری تمام حالات است به عنوان مثال زبانی است که یک بخش از عملگرها را در جریان حالت فعلی برنامه دخالت می‌دهد. کدگذاری حالات یک متد برای کدگذاری برنامه است که هر زیر رشته از کد یک دستورالعمل از هر دو: ۱-محل دستور بعدی در لیست و ۲-اعمال کردن آن جریان داده‌های برنامه است نکته اینکه یک دستور تک معمولاً دو فاز ترتیبی را دارد:انتخاب عملگر و اجرای آن. عملگرها می‌توانند ایستا(reMorse یا Thrat) و یا پویا(reMorse4ever) باشند. در اینجا نمونه‌ای بر مبنای (reMorse یا Thrat) است:

  • یک عملوند در لیست را انتخاب کن
  • آن را اجرا کن

مدل زبان[ویرایش]

مدل زبان می‌تواند این گونه دسته بندی شود و این دسته بندی‌ها می‌توانند یک یادگیری عمومی از راههایی که یک زبان خاص کار می‌کند در اختیار بگذارد. این شامل زبان‌های مستبدانه/اجباری می‌شود (مانند brainf) که دستورات اینگونه توضیح داده می‌شوند که چگونه می‌توانند داده‌ها را تغییر دهند. زبان‌های تابعی مانند unlamda که داده‌ها و کدها کمتر قابل تغییر و تعویض هستند و اجرا با اجرای توابع که توابع دیگر را نتیجه می‌دهند ادامه پیدا می‌کند و زبان‌های بازنویسی مانند thue که تابع‌های انتقالی در وضعیت مقدار دهی اولیه به کار می‌روند.

funges[ویرایش]

funge یک زبان محرمانه است که یک مدل برنامه سازی متریک فاصله دار متناسب با سیستم دارد و دستورهایی که اشاره شده‌اند اجرا می‌شوند. دستورهای متفاوت نشان دهنده جهت دستورهایی است که باید اجرا شوند. استاندارد اداری فعلی که برای این زبان برنامه نویسی به کار می‌رود funge-98 است. این مشخصه مربوط به خصوصیات عمومی زبان برنامه نویسی :en:befungeاست که دو بعد حلقوی توپولوژی دارد.

زبان‌های غیرقطعی[ویرایش]

برای زبان‌های قطعی اگر وضعیتی داده شده در برنامه وضعیت بعدی قابل پیش بینی است. بیشتر زبانها قطعی هستند اما زبان‌هایی مانند befunge و java2k کدهایشان به صورت رندوم در صورت غیر قطعی بودن اجرا می‌شوند. زبان‌های غیر قطعی معمولاً برای جستجو در فضاهای بزرگتر استفاده می‌شوند. ایجاد کننده تکست تصادفی the Data Engine و rmutt نمونه‌ای از زبان‌های غیر قطعی می‌باشند.

انجمن اینترنت[ویرایش]

یک انجمن کوچک اما پر رونق از برنامه نویسان و طراحان زبانهای محرمانه در اینترنت موجود است. این انجمن گاه‌و‌بیگاه فعال می‌شود و گفتگوهای آنها مربوط به مباحث تورینگ کامل بودن زبانها و میزان سختی دیداری کردن مفاهیم ریاضی در زبان‌های برنامه نویسی است. کامل بودن تورینگ از جمله مباحثی است که طرفداران زیادی دارد و دیگر موضوع مورد علاقه نوشتن کدهای بدون ابهام است.

مثال ها[ویرایش]

در زیر نمونه‌هایی از زبانهای برنامه نویسی محرمانه آورده شده است:

Befunge[ویرایش]

زبان Befunge و هم خانواده‌های آن به اشاره گر کد اجازه می‌دهند که در جاهای مختلف کد قرار داشته باشند. برای نمونه این برنامه یک برنامه hello world است با قرار دادن برعکس کاراکترها در پشته بعد چاپ آنها به وسیله چاپ ساعت گرد بااین کدها [>], [:],و، [_], [,], d [^].

"dlroW olleH">:v
             ^,_@

Binary Lambda Calculus[ویرایش]

به وسیله تئوری داده‌ها الگوریتمیک ابداع شد و دید آن اینگونه است که کد چگال تر با معنای حداقلی طرح ۲۹ بایت خود مترجم و غیره.

Brainfuck[ویرایش]

این زبان برای حداقل کردن کد طراحی شده که منجر به ناخوانا شدن کد می‌شود. خروجی این برنامه hello world است.

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+. +++++++

.. +++.>++.<<+++++++++++++++.>. +++. ----. ----.>+.>.

Chef[ویرایش]

این زبان پشته گرا توسط David Morgan-Mar برای اینکه برنامه‌ها را مانند دستور آشپزی کند طراحی شده است. برنامه‌ها شامل عنوان و مقادیر دادها و لیستی از دستورات پشته‌های پیاده سازی شده است.

FALSE[ویرایش]

این زبان یک زبان بر مبنای پشته با دستورها و مقادیر تک کاراکتری است. برای مثال ۳+۱ می‌تواند به وسیله![+λ x → x + 1)(3): 3[1) محاسبه شود.

INTERCAL[ویرایش]

کوتاه شده یک "زبان کامپایلری بدون سرنام" است.

LOLCODE[ویرایش]

برای بازسازی [:en:lolcats]طراحی شده است. در ذیل یک سثال hello world آورده شده است.

HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE

Malbolge[ویرایش]

Malbolge برای زبان‌های بسیار سخت و محرمانه طراحی شده است.

کامپیوتر تک دستوری[ویرایش]

یک ماشین زبان با فقط یک عملگر است.

Piet[ویرایش]

Piet program that prints 'Piet'
A "Hello World" program in Piet

piet زبانی است که توسط David Morgan-Mar ابداع شد کسی برنامه سازی بیت مپ‌های آن مانند یک هنر انتزاعی است. کامپایل شدن به وسیله یک اشاره گر که در اطراف تصویر حرکت می‌کند برای یک دامنه رنگی ادامه دار تا رنگ بعدی انجام می‌شود. ۲۰ رنگ موجود است که رفتار آنها پیش بینی شده است.۱۸ تا از آنها رنگ‌های رنگی هستند که به صورت ۶ رنگ و ۳ طیف روشنایی مختلف مرتب شده‌اند;و رنگ سیاه و سفید مرتب نشده‌اند. زمانی که یک رنگ رنگی موجود است و یک رنگ دیگر وارد می‌شود پروسه انجام شده توسط تعداد سطوح رنگ و روشنایی که تغییر کرده‌اند مشخص می‌شود. سیاه نمی‌تواند وارد شود;زمانی که اشاره گر سعی می‌کند که به یک ناحیه سیاه وارد شود قوانین انتخاب بلوک بعدی تغییر می‌کند. اگر تمامی قوانین انجام شوند برنامه تمام خواهد شد. سفید عملی را انجام نمی‌دهد فقط به اشاره گر اجازه می‌دهد که عبور کند. رنگ‌های غیر از این ۲۰ رنگ به کامپایلر یا مترجم ارجاع داده می‌شوند. متغیرها در یک پشته به عنوان یک متغیر integer علامت دار ذخیره می‌شوند. بیشتر پروسه‌های مشخص شده مربوط به عملیات پشته خواهد بود. بقیه به وسیله دستورهای ورودی خروجی و به وسیله دستوراهایی که اشاره گر کامپایل در حرکتش مشخص می‌کند مشخص می‌شود.

شکسپیر[ویرایش]

زبان برنامه نویسی شکسپیر طراحی شده است که برنامه‌ها را مانند نمایش نامه‌های شکسپیر کند برای مثال دستور زیر مانند یک دستور goto است:

Act I: Hamlet's insults and flattery..

فضای خالی (Whitespace)[ویرایش]

این زبان فقط از کاراکتر فضای خالی استفاده می‌کند(space,tabو return). این برخلاف خیلی از زبان‌های برنامه نویسی است که تفاوتی بین کاراکترهای فضای خالی نمی‌گذاراند. برنامه‌های با این زبان می‌توانند در سورس کدهای زبان‌هایی مانند c پنهان شوند.