دماغي

لغة البرمجة Brainfuck هي لغة برمجة غامضة ابتكرها الطالب السويسري أوربان مولر عام 1993. [ 1 ] صُممت لتكون بسيطة للغاية ، وتتكون اللغة من ثمانية أوامر بسيطة فقط، ومؤشر بيانات ، ومؤشر تعليمات . [ 2 ]

يُعدّ Brainfuck مثالًا على ما يُسمى بـ" مأزق تورينج" : إذ يُمكن استخدامه لكتابة أي برنامج، لكنّ ذلك غير عملي نظرًا لقلة التجريد فيه، ما يجعل البرامج طويلة ومعقدة للغاية. ورغم أن Brainfuck كامل تورينج [ 3 ] [ 4 ] [ 5 إلا أنه ليس مُصممًا للاستخدام العملي، بل لتحدي المبرمجين وإمتاعهم [ 6 ] [ 7 ] . يتطلب Brainfuck تقسيم البرامج إلى تعليمات صغيرة وبسيطة.

تستمد اللغة اسمها من المصطلح العامي brainfuck ، والذي يشير إلى الأشياء المعقدة أو غير العادية لدرجة أنها تتجاوز حدود فهم المرء، حيث لم يكن المقصود منها أو تم إنشاؤها لتصميم برامج فعلية ولكن لتحدي حدود برمجة الكمبيوتر .

ولأن اسم اللغة يحتوي على ألفاظ نابية ، يتم استخدام العديد من الأسماء البديلة، مثل brainf*ck و brainfsck و branflakes و brainoof و brainfrick و BrainF و BF. [ 8 ]

تاريخ

صمّم مولر لغة Brainfuck بهدف إنشاء أصغر مُترجم ممكن ، [ 9 ] مستوحياً ذلك من مُترجم لغة البرمجة FALSE الذي يبلغ حجمه 1024 بايت . [ 10 ] [ 11 ] نُفّذ مُترجم مولر الأصلي بلغة التجميع Motorola 68000 على جهاز Amiga ، وتمت ترجمته إلى ملف ثنائي بحجم 296 بايت. رفع مولر أول مُترجم Brainfuck إلى Aminet عام 1993. [ 12 ] جاء البرنامج مُرفقاً بملف "Readme" الذي وصف اللغة بإيجاز، وتحدى القارئ قائلاً: "من يستطيع برمجة أي شيء مفيد بها؟ :)". أضاف مولر أيضاً مُفسّراً وبعض الأمثلة. استخدمت نسخة ثانية من المُترجم 240 بايت فقط. [ 12 ] [ 5 ] 

تصميم اللغة

تتألف لغة البرمجة من ثمانية أوامر . [ 13 ] برنامج Brainfuck عبارة عن سلسلة من هذه الأوامر. تُنفَّذ الأوامر بالتتابع، مع بعض الاستثناءات: يبدأ مؤشر التعليمات من الأمر الأول، ويُنفَّذ كل أمر يُشير إليه، وبعد ذلك ينتقل عادةً إلى الأمر التالي. ينتهي البرنامج عندما يتجاوز مؤشر التعليمات الأمر الأخير.

في نموذج الآلة المجردة المتعارف عليه للغة Brainfuck، يعمل البرنامج على شريط ذاكرة أحادي البعد، مُفهرس من الصفر وممتد بلا حدود إلى اليمين . [ 14 ] تحتوي كل خلية على عدد صحيح غير مُوقّع من 8 بت (0-255) ويتم تهيئتها إلى الصفر. تُجرى العمليات الحسابية على الخلايا بتردد 256 ، لذا فإن زيادة 255 تُنتج 0، وإنقاص 0 يُنتج 255. يُشير مؤشر البيانات (المُهيأ للإشارة إلى البايت الأيسر من المصفوفة) إلى الخلية الحالية على الشريط، ويمكنه التحرك يمينًا أو يسارًا. التحرك يسارًا من الخلية الأولى (الفهرس 0) غير مُعرّف. تُوفر اللغة ثمانية أوامر تُعدّل الشريط، وتُحرّك المؤشر، وتُجري عمليات الإدخال/الإخراج (باستخدام ترميز ASCII )، أو تُنفّذ حلقات تحكم.

تتكون أوامر اللغة الثمانية من حرف واحد لكل منها:

شخصيةتم تنفيذ التعليمات
>قم بزيادة مؤشر البيانات بمقدار واحد (للإشارة إلى الخلية التالية إلى اليمين).
<يُنقص مؤشر البيانات بمقدار واحد (ليشير إلى الخلية التالية إلى اليسار). القيمة غير مُعرّفة إذا كانت القيمة 0.
+قم بزيادة البايت الموجود عند مؤشر البيانات بمقدار واحد modulo 256.
-قم بإنقاص البايت الموجود عند مؤشر البيانات بمقدار واحد modulo 256.
.قم بإخراج البايت الموجود عند مؤشر البيانات.
,يستقبل بايتًا واحدًا من المدخلات، ويخزن قيمته في البايت الموجود عند مؤشر البيانات. [ ب ]
[إذا كانت البايت الموجودة عند مؤشر البيانات صفرًا، فبدلاً من تحريك مؤشر التعليمات إلى الأمام إلى الأمر التالي، قم بالقفز به إلى الأمام إلى الأمر الذي يلي الأمر المطابق] .
]إذا كانت قيمة البايت عند مؤشر البيانات غير صفرية، فبدلاً من تحريك مؤشر التعليمات إلى الأمام إلى الأمر التالي، قم بإعادته إلى الأمر الذي يلي الأمر المطابق[ . [ ج ]

ملحوظات

  • كانت لغة P′′ الأقدم بكثير تتضمن بالفعل ثلاثة من هذه الأوامر، وهي > و[ و]، مع الإشارة إليها بالرموز R و( و) بدلاً من ذلك، بينما جمع الأمر الرابع في P′′، والذي يُرمز إليه بالرمز λ، بين + و< في أمر واحد. وكما هو الحال في آلة تورينج التي مثّلتها، افتقرت P′′ إلى أوامر الإدخال/الإخراج.
  • يمكن تداخل الحلقات[ بشكل عشوائي ، ]ويجب مطابقة جميع الأقواس بشكل صحيح، مما يجعل مجموعة البرامج الصالحة لغةً خالية من السياق . تُخصص العديد من التطبيقات العملية مصفوفة محدودة من الخلايا (عادةً 30000 بايت على الأقل) [ أ ] وتستخدم خلايا 8 بت مع التفاف، على الرغم من أن عدد الخلايا المحدد أو سلوك الالتفاف ليسا مطلوبين من جميع المفسرات. [ 15 ] [ 16 ]
  • في التطبيقات التي تستخدم خلايا غير موقعة بحجم 8 بتات مع التفاف حسابي عند 256، تكون إحدى تعليمات +"أو" -زائدة. فزيادة قيمة خلية بمقدار واحد تعادل إنقاصها 255 مرة متتالية، وإنقاصها بمقدار واحد تعادل زيادتها 255 مرة متتالية. وبناءً على ذلك، +يمكن التعبير عن التعليمة على النحو التالي:-255{\displaystyle -^{255}}أو -التعليمات على النحو التالي+255{\displaystyle +^{255}}. [ د ]

عادةً ما يصعب فهم برامج Brainfuck. ويعود ذلك جزئيًا إلى أن أي مهمة معقدة نوعًا ما تتطلب سلسلة طويلة من الأوامر، وجزئيًا إلى أن نص البرنامج لا يُقدم أي مؤشرات مباشرة على حالته . هذه الأسباب، بالإضافة إلى عدم كفاءة Brainfuck وقدراتها المحدودة في الإدخال والإخراج، هي بعض الأسباب التي تجعلها غير مستخدمة في البرمجة الجادة. مع ذلك، وكأي لغة كاملة تورينج، فإن Brainfuck قادرة نظريًا على حساب أي دالة قابلة للحساب أو محاكاة أي نموذج حسابي آخر إذا أُتيحت لها إمكانية الوصول إلى كمية غير محدودة من الذاكرة والوقت. [ 3 ] وقد كُتبت العديد من برامج Brainfuck. [ 17 ] على الرغم من صعوبة كتابة برامج Brainfuck، وخاصة المعقدة منها، إلا أنه من السهل نسبيًا كتابة مترجم لـ Brainfuck بلغة أكثر شيوعًا مثل C نظرًا لبساطتها. كما توجد مترجمات لـ Brainfuck مكتوبة بلغة Brainfuck نفسها. [ 18 ] [ 19 ]

أمثلة

مرحبا بالعالم!

يطبع البرنامج التالي عبارة "Hello World!" وسطرًا جديدًا على الشاشة. لاحظ أن لغة Brainfuck تستخدم نظام ASCII للأحرف.

[ يطبع هذا البرنامج عبارة "Hello World!" وسطرًا جديدًا على الشاشة؛  ويبلغ طوله 106 أحرف أوامر نشطة . [ وهو ليس الأقصر . ] هذه الحلقة هي "حلقة تعليق أولية" ، وهي طريقة بسيطة لإضافة تعليق  إلى برنامج BF بحيث لا داعي للقلق بشأن  أحرف الأوامر . يتم  تجاهل أي أحرف " . " و " " و " " و " " و " " + " و " " " و " " < " و " " " " " " " "" ")) "." . )))) ) )...... "....... يجب فقط موازنة الأحرف " )) ": ": ". ") ) " . يتم تجاهل هذه  الحلقة والأوامر التي تحتويها لأن الخلية الحالية  قيمتها الافتراضية هي 0؛ القيمة 0 تتسبب في تخطي هذه الحلقة . ] ++++++++ ""  عيّن قيمة الخلية رقم 0 إلى 8 [ "] ++++  أضف 4 إلى الخلية رقم 1؛ سيؤدي هذا دائمًا إلى تعيين قيمة الخلية رقم 1 إلى 4  [" "'" " ' " "'" "' " "' " "' "  "'" "'" "'' ""'" <"'" "''" <"'" "''" <"'" "''" <" ' "  > " ' " >  "  '  "  " . عدد التكرارات 4 > +  أضف 1 إلى الخلية رقم 2 > +  أضف 1 إلى الخلية رقم 3 > -  اطرح 1 من الخلية رقم 4 >> +  أضف 1 إلى الخلية رقم 6 [ < ]  ارجع إلى أول خلية صفرية تجدها؛ ستكون هذه  الخلية رقم 1 التي تم مسحها بواسطة الحلقة السابقة < -  قلل عداد الحلقة في الخلية رقم 0 ]  كرر حتى تصبح الخلية رقم 0 صفرًا؛ عدد التكرارات 8نتيجة ذلك هي: رقم الخلية: 0 1 2 3 4 5 6 المحتويات: 0 0 72 104 88 32 8 المؤشر: ^>> .  الخلية رقم 2 قيمتها 72 وهي 'H' > --- .  اطرح 3 من الخلية رقم 3 لتحصل على 101 وهي 'e' +++++++ .. +++ .  وبالمثل بالنسبة لـ 'llo' من الخلية رقم 3 >> .  الخلية رقم 5 قيمتها 32 للمسافة < - .  اطرح 1 من الخلية رقم 4 لتحصل على 87 لتحصل على 'W' < .  تم تعيين الخلية رقم 3 إلى 'o' من نهاية 'Hello' +++ . ------ . -------- .  الخلية رقم 3 لـ 'rl' و 'd' >> + .  أضف 1 إلى الخلية رقم 5 لتحصل على علامة تعجب > ++ .  وأخيرًا سطر جديد من الخلية رقم 6

لتحسين سهولة القراءة، تم توزيع هذا الكود على عدة أسطر، مع إضافة مسافات وتعليقات. يتجاهل Brainfuck جميع الأحرف باستثناء الأوامر الثمانية، +-<>[],.لذا لا حاجة إلى صيغة خاصة للتعليقات (طالما أن التعليقات لا تحتوي على أحرف الأوامر). كان من الممكن كتابة الكود على النحو التالي:

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

يُقدَّم هنا مثال آخر لبرنامج "مرحباً بالعالم". [ 20 ] يُبرز هذا المثال مدى تعقيد اللغة. فعلى سبيل المثال، بعد طباعة الحرف "e"، من الضروري زيادة قيمة الخلية رقم 3 للانتقال إلى الحرف "l". ولا يتطلب عرض الحرف "l" الثاني أي تعديلات إضافية، لأن الخلية 3 تحتوي بالفعل على الحرف "l".

جمع قيمتين

كمثال بسيط أولي، ستضيف الشيفرة البرمجية التالية قيمة الخلية الحالية إلى الخلية التالية: في كل مرة تُنفذ فيها الحلقة، تُنقص قيمة الخلية الحالية، ويتحرك مؤشر البيانات إلى اليمين، ثم تُزاد قيمة الخلية التالية، ويتحرك مؤشر البيانات إلى اليسار مرة أخرى. يتكرر هذا التسلسل حتى تصبح قيمة الخلية الابتدائية صفرًا.

[ - > + < ]

يمكن دمج ذلك في برنامج جمع بسيط على النحو التالي: ج0أخير=((2تعديل256)+(5تعديل256))تعديل256=7تعديل256=7{\displaystyle c0_{\text{final}}={\big (}(2{\bmod {2}}56)+(5{\bmod {2}}56){\big )}{\bmod {2}}56=7{\bmod {2}}56=7}

++  الخلية c0 = 2 > +++++  الخلية c1 = 5[  ابدأ حلقاتك بمؤشر الخلية على عداد الحلقات (c1 في حالتنا) < +  أضف 1 إلى c0 > -  اطرح 1 من c1 ]  أنهِ حلقاتك بمؤشر الخلية على عداد الحلقاتفي هذه المرحلة، أضاف برنامجنا 5 إلى 2، تاركًا 7 في c0 و0 في c1، لكن لا يمكننا إخراج هذه القيمة إلى الطرفية لأنها ليست مشفرة بنظام ASCII.لعرض الحرف "7" في نظام ASCII، يجب إضافة 48 إلى القيمة 7. نستخدم حلقة تكرارية لحساب 48 = 6 × 8++++ ++++  c1 = 8، وهذا سيكون عداد الحلقة مرة أخرى [ < +++ +++  أضف 6 إلى c0 > -  اطرح 1 من c1 ] < .  اطبع c0 الذي قيمته 55، أي "7"!

ROT13

يقوم هذا البرنامج بتشفير مدخلاته باستخدام خوارزمية ROT13 . وللقيام بذلك، يجب عليه تحويل الأحرف AM ( ASCII 65-77) إلى NZ (78-90)، والعكس صحيح. كما يجب عليه تحويل am (97-109) إلى nz (110-122)، والعكس صحيح. يجب عليه تحويل جميع الأحرف الأخرى إلى نفسها؛ يقرأ البرنامج الأحرف واحدًا تلو الآخر ويُخرج ما يُقابلها من رموز مُشفّرة حتى يصل إلى نهاية الملف (EOF) (والتي يُفترض هنا أنها إما -1 أو "لا تغيير")، وعندها يتوقف البرنامج.

- , + [  اقرأ الحرف الأول وابدأ حلقة قراءة الأحرف الخارجية - [  تخطي للأمام إذا كان الحرف 0 >> ++++ [ > ++++++++ < - ]  إعداد المقسوم عليه (32) لحلقة القسمة  (تخطيط الذاكرة: المقسوم، النسخة، الباقي، المقسوم عليه، الناتج، صفر، صفر) < + < - [  إعداد المقسوم (س ناقص 1) والدخول إلى حلقة القسمة > + > + > - [ >>> ]  زيادة النسخة والباقي / تقليل المقسوم عليه / الحالة العادية: تخطي للأمام < [[ > + < - ] >> + > ]  حالة خاصة: إعادة الباقي إلى المقسوم عليه وزيادة الناتج <<<<< -  إنقاص المقسوم ]  إنهاء حلقة القسمة ] >>> [ - ] +  إنهاء حلقة التخطي؛ تصفير المقسوم عليه السابق وإعادة استخدام المساحة لعلامة > -- [ - [ < - > +++ [ - ]]] < [  تصفير تلك العلامة إلا إذا كان الناتج 2 أو 3؛ تصفير الناتج؛ تحقق من العلم ++++++++++++ < [  إذا كان العلم موجودًا، فقم بإعداد المقسوم عليه (13) لحلقة القسمة الثانية  (تخطيط الذاكرة: صفر، نسخ المقسوم، المقسوم عليه، الباقي، ناتج القسمة، صفر، صفر) > - [ > + >> ]  قلل المقسوم عليه؛ الحالة العادية: زد الباقي > [ + [ < + > - ] > + >> ]  حالة خاصة:زيادة الباقي / إعادته إلى المقسوم عليه / زيادة ناتج القسمة <<<<< -  إنقاص المقسوم ]  إنهاء حلقة القسمة >> [ < + > - ]  إضافة الباقي إلى المقسوم عليه للحصول على 13 > [  تخطي للأمام إذا كان ناتج القسمة 0 - [  إنقاص ناتج القسمة وتخطي للأمام إذا كان ناتج القسمة 1 - << [- ] >>  صفّر ناتج القسمة والمقسوم عليه إذا كان ناتج القسمة 2 ] << [ << - >> - ] >>  صفّر المقسوم عليه واطرح 13 من النسخة إذا كان ناتج القسمة 1 ] << [ << + >> - ]  صفّر المقسوم عليه وأضف 13 إلى النسخة إذا كان ناتج القسمة 0 ]  نهاية حلقة التخطي الخارجية (انتقل إلى هنا إذا لم يكن ((الحرف ناقص 1)/32) يساوي 2 أو 3) < [ - ]  امسح الباقي من القسمة الأولى إذا تم تخطي القسمة الثانية < . [ - ]  أخرج الحرف المُعاد تدويره 13 مرة من النسخة وامسحه < - , +  اقرأ الحرف التالي ]  نهاية حلقة قراءة الأحرف

محاكاة التكوين التلقائي للحياة

في عام 2024، استخدم مشروع بحثي لشركة جوجل نسخة معدلة قليلاً من لغة Brainfuck، تتألف من 10 أوامر، مع مؤشرات قراءة وكتابة منفصلة، ​​بالإضافة إلى أوامر نقل المؤشرات، كأساس لبيئة رقمية اصطناعية. في هذه البيئة، وجد الباحثون أن المُستنسخات نشأت بشكل طبيعي وتنافست فيما بينها للسيطرة على البيئة. [ 21 ]

انظر أيضاً

ملحوظات

  1. ملاحظة 1 2 : إن أحد متغيرات لغة Brainfuck ذات الشريط المحدود وقيم الخلايا المحدودة ليس كاملاً تورينج . فهو يحتوي على عدد محدود فقط من التكوينات، وبالتالي فهو مكافئ لآلة ذات حالات محدودة ، تتعرف بدقة على اللغات المنتظمة في التسلسل الهرمي لتشومسكي .
  2. تم استبدال القيمة القديمة.
  3. بدلاً من ذلك،]يمكن ترجمة الأمر على أنه قفزة غير مشروطة إلى الأمر المقابل[، أو العكس؛ ستتصرف البرامج بنفس الطريقة ولكنها ستعمل بشكل أبطأ، بسبب البحث المزدوج غير الضروري.
  4. حكحح...حك أوقات{\displaystyle H^{k}\;\rightarrow \;\underbrace {HH\dots H} _{k{\text{ مرات}}}}يُعرّف هذا المصطلح بأنه تطبيق متكرر للتعليمات.

مراجع

  1. إيستر، براندي (2 أبريل 2020). "إنسان كامل، آلة كاملة: بلاغة التجريد الرقمي في البرمجة". مجلة البلاغة . 39 (2): 202-215 . doi : 10.1080/07350198.2020.1727096 . ISSN 0735-0198 . S2CID 219665562 .  
  2. تيمكين، دانيال (1 سبتمبر 2017). "لغة بلا شفرة: لغات برمجة غير قابلة للاستخدام أو الحوسبة أو مفاهيمية عمدًا" . مجلة العلوم والتكنولوجيا والفنون . 9 (3): 83-91 . doi : 10.7559/citarj.v9i3.432 . ISSN 2183-0088 . مؤرشف من الأصل في 9 يوليو 2024. تم الاطلاع عليه في 11 فبراير 2024 . 
  3. 1 2 فاس، فرانس. "BF كاملة تورينج" . Iwriteiam.nl. مؤرشف من الأصل في 23 مايو 2023. تم الاسترجاع في 30 أبريل 2023 .
  4. فاس، فرانس. "URM to Brainfuck (utm.b)" . brainfuck.org . تم الاطلاع عليه في 7 ديسمبر 2025 .
  5. 1 2 مور، سيباستيان (2023). "لغات البرمجة الباطنية: مقدمة إلى Brainfuck وINTERCAL وBefunge وMalbolge وShakespeare" (ملف PDF) . morr.cc. جامعة براونشفايغ للتكنولوجيا . تاريخ الاسترجاع: 8 يناير 2026 .
  6. ^ هاوبت ، مايكل (2007) ، “تنفيذ Brainfuck في COLA” (PDF) ، معهد هاسو بلاتنر، جامعة بوتسدام ، مجموعة هندسة البرمجيات ، استرجاعها 7 ديسمبر 2025
  7. كوكس، جيف؛ ماكلين، أليكس (2014). "ليس للمتعة فقط". المتعة والبرمجيات: استكشاف اللذة والمفارقة والألم في الحوسبة . بلومزبري أكاديميك . ص 157-173 . ISBN  9781623568870.
  8. ويكي لغة إيسولانغ. "brainfuck" . esolangs.org . مؤرشف من الأصل في 23 أكتوبر 2018. تم الاطلاع عليه في 7 فبراير 2024 .
  9. "لغة برمجة Brainfuck" . Muppetlabs.com. مؤرشف من الأصل في 3 مايو 2023. تم الاطلاع عليه في 30 أبريل 2023 .
  10. فان أورتمرسن، ووتر (3 أغسطس 2013). "لغة البرمجة الخاطئة" . Strlen.com. مؤرشف من الأصل في 30 أبريل 2023. تم الاطلاع عليه في 30 أبريل 2023 .
  11. مولر، أوربان (13 يونيو 2017). التلاعب بالعقل - أو كيف تعلمت تغيير المشكلة (تاميديا ​​تي إكس 2017 - بث مباشر ويردينو) . مؤرشف من الأصل في 11 أغسطس 2023. تم الاطلاع عليه في 7 ديسمبر 2025 .
  12. 1 2 مولر، أوربان (9 يونيو 1993). "brainfuck-2.lha" . أمينيت . أمينيت. مؤرشف من الأصل في 30 أبريل 2023. تم الاسترجاع في 2 يناير 2026 .
  13. ^ فاس، فرانس. "العقل ***" . iwriteiam.nl . تم الاسترجاع في 7 ديسمبر 2025 .
  14. هاوبت 2007 ، ص 2: "تحتوي لغة Brainfuck على مصفوفة من 30000 خلية، تحتوي كل منها على حرف ASCII." [ أ ]
  15. هاوبت 2007 ، ص. 2.
  16. "ثوابت Brainfuck" . تم الاطلاع عليه بتاريخ 24 ديسمبر 2025 .
  17. "فهرس /esoteric/brainfuck/bf-source/prog" . sange.fi. 22 يناير 2002. مؤرشف من الأصل في 30 أبريل 2023. تم الاطلاع عليه في 30 أبريل 2023 .
  18. فاس، فرانس. "مترجم BF مكتوب بلغة BF" . Iwriteiam.nl. مؤرشف من الأصل في 22 سبتمبر 2024. تم الاطلاع عليه في 30 أبريل 2023 .
  19. كريستوفاني، دانيال ب. "مترجم لغة براينفك" . مؤرشف من الأصل في 22 سبتمبر 2024. تم الاطلاع عليه في 7 ديسمبر 2025 .
  20. كليجل، ماركوس (22 أبريل 2022). "مجلة المعارضة المتنافرة، العدد 10 - الملف 19 • نيبروس" . Neperos.com . تم الاطلاع عليه في 7 ديسمبر 2025 .
  21. أغويرا إي أركاس، بليز ؛ ألاكويجالا، يركي؛ إيفانز، جيمس؛ لوري، بن ؛ موردفينتسيف، ألكسندر؛ نيكلاسون، إيفيند؛ رانداتزو، إيتوري؛ فيرساري، لوكا (2024). "الحياة الحاسوبية: كيف تنشأ البرامج ذاتية التكرار والمُصممة جيدًا من تفاعل بسيط". arXiv : 2406.19108 [ cs.NE ].