معرفی زبان برنامه‌‌نویسی:BrainF*ck

با سلام، چند سری مطلب قصد دارم بگذارم برای معرفی زبان‌هایی که خودم "اندکی" باهاشون کار کردم و یک یا چند نکته از آن‌ها برایم جالب بوده‌اند. طبیعتا تعدادی از زبان‌هایی که معرفی می‌کنم برنامه‌نویس حرفه‌ای دارند و خیلی بهتر و بیش‌تر از من به مفاهیم زبان مسلط هستند، از آن ها تقاضا دارم مطلب من را کامل کنند :)

زبان اولی که قصد معرفی دارم(و زبان محبوب خودم هست) زبان brainf*ck هست که اولین نکته‌ای که باید بدونید اینه که اسمش کاملا شایسته‌است و سعی نکنید باهاش برنامه‌نویسی کنید و از اون بدتر برنامه نویسی رو باهاش به کسی آموزش بدید.

یادگیریاین زبان بسیار ساده است ولی برنامه‌نویسی با اون بسیار سخته به این دلیل که کلا از ۸ تا کامند پشتیبانی می‌کنه و به جز اون‌ها هرچی در فایل برنامه باشه به عنوان کامنت در نظر گرفته می‌شه.

فکر می‌کنم این زبان مختصر ترین زبان Turing complete باشه و برای همینه که اینقدر معروف شده ولی در عمل کسی ازش استفاده نمی‌کنه :)

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

> = increases memory pointer, or moves the pointer to the right 1 block.
< = decreases memory pointer, or moves the pointer to the left 1 block.
+ = increases value stored at the block pointed to by the memory pointer
- = decreases value stored at the block pointed to by the memory pointer
[ = like c while(cur_block_value != 0) loop.
] = if block currently pointed to's value is not zero, jump back to [
, = like c getchar(). input 1 character.
. = like c putchar(). print 1 character to the console

توضیحات بیش‌تر را در این لینک مطالعه کنید

اما زبان چطوری کار می‌کند: در این زبان شما یک اشاره‌گر و یک حافظه نامحدود دارید که با دستور های < و > می توانید در خانه‌های حافظه جا به جا شوید، با دستور های + و − مقدار آن خانه حافظه یکی کم یا زیاد می‌شود و وظیفه چاپ و گرفتن اطلاعات از کاربر با "." و "," است.

احتمالا سخت ترین قسمت زبان for آن باشد(شاید هم while مناسب تر باشد) که با دستورات ] , [ کار می‌کند و دستورات داخل براکت را تا وقتی اجرا می‌کند (دقیقا نفهمیدم با چه زمانی :)) )

همون‌طورکه حدس می‌زنید در این زبان string به کلی وجود ندارد، آن هم نه مثل c که با char* هندل بشود بلکه به کلی وجود ندارد و یه helloworld ساده مشابه زیر خواهد بود:

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

البته چندین مدل دیگر هم امکان پیاده‌سازی helloworld وجود دارد و این نشان از قدرت و انعطاف پذیری زبان است. #شوخی

از مصاعب استفاده از زبان غیر از خود زبان، سرچ کردن چیزی مربوط به آن است که با توجه به تعدد روش های نوشتن اسم زبان شما را مجبور به چندین با سرچ می‌کند.

چند آموزش مفید برای زبان:

https://blog.klipse.tech/brainfuck/2016/12/17/brainfuck.html
http://cydathria.com/bf/brainfuck.html

به نظرم ایشون واقعا تلاش شایسته تقدیری کرده و چندین الگوریتم و برنامه معروف رو به این زبان نوشته:

http://www.hevanet.com/cristofd/brainfuck/

چند مفسر آنلاین هم هست که برنامه‌هاتون رو می‌تونید توش اجرا کنید:

https://fatiherikli.github.io/brainfuck-visualizer/
https://sange.fi/esoteric/brainfuck/impl/interp/i.html
https://copy.sh/brainfuck/


یکی از تمرین‌های خوب هم نوشتن یک کامپایلر برای brainf*ck هست (که من هم انجامش دادم :) ) با کمی سرچ آموزش‌ها و سورس کد‌های مرتبط رو می‌تونید پیدا کنید.