هشدار : این پست فقط وقت شما رو تلف میکنه. لطفا نخونیدش، ممنون.
Brainfu** یه زبان برنامه نویسی مفید نیست. اصولا فقط یک چالشه که فقط باعث میشه شما وقتتون رو تلف کنید. خوب ، برام جذاب شد، رفتم یادش گرفتم. نیم ساعتی وقتمو حروم کرد، و حالا میخوام همینجا یه راهنمای نسبتا کامل از این زبان بنویسم.
برای داشتن یک کامپایلر برای این زبان میتونید از این کامپایلر که خودش با همین زبان نوشته شده، استفاده کنید. نصبش سادست، پکیجش توی AUR هست و خیلی ساده هم میشه کامپایلش کرد.
این کامپایلر چند تا مفسر داره و یک کامپایلر که کد رو به زبانهای مختلف (مثلا C و Ruby ) ترجمه میکنه. مثلا اگر فایل شما اسمش test.bf باشه، میتونید اینجوری به زبان C کامپایلش کنید :
awib < test.bf >out
برای مثلا کامپایل به کد اجرایی سی و دو بیتی باید بالای کد، (منظور توی خط اول test.bf ) این عبارت نوشته بشه
@386_linux
و فایل خروجی کد باینری میشه
و برای اجرای کد، بدون کامپایل میتونید اینکار رو انجام بدید :
bfint32 test.bf
البته نسخه های ۸ بیتی (bfint8) ۱۶ بیتی و حتی ۶۴ بیتی هم موجوده، تفاوت اینها اینه که هر کدوم از اینها خانه های پشته رو چند بیتی در نظر میگیرند.
توی Brainfu** شما یک اشاره گر دارید و یک پشته به طول سی هزار بایت، که در ابتدا همه این پشته با صفر پر شده و اشاره گر شما به ابتدای این پشته اشاره
میکنه.اول معرفی دستورات :
>
علامت بزرگتر، که باعث میشه اشاره گر یکی در پشته به جلو حرکت کنه.
<
علامت کوچکتر که اشاره گر رو یکی به عقب برمیگردونه
– نکته : مفهوم خروج از پشته زیاد مشخص تعریف نشده مشخص نیست از پشته خارج بشی چی میشه! ولی کامپایلر یه هشدار میده.
+
محتوای جایی که اشارهگر به اون اشاره میکنه یکی زیاد میکنه
-
محتوای جایی که اشارهگر به اون اشاره میکنه رو یکی کم میکنه.
.
محتوای جایی که اشارهگر بهش اشاره میکنه رو در خروجی چاپ میکنه
,
از کاربر یک کاراکتر میگیره و در مکان فعلی اشارهگر قرار میده.
[
شروع حلقه، وارد حلقه میشود اگر بایتی که اشاره گر به آن اشاره میکند صفر نباشد
]
پایان حلقه، به محل شروع حلقه برمیگردد
کامنت ها هم در اصل به صورت // تغریف شدند ولی این کامپایلر مدلهای مختلفی رو پشتیبانی میکنه که میتونید توی راهنمای خودش ببینیدشون.
خوب همین. میرسیم به مثال :
++++++++++[>++++++++++<-]>.
این کد حرف d رو در خروجی چاپ میکنه. کاراکتر d کوچک، معادل عدد ۱۰۰ میشه. ۱۰ تا + اول، مقدار بایت اول رو ۱۰ میکنن. بعد که وارد حلقه میشه، یک بایت به سمت جلو حرکت میکنیم که اول مقدارش صفره. ۱۰ تا + بعدی مقدارش رو میرسونن به ۱۰ بعد یک بایت به عقب برمیگردیم و یکی از بایت اول کم میکنیم. مقدار بایت اول میشه ۹ و وقتی تو شرط حلقه چک میشه باز وارد حلقه میشه و ۱۰ تا به بایت دوم اضافه میشه. این عمل ۱۰ بار تکرار میشه تا بایت اول صفر بشه و بایت دوم ۱۰۰ . وقتی از حلقه خارج میشیم، یکی به جلو حرکت میکنیم (بایت دوم) و اونو چاپ میکنیم. یعنی همون عدد ۱۰۰ رو که به صورت حرف d چاپ میشه.
حالا مثلا برای چاپ حرف f میشه اینطوری نوشت :
++++++++++[>++++++++++<-]>++.
میبینید که همون کده، فقط بعد از خروج از حلقه و رفتن به بایت دوم،دو تا به بایت دوم اضافه شده که میشه ۱۰۲ یا همون f .
خوب برای چاپ نیک نیم من میشه اینطوری نوشت :
++++++++++[>++++++++++<-]>++. //f <++++[>+++++<-]>. //z <++++[>-----<-]>-. //e <+++[>++++<-]>+. //r ---. //o +++. //r +++. //u <++++[>-----<-]>+. //b +++++++. //i --. //g ---. //d
برای گرفتن یک کاراکتر میشه از دستور , استفاده کرد که یک کاراکتر میگیره و توی مکان فعلی پشته قرار میده، مثلا کد زیر ده تا کاراکتر میگیره و بعد اونها رو سرو ته چاپ میکنه :
,>,>,>,>,>,>,>,>,>,.<.<.<.<.<.<.<.<.<.
هر وقت بیکار بشم یه سری برنامه برای این زبان دارم که حتما وقت میذارم برای اجراشون :)) ولی خوب تا ببینم کی دوباره وقت آزاد پیدا میکنم!
مسخره بود؟ میتونم درکت کنم، ولی مشکل من نیست که تو گیک نیستی.