برین‌فاک: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
Qniksefat (بحث | مشارکت‌ها)
بدون خلاصۀ ویرایش
Qniksefat (بحث | مشارکت‌ها)
اصلاحات جزئی در نیم‌فاصله‌ها و افزودن ترجمه‌ای به آخر «ساختار زبان»
خط ۸:
| influenced_by=[[P′′]], [[FALSE]]
}}
'''برین‌فاک''' {{به انگلیسی|Brainfuck}} یک [[زبان‌های برنامه‌نویسی محرمانه|زبان برنامه‌نویسی رمزی]] است که دستورهای بسیار کمی دارد. این برنامه در سال ۱۹۹۳ توسط اربن مولر با هدف طراحی زبانییک [[زبان برنامه‌نویسی]] با کوچک‌ترین [[کامپایلر]] ممکن طراحی شد.<ref>{{یادکرد وب |نویسنده = |نشانی= http://www.muppetlabs.com/~breadbox/bf/|عنوان= | ناشر = |تاریخ = |تاریخ بازبینی=}}</ref> کامپایلرهای برین‌فاک معمولاً کمتر از ۲۰۰ بایت حجم دارند و حتی یک کامپایلر ۱۰۰ بایتی نیز برای آن وجود دارد.<ref>{{یادکرد وب |نویسنده= |نشانی=http://pferrie.host22.com/misc/brainfck.htm |عنوان= |ناشر= |تاریخ= |تاریخ بازبینی= |archiveurl=https://web.archive.org/web/20141021190901/http://pferrie.host22.com/misc/brainfck.htm |archivedate=۲۱ اکتبر ۲۰۱۴ |dead-url=yes }}</ref> همان‌گونه که از نام این زبان برمی‌آید، فهم دستورهای برین‌فاک عمدتاً دشوار است.
 
 
== تاریخچه ==
در سال ۱۹۹۲، اربن مولر (Urban Müller) که دانشجوی رشتهٔ فیزیک سوئیس بود، یک بایگانی آنلاین کوچک را برای نرم‌افزار Amiga راه انداخت. <ref>{{یادکرد وب|نویسنده=Urban Müller|کد زبان=|تاریخ=1993-09-24.|وبگاه=|نشانی=http://de4.aminet.net/docs/misc/5000.txt|عنوان=Aminet hits 5000 files}}</ref> این بایگانی در ادامه محبوبیت بیشتری پیدا کرد و در سراسر جهان mirror شد. امروزه این بزرگترین بایگانی Amiga در جهان است که با نام Aminet شناخته می‌شود.
 
مولر برین‌فاک را با هدف پیاده‌سازی آن با کوچکترین کامپایلر ممکن، <ref>{{یادکرد وب|عنوان=The Brainfuck Programming Language|نشانی=http://www.muppetlabs.com/~breadbox/bf/|وبگاه=www.muppetlabs.com|بازبینی=2020-02-01}}</ref> با الهام از کامپایلر ۱۰۲۴بایت۱۰۲۴ بایت برای زبان برنامه نویسی FALSE طراحی کرد. <ref>{{یادکرد وب|عنوان=The FALSE Programming Language — Wouter van Oortmerssen|نشانی=http://strlen.com/false-language/|وبگاه=strlen.com|بازبینی=2020-02-01}}</ref> کامپایلر مولر به زبان ماشین پیاده‌سازی شد و به صورت فایل دودویی با اندازهٔ ۲۹۶بایت۲۹۶ بایت کامپایل شد. او اولین کامپایلر برین‌فاک را در سال ۱۹۹۳ به Aminet بارگذاری کرد. این برنامه با یک "«صفحهٔ راهنما"» عرضه شده بود، که به طور خلاصه زبان را توصیف می‌کرد و خواننده را با این پرسش به چالش می‌کشید که "چه کسی می‌تواند یک برنامه کارآمد با این تولید کند؟ :)" مولر هم‌چنین یک [[مفسر [interpreter(رایانه)|مفسر]] و تعدادی مثال‌های بسیار مفصل همراه این مجموعه کرد. نسخهٔ دوم کامپایلر تنها از ۲۴۰ بایت فضا استفاده می‌کند. <ref>{{یادکرد وب|عنوان=Aminet - dev/lang/brainfuck-2.lha|نشانی=https://web.archive.org/web/20051106213924/http://www.aminet.net/package.php?package=dev/lang/brainfuck-2.lha|وبگاه=web.archive.org|تاریخ=2005-11-06|بازبینی=2020-02-01}}</ref>
 
با بزرگ شدن Aminet کامپایلر در جامعهٔ Amiga محبوب شد و به مرور زمان برای سایر سیستم‌عامل[OS[سیستم‌عامل|سیستم‌عامل‌] ]<nowiki/>ها نیز پیاده‌سازی شد. چندین کامپایلر برین‌فاک که از ۲۰۰بایت۲۰۰ بایت نیز کوچکترکوچک‌تر هستند ساخته شده است که یکی از آن‌ها فقط ۱۰۰بایت۱۰۰ بایت حجم دارد. <ref>{{Citation|title=peterferrie/brainfuck|url=https://github.com/peterferrie/brainfuck|date=2020-01-05|accessdate=2020-02-01|first=Peter|last=Ferrie}}</ref>
 
; ′′P «زبان مادر» برین‌فاک
 
به جز این دو دستور I/O می‌توان گفت برین‌فاک یک مشتق از زبان برنامه‌نویسی رسمی ``P است با تغییرات جزئی. این زبان مادر توسط کورادو بوهم (Corrado Böhm) در سال ۱۹۶۴ ایجاد شده است و به نوبهٔ خود مبتنی بر [[ماشین تورینگ]] است. در واقع، با استفاده از شش نماد (symbol) معادلِ دستورهای مربوط <code>+</code>, <code>-</code>, <code><</code>, <code>></code>, <code>[</code>, <code>]</code>, بوهم برای کارکردهای اولیه که برای محاسبه هر عملکرد قابل‌محاسبه نیاز است، برنامه‌ای صریح ارائه کرده است.
 
; Infinite Abacus «زبان جد» برین‌فاک
نسخه ای با حافظهٔ صریح آدرس‌دهی و بدون پشته و پرش مشروط توسط یواخیم لمبک در سال ۱۹۶۱ با نام Infinite Abacus معرفی شد که متشکل بود از تعداد نامحدودی از سلول‌ها و دو دستورالعمل ارائه شد:
* <code>X+</code> (سلول افزایش X)
* <code>X- else jump T</code> (مقدار X را کاهش بده اگر مثبت بود،بود کاهش بده، اگرنه به T بپر)
 
او ثابت کرد که Infinite Abacus قدرت پردازش هر برنامه‌ای را دارد که با برنامه‌نویسی Kleene به صورت μبازگشتی نوشته شود. ماشین او توسط ماشین Melzac مدل‌سازی محاسبات را از طریق محاسبه به جای منطق و تقلید از یک عملگر انسانی که سنگریزه‌ها را بر روی چرتکه حرکت می‌دهد شبیه سازیشبیه‌سازی شده است. از این رو الزام مثبت بودن همه شماره‌ها قابل فهم است. Melzac که یک کامپیوتر با تنها یک مجموعه دستور است، در واقع معادلی است برای Abacus Infinite که برنامه‌هایی را برای ضرب،ضرب gcdاعداد، ، n tnt اعداد اول، gcd، بازنمایی در پایهٔ b و مرتب‌سازی بر اساس اندازهٔ آرایه می‌دهد. به علاوه خود، نحوهٔ شبیه‌سازی یک ماشین تورینگ دلخواه را نیز ارائه می‌دهد.
او ثابت کرد که Infinite Abacus قدرت پردازش هر برنامه‌ای را دارد که با برنامه‌نویسی Kleene به صورت μبازگشتی نوشته شود.
ماشین او توسط ماشین Melzac مدل‌سازی محاسبات را از طریق محاسبه به جای منطق و تقلید از یک عملگر انسانی که سنگریزه‌ها را بر روی چرتکه حرکت می‌دهد شبیه سازی شده است. از این رو الزام مثبت بودن همه شماره‌ها قابل فهم است. Melzac که یک کامپیوتر با تنها یک مجموعه دستور است، در واقع معادلی است برای Abacus Infinite که برنامه‌هایی را برای ضرب، gcd ، n t اعداد اول، بازنمایی در پایهٔ b، مرتب‌سازی بر اساس اندازهٔ آرایه می‌دهد. به علاوه نحوهٔ شبیه‌سازی یک ماشین تورینگ دلخواه را نیز ارائه می‌دهد.
 
 
== ساختار زبان ==
این زبان از هشت دستور تشکیل شده است که در زیر آمده اند. برنامهٔ برین‌فاک دنباله‌ای از این دستورهاست که احتمالاً با سایر کاراکترها (که نادیده گرفته می‌شوند) در هم آمیخته اند. دستورها به صورت پیاپی اجرا می‌شوند، با برخی از استثنائات: یک اشاره‌گر دستور، در دستور اول شروع می‌شود و هر فرمانی که به آن اشاره می‌کند اجرا می‌شود، پس از آن معمولاً به سمت فرمان بعدی حرکت می‌کند. این برنامه هنگامی که نشانگر دستور از آخرین فرمان بگذرد ، به پایان می‌رسد. زبان برین‌فاک از یک مدل ساده بهره می‌برد متشکل از متن برنامه، نشانگر دستورالعمل، و هم‌چنین آرایه ای از حداقل ۳۰ هزار بایت که ابتدا با صفر مقداردهی شده اند. هم‌چنین یک[[اشاره‌گر_(علوم_رایانه) | اشاره‌گر]] اولیه برای اشاره به بایت کم‌ارزش آرایه و دو جریان بایت برای ورودی و خروجی که اغلب به یک صفحه‌کلید و یک مانیتور و با استفاده از رمزنگاری نویسه ASCII متصل می‌شوند.
زبان برین‌فاک از یک مدل ساده بهره می‌برد متشکل از متن برنامه، نشانگر دستورالعمل، و هم‌چنین آرایه ای از حداقل ۳۰ هزار بایت که ابتدا با صفر مقداردهی شده اند. یک [[اشاره‌گر_(علوم_رایانه) | اشاره‌گر]] اولیه برای اشاره به بایت کم‌ارزش آرایه. و دو جریان بایت برای ورودی و خروجی که اغلب به یک صفحه‌کلید و یک مانیتور و با استفاده از رمزنگاری نویسه ASCII متصل می‌شوند.
 
; دستورها
سطر ۹۵ ⟵ ۹۴:
{{پایان چپ‌چین}}
 
همانطور که از نام این برنامه برمی‌آید، درک برنامه‌های نوشته شده به زبان برین‌فاک دشوار است. این امر تا حدی به این دلیل است که هر کارِ اندکی پیچیده، نیاز به یک توالی طولانی از دستورات دارد و البته به این دلیل است که متن برنامه هیچ نشانهٔ مستقیمی از حالت یا وضعیت برنامه نمی‌دهد! این‌ها و هم‌چنین ناکارآمدی برین‌فاک و قابلیت‌های ورودی و خروجی محدود آن، از دلایل آن است که برای برنامه‌نویسی غیر شوخی مورد استفاده قرار نگیرد. با این حال، مانند هر زبان معادل ماشین تورینگ کاملی،  در صورت دسترسی به مقدار نامحدودی از حافظه، برین‌فاک نیز از نظر تئوری قادر به محاسبهٔ هر عملکرد قابل محاسبه یا شبیه‌سازیِ هر گونه مدل محاسباتی است. با این حال تعداد زیادی از انواع برنامه به زبان برین‌فاک نوشته شده است هرچند نوشتن برنامه‌های برین‌فاک به ویژه برنامه‌های پیچیده بسیار دشوار است، نوشتن یک کامپایلر برای برین‌فاک به یک زبان معمولی مانند C به دلیل سادگی ساختار آن، بسیار ساده است. حتی کامپایلرهایی از برین‌فاک وجود دارد که به زبان برین‌فاک نوشته شده اند.
این زبان از هشت دستور تشکیل شده است که در زیر آمده اند. برنامهٔ برین‌فاک دنباله‌ای از این دستورهاست که احتمالاً با سایر کاراکترها (که نادیده گرفته می‌شوند) در هم آمیخته اند. دستورها به صورت پیاپی اجرا می‌شوند، با برخی از استثنائات: یک اشاره‌گر دستور، در دستور اول شروع می‌شود و هر فرمانی که به آن اشاره می‌کند اجرا می‌شود، پس از آن معمولاً به سمت فرمان بعدی حرکت می‌کند. این برنامه هنگامی که نشانگر دستور از آخرین فرمان بگذرد ، به پایان می‌رسد.
 
زبان برین‌فاک از یک مدل ساده بهره می‌برد متشکل از متن برنامه، نشانگر دستورالعمل، و هم‌چنین آرایه ای از حداقل ۳۰ هزار بایت که ابتدا با صفر مقداردهی شده اند. یک [[اشاره‌گر_(علوم_رایانه) | اشاره‌گر]] اولیه برای اشاره به بایت کم‌ارزش آرایه. و دو جریان بایت برای ورودی و خروجی که اغلب به یک صفحه‌کلید و یک مانیتور و با استفاده از رمزنگاری نویسه ASCII متصل می‌شوند.
برین‌فاک به اصطلاح یکی از نمونه‌های Turing tarpit است: می‌توان از آن برای نوشتن هر برنامه‌ای استفاده کرد، اما انجام این کار عملی نیست، زیرا برین‌فاک آنقدر انتزاعی است که برنامه‌های آن بسیار طولانی یا پیچیده می‌شوند.
 
== مثال‌ها ==
; افزودن دو مقدار
 
به عنوان مثال اول ،نخست، قطعه کد زیر مقدار سلول فعلی را به مقدار سلول بعدی اضافه می کندمی‌کند: هر بار که حلقه اجرا شود ،شود، سلول فعلی کاهش می یابدمی‌یابد ، نشانگر داده به سمت راست حرکت می کندمی‌کند و سلول بعدی افزایش می یابدمی‌یابد و نشانگر داده دوباره به سمت چپ حرکت می کند. این دنباله تا زمانی که سلول اولیه به ۰صفر می‌رسد تکرار می‌شود.<syntaxhighlight lang="brainfuck">
[->+<]