پسر
پسر
خواندن ۳ دقیقه·۲ سال پیش

زبان برنامه نویسی شیطان ( Brainfuck )

نمونه کد واقعی از زبان brainfuck
نمونه کد واقعی از زبان brainfuck

میدونم که خیلی کنجکاوی بدونی شیطان با چه زبانی برنامه نویسی میکنه و ابزار های شوم رو توسعه میده، من توی عمق این اقیانوس صفر و یک یه زبان برنامه نویسی خیلی عجیب و مرموز پیدا کردم که مطمعنم فقط خود شیطان ازش استفاده میکنه. خالق این زبان یه دانشجوی فیزیک سوییسی دیونه ست که سال ۱۹۹۲ اولین کامپایلر رو به نام Aminet با حجم ۲۹۶ بایت برای این زبان ارائه کرد!

معرفی زبان Brainfuck یا BF

اربن مولر (Urban Müller) دانشجوی رشته فیزیک کشور سوییس سال ۱۹۹۲ شروع به ساخت زبانی کرد که تا حدممکن کامپایلر کوچیک و سبکی داشته باشه. اون با الهام گرفتن از کامپایلر 1024 زبان FALSE تونست برای چیزی که توی سرش داشت یه کامپایلر به نام Aminet با ۲۹۶ بایت حجم به زبان C بسازه و سال بعد منتشر کنه!
جالبه بدونید که توی نسخه دوم Aminet رو به حجم ۲۴۰ بایت رسوند و بعد ها کامپایلر های بیشتر و کم حجم تری برای این زبان نوشته شد که یکی از اونها فقط ۱۰۰ بایت حجم داره، پس از مدتی با رشد محبوبیت بیشتری برای سیستم عامل های دیگه هم پیاده و قابل اجرا شد.
اربن مولر هم مثل بقیه سازنده زبان های برنامه نویسی برا ساخت BF از زبان های دیگه ای الهام گرفته که بالاتر به FALSE اشاره کردیم اما از زبان P هم برای پیاده سازی سینتکس تقلید کرده که سال ۱۹۶۴ ساخته شده...
همچنین در صورت دسترسی به مقدار نامحدودی از حافظه، BF از نظر تئوری قادر به محاسبهٔ هر عملکرد قابل محاسبه یا شبیه‌سازیِ هر گونه مدل محاسباتی هست ( مدل ماشین تورینگ )
شما به عنوان برنامه نویس BF باید حوصله خیلی زیادی داشته باشید چون برنامه هایی که می نویسید دیباگ خیلی سختی رو شامل میشن و کد های طولانی رو باید بنویسید. همونطور که از اسم این زبان خیلی واضح و صریح مشخصه (BrainFuck) کار کردن باهاش خیلی سخته و به گفته کسانی که اون رو تست کردن گفتن واقعا بهترین اسمی که میتونه داشته باشه همینه، لعنتی کردن مغز :)))

کد برنامه سلام دنیا به زبان BF :

// Left To Right ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

هیچ چیزی توی دنیا بی کاربرد نیست، راستش من نتونستم برنامه خاصی رو پیدا کنم که واقعا از BF استفاده کرده باشه فقط متوجه شدم توی یسری مسابقات برنامه نویسی ازش به کار میره، برای مردم بیشتر جنبه فان داره و بخاطر تنوع و کل کل کار میکنن اما توی زیرزمین برنامه نویسی شیطان برای کار های خرابکارانه باهاش کد میزنه و روز به روز داره باهاش ابزار های قوی تری میسازه!

ساختار کلی

زبان BF فقط کلا از ۸ دستور ساخته شده :

< یکی به اشاره‌گر داده می‌افزاید (تا به سلول بعدی سمت راست اشاره کند). > یکی از اشاره‌گر داده می‌کاهد (تا به سلول قبلی سمت چپ اشاره کند). + یکی به بایت محل اشاره‌گر می‌افزاید. - یکی از بایت محل اشاره‌گر می‌کاهد. . بایت محل اشاره‌گر را به خروجی می‌دهد. , یک بایت ورودی می‌گیرد و آن را در بایت مورد اشاره اشاره‌گر ذخیره می‌کند. [ اگر بایت در محل مورد اشاره اشاره‌گر صفر بود، به جای بردن شمارنده برنامه به جلو به دستور بعدی، به دستور بعد از ] متناظر می‌پرد. ] اگر بایت در محل مورد اشاره اشاره‌گر غیرصفر بود، به جای بردن شمارنده برنامه به جلو به دستور بعدی، به دستور قبل از [ متناظر می‌پرد.

معادل این دستورها تو زبان برنامه نویسی C : (ptr از نوع unsigned char* هست)

// Left To Right (شروع برنامه) char array[infinitely large size] = {0};char *ptr=array; > ++ptr; < --ptr; + ++*ptr; - --*ptr; . putchar(*ptr); , *ptr=getchar(); [ while (*ptr){ ] }

نمونه ساده کامپایلر BF که به زبان C نوشته شده :

#include <stdio.h> #include <stdlib.h> #define MAX_MEMORY 30000 void brainfuck(const char *code, const char *input) { unsigned char *pcd,*dp,*inp,cn; dp=malloc(MAX_MEMORY); memset(dp, 0,MAX_MEMORY*sizeof(dp[0])); inp=input; pcd=code; for(pcd;pcd<(code+strlen(code));++pcd){ if(*pcd=='>')++dp; if(*pcd=='<')--dp; if(*pcd=='+')++*dp; if(*pcd=='-')--*dp; if((*pcd==',')&&(inp<=input+strlen(input))){*dp=*inp;++inp;} if(*pcd=='.'){putchar(*dp);} if(*pcd==']') { cn=0; if(*dp!=0) for(pcd;pcd>=code;--pcd) { if(*pcd==']')cn--; if(*pcd=='[')cn++; if(cn==0)break; } } if(*pcd=='[') { cn=0; if(*dp==0) for(pcd;pcd<(code+strlen(code));++pcd) { if(*pcd=='[')cn--; if(*pcd==']')cn++; if(cn==0)break; } } } } char program[MAX_MEMORY]; int main(int argc,char **argv) { FILE *file; if(argc>1){ int i=0; file = fopen(argv[1],&quotr&quot); while ((*(i+program)=fgetc(file))&&(i<MAX_MEMORY)) ++i; brainfuck(program,(argc>2)?argv[2]:&quot&quot); } }

اگه به این زبان علاقه مند شدید میتونید از کامپایلر آنلاین rextester استفاده کنید.

این کد هم اجرا کنید خروجی رو ببینید لذت ببرید :

// Left To Right +++++-++++[>+++++++++>><++++-+++++++>++++++++<<<-]>+.>++.>+.<----.


درآخر بگم که اصطلاح زبان برنامه نویسی شیطان رو از خودم درنیوردم و واقعا اینو بهش نسبت میدن D:

اگه تجربه ای با این زبان دارید حتما توی کامنت ها بگید ;)
یا اگه فکر میکنید چیزی رو جا انداختم بگید تا اضافه کنم.


- جمعه ۷ مرداد ۱۴۰۱ -
- زمان داره مثل بنز میره جلو، کاش میشد نگهش داشت -


-Join My Network-
the-pesar.gituhb.io

برنامه نویسیbfbrainfuckشیطانc
شاید از این پست‌ها خوشتان بیاید