زبانهای برنامهنویسی محرمانه
زبان برنامهنویسی ترسناک یک زبان برنامهنویسی است که برای تست کردن محدودیتهای طراحی دیگر زبانهای برنامهنویسی طراحی شدهاست. کلمه محرمانه این زبانها را از دیگر زبانهای برنامهنویسی که برای نوشتن نرمافزار استفاده میشوند، متمایز میکند. معمولاً نویسندههای برنامههای محرمانه خیال ندارند جریان برنامهنویسی را منحرف کنند به جز در مواردی خاص مانند الگوهای visuospatial که برای این منظور در نظر گرفته شدهاند. این زبانها مورد علاقه هکرها و افرادی است که میخواهند جریان داده را به هم بزنند. مورد استفاده بودن از اهداف طراحان زبانهای محرمانه نیست بلکه معمولاً هدف آنها حذف یا جایگزینی اَشکال قراردادی در زبان است که هنوز زبان را تورینگ کامل نگاه میدارد.
تاریخچه
اولین و هنوز یکی از مثالهای استاندارد زبان INTERACAL است در سال ۱۹۹۲ توسط Don Woods و James M Lyon طراحی شد که با زبانهای برنامهنویسی که کاربران معمول با آن آشنا هستند تفاوتهایی دارد. این زبان از قسمتهایی از زبانهای برنامهنویسی تقلید میکند مانند زبانهای فورترن، کوبول و زبان اسمبلی که از قسمتهایی از آن تقلید شدهاست. سابق بر این پیادهسازی INTERCAL با IBM System/360 بود و کامپیوترهای آتاری که بعد از آن به حیات خود ادامه نداد و بنابراین این زبان در برههای از میان رفت. احیاگران زبان در ۱۹۹۰ در جریان ساخت سیستم عامل یونیکس به وسیله زبان سی از یک زبان محرمانه استفاده کردند. در سال 1992 Wouter van Ootmerssen یک زبان برنامهنویسی مبتنی بر پشته را ابداع کرد که بهطور ذاتی کدهای آن بسیار مبهم و ناخوانا بود اما نکته قابل توجه این بود که در این زبان از یک کامپایلر با ۱۰۲۴ بایت استفاده میشود اما با اصلاحاتی این زبان جز زبانهای محرمانه محبوب شد نام این زبان brainfuck است.
اصطلاحات برنامهنویسی محرمانه
Turing Tarpit یک زبان توینگ کامل است که تعداد عملگر و دستورها اجزای مشابه آن خیلی کم است. این شامل brainf,osic,tue میشود. Turning tarpit یک تورینگ تارپیت با کدگذاری تمام حالات است به عنوان مثال زبانی است که یک بخش از عملگرها را در جریان حالت فعلی برنامه دخالت میدهد. کدگذاری حالات یک متد برای کدگذاری برنامه است که هر زیر رشته از کد یک دستورالعمل از هر دو:
- محل دستور بعدی در لیست و
- اعمال کردن آن جریان دادههای برنامه است.
نکته اینکه یک دستور تک معمولاً دو فاز ترتیبی را دارد:انتخاب عملگر و اجرای آن. عملگرها میتوانند ایستا(reMorse یا Thrat) یا پویا(reMorse4ever) باشند. در اینجا نمونهای بر مبنای (reMorse یا Thrat) است:
- یک عملوند در لیست را انتخاب کن
- آن را اجرا کن
مدل زبان
مدل زبان میتواند اینگونه دستهبندی شود و این دستهبندیها میتوانند یک یادگیری عمومی از راههایی که یک زبان خاص کار میکند در اختیار بگذارد. این شامل زبانهای مستبدانه/اجباری میشود (مانند brainfuck) که دستورها اینگونه توضیح داده میشوند که چگونه میتوانند دادهها را تغییر دهند. زبانهای تابعی مانند 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 زبانی است که توسط David Morgan-Mar ابداع شد کسی برنامه سازی بیت مپهای آن مانند یک هنر انتزاعی است. کامپایل شدن به وسیله یک اشاره گر که در اطراف تصویر حرکت میکند برای یک دامنه رنگی ادامه دار تا رنگ بعدی انجام میشود. ۲۰ رنگ موجود است که رفتار آنها پیشبینی شدهاست. ۱۸ تا از آنها رنگهای رنگی هستند که به صورت ۶ رنگ و ۳ طیف روشنایی مختلف مرتب شدهاند؛ و رنگ سیاه و سفید مرتب نشدهاند. زمانی که یک رنگ رنگی موجود است و یک رنگ دیگر وارد میشود پروسه انجام شده توسط تعداد سطوح رنگ و روشنایی که تغییر کردهاند مشخص میشود. سیاه نمیتواند وارد شود؛ زمانی که اشاره گر سعی میکند که به یک ناحیه سیاه وارد شود قوانین انتخاب بلوک بعدی تغییر میکند. اگر تمامی قوانین انجام شوند برنامه تمام خواهد شد. سفید عملی را انجام نمیدهد فقط به اشاره گر اجازه میدهد که عبور کند. رنگهای غیر از این ۲۰ رنگ به کامپایلر یا مترجم ارجاع داده میشوند. متغیرها در یک پشته به عنوان یک متغیر integer علامت دار ذخیره میشوند. بیشتر پروسههای مشخص شده مربوط به عملیات پشته خواهد بود. بقیه به وسیله دستورهای ورودی خروجی و به وسیله دستوراهایی که اشاره گر کامپایل در حرکتش مشخص میکند مشخص میشود.
شکسپیر
زبان برنامهنویسی شکسپیر طراحی شدهاست که برنامهها را مانند نمایش نامههای شکسپیر کند برای مثال دستور زیر مانند یک دستور goto است:
Act I: Hamlet's insults and flattery..
فضای خالی (Whitespace)
این زبان فقط از کاراکتر فضای خالی استفاده میکند(space,tabو return). این برخلاف خیلی از زبانهای برنامهنویسی است که تفاوتی بین کاراکترهای فضای خالی نمیگذاراند. برنامههای با این زبان میتوانند در سورس کدهای زبانهایی مانند c پنهان شوند.