زبان برنامه نویسی برین فاک Brainfuc

-----------------------------

مقدمه :

زبان برنامه نویسی برینفاک یک زبان برنامه نویسی رمز آلود بوده که جهت برنامه نویسی مینیمالیسم ساخته شده است
این زبان یک Turing tarpit (به زبان هایی گفته میشود که انعطاف بالایی دارند ولی یاد گیری سختی دارند) بوده که جهت به چالش کشیدن و متحیر کردن برنامه نویس ها طراحی شده است و برای استفاده عملی مناسب نیست.
طراحی زبان:

اوربان میلر ، برینفاک را در سال 1993 با هدف ساخت کوچکترین کامپایلر ممکن و با الهام از کامپایلر 1024 بایتی FALSE (یک کاپایلر 1024 بایتی) ساخت.
کامپایلر های مختلف برینفاک با حجم کمتر از 200 بایت ساخته شدند. اما توزیع کلاسیک آن که Müller's version 2 نام دارد شامل یک کامپایلر برای آمیگا ، یک مترجم ، نمونه برنامه ها و یه فایل راهنما هست.
این زبان تنها شامل 8 فرمان است که در ادامه به معرفی آن ها می پردازیم. یک برنامه برینفاک دنباله ای از این فرمان ها است.
فرمان ها به ترتیب اجرا می شوند. یک اشاره گر دستور العمل ها با فرمان اول شروع می شود و هر دستور العمل کاری روی اشاره گر انجام میدهد و سپس فرمان بعدی اجرا میشود. برنامه با پشت سر گزاشتن آخرین فرمان خاتمه می یابد.
زبان برنامه نویسی برینفاک با استفاده از یک مدل دستگاه ساده که متشکل از برنامه و اشاره گر دستور العمل ها است ، به خوبی می تواند یک آرایه شامل 30 هزار بایت سلول که با صفر مقدار دهی شدن را مدیریت می کند .
دارای یک اشاره گر داده متحرک برای حرکت بین فضای حافظه و دو جریان کنترلی برای ورودی و خروجی که اغلب صفحه کلید و مانیتور است که از کاراکترهای اسکی استفاده می کند.


همانطور که از نام این زبان پیداست برنامه های این زبان به سختی قابل درک هستند . این پیچیدگی تا حدودی به دلیل این است که برای نوشتن یک برنامه کوچک باید دنباله بلندی از فرمان ها برایش نوشت. دلیل دیگر پیچیدگی آن این است که متن برنامه هیچ نشانه ای از حالت اجرایی برنامه را ندارد ( یعنی مثلا در وسط متن برنامه نمی شود فهمید برنامه در کجای کار قرار دارد مگر با تریس کردن فرمان به فرمان) . همچنین برینفاک در قابلیت ها ورودی و خروجی بسیار محدود است.
این ها بعضی از دلایلی بود که از برینفاک برای نوشتن برنامه های جدی و عملی استفاده نمی شود.
با این حال مثل تمام زبان های Turing-complete (مجموعه ای از قوانین دستکاری و ویرایش اطلاعات) ، برینفاک به صورت تئوری قادر به محاسبه هر تابع محاسبه پذیر و یا شبیه سازی هر یک از مدل های دیگر محاسباتی است ، اگر امکان و مجوز دسترسی به مقدار نامحدودی از حافظه را داشته باشد.
برنامه های مختلفی از برینفاک نوشته شده است. نوشتن برنامه های برینفاک ، خصوصا آنهایی که پیچیده هستند خیلی سخت است در حالی که نوشتن همان برنامه در زبانهای دیگر مثلC خیلی آسان تر است

زبان برنامه نویسی رسمی برینفاک:

برینفاک به غیر از دو دستور ورودی و خروجی ، تغییرات جزئی نسبت به زبان برنامه نویسی رسمی P” که توسط "کورادو بوهم" در سال 1964 دارد.
در حقیقت استقاده از 6 علامت معادل فرمان های برینفاک + - < > [ ] ، بوهم برنامه صریح و روشنی برای هر یک از توابع اساسی ارائه کرد تا هر تابع محاسبه پذیری را محاسبه کند.
بنابر این در مفهوم واقعی ، اولین برنامه برینفاک در سال 1964 توسط بوهم روی کاغذ شکل گرفت

مثال ها :
Hello World!
این برنامه که در ادامه می بینید کلمه Hello World! را روی مانیتور چاپ کرده و به خط بعد می رود
+++++ +++++ initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++++ ++ add 7 to cell #1
> +++++ +++++ add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
برای خوانایی بیشتر این برنامه ، خط های اضافی ، فاصله ها و توضیحات به ان اضافه شده است. برینفاک همه کاراکتر ها غیر از +-<>[],. رو نادیده می گیرد . بنابراین هیچ سینتکس (نحو) خاصی برای توضیحات لازم نیست (در صورتی که توضیحات اضافی شامل کاراکتر های فرمانی برینفاک نباشند)
برنامه ای که در بالا نوشته شد بدون فاصله و توضیحات اضافی اینگونه می شود:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
خط اول به سادگی با 10 بار اضافه کردن به صفر a[0] = 10 مقدار دهی میکند.حلقه ای که در خط 2 است خانه های آرایه را به این شکل مقدار دهی میکند:
a[1] = 70 که نزدیک کد اسکی 72 یعنی H است
a[2] = 100 که نزدیک کد اسکی 101 یعنی e است
a[3] = 30 که نزدیک کد اسکی 32 یعنی خط فاصله (Space) است
a[4] = 10 که رفتن به خط جدید (Newline) است
در حقیقت این برنامه 3 شاخص در بین کد های اسکی انتخاب می کند که بیشترین نزدیکی به کاراکتر های Hello World داشته باشند. با این ترتیب با عقب و جلو رفت ها مداوم اشارگر در فضای حافظه کاراکتر به کاراکتر چاپ میکند
به عنوان مثال برای چاپ H آرایه a[1] را دو واحد اضافه کرده (++) و چاپ میکند.

Cell-clear

[-]
این برنامه ساده با کم کردن مداوم مقدار مکان فعلی را صفر می کند

Clear previous cells


[ [-] < ]
خانه فعلی و همه خانه های قبل از آن را پاک می کند.

Rewind


[<]>
اشاره گر را تا زمانی که صفر پیدا کند کاهش میدهد.سپس آن را تا زمانی که به غیر صفر نرسیده افزایش میدهد

Fast-forward


[>]<اشاره گر را تا زمانی که صفر پیدا کند افزایش میدهد.سپس آن را تا زمانی که به غیر صفر نرسیده کاهش میدهد

Simple loop


,[.,]این برنامه در یک حلقه تکرار هر چیزی را که از صفحه کلید بگیرد روی صفحه نمایش چاپ می کند (Echo)
این برنامه به شکل های زیر نیز نوشته می شود:
,+[-.,+]یا
,[.[-],]
Moving the pointer


>,[.>,]این برنامه هم کار برنامه قبلی را انجام می دهد با این تفاوت که ورودی را در آرایه ذخیره می کند تا بعدا استفاده کند

Conditional loop statements


,----------[----------------------.,----------]
این برنامه حروف کوچک را از ورودی دریافت و در خروجی حروف بزرگ آن را چاپ می کند( با فشردن کلید اینتر)

Addition


,>++++++[<-------->-],[<+>-]<.
این برنامه دو عدد تک رقمی را با هم جمع کرده و نمایش می دهد. به عنوان مثال اگر وردی 43 باشد خروجی 7 می شود437جواب صحیح فقط در صورتی است که جمع دو عدد هم تک رقمی باشد

Multiplication


,>,>++++++++[<------<------>>-] <<[>[>+>+<<-]>>[<<+>>-]<<<-] >>>++++++[<++++++++>-]<.>.
این برنامه هم دقیقا مانند بالای است برای ضرب دو عدد تک رقمی


و در آخر :
این زبان برنامه نویسی کابردی نیست و فقط به اصطلاح جهت رو کم کنی برنامه نویسان نوشته شده است.
اگر بتوانید مغز خودتان را سالم نگه دارید و نگذارید منفجر شود حتی میتوانید ویندوز هم با این برنامه بنویسید!!!
این زبان جهت یاد گیری کار با حافظهو اشاره گر ها خیلی مفید است
هیچ متغیری در این زبان استفاده نشده است و تنها با کمک یک اشاره گر تمام کار ها انجام می شود.