# بيفنج (لغة برمجة)

Befunge لغة برمجة تختلف عن اللغات التقليدية في هذه البرامج حيث يتم ترتيبها على شبكة ثنائية الأبعاد. تعليمات "Arrow" مباشرة توجه تدفق التحكم إلى اليسار أواليمين، أو صعودا أو هبوطا، والحلقات تبنى بإرسال تدفق التحكم في دورة.

## التاريخ

أنشأت اللغة أصلا عن طريق كريس بريسي في عام 1993 بوصفها محاولة لوضع لغة من أصعب ما يكون ترجمتها—لاحظ أن الأمر P يسمح بالتعديل الذاتي للرمز. ومع ذلك، فقد تم في وقت لاحق كتابة عددا من المترجمين. وهناك عدد من ملحقات المميزات للبرنامج الاصلي "Befunge - 93" موجودة أيضا، وعلى الأخص Funge - 98، الذي يمد المفهوم لعدد تعسفي من الأبعاد ويمكن أن يكون متعدد العمليات، مع تعليمات متعددة تجعل المؤشر يعمل بالتزامن على نفس المساحة. ملحقات Befunge والمتغيرات تسمى Fungeoids أو مجرد Funges.
مواصفات 93 Befunge يقيد كل برنامج صالح لشبكة من 80 تعليمة أفقياً و 25 تعليمة عموديا. تنفيذ البرنامج الذي يتجاوز هذه الحدود «يلتف» "wraps around" إلى نقطة المقابلة على الجانب الآخر من الشبكة، وبرنامج Befunge على هذا النحو ما يعادل طبوغرافيا topologically إلى الحيد. torus برنامج 93 Befunge يمكنه أن يكون له مكدس واحد فقط ومرتبطة بها مصفوفة تخزينها، ولغة 93 Befunge، على العكس من معظم اللغات الآلية، وليس تورنغ كاملة Turing-complete، (ومع ذلك، فقد تبين أن Befunge - 93 هو تورنغ كامل مع مكدس غير مرتبط بحجم الكلمة) في وقت لاحق أصبحت مواصفات Funge - 98 يوفر تورنغ كمال عن طريق إزالة القيود الحجم في البرنامج؛. بدلا من الالتفاف حولها في حد ثابت، وحركة مؤشرالتعليمات - 98 Funge يتبع نموذج يسمى "Lahey-space" «مسافة لاهي» أسوة بمؤلفها، كريس لاهي. في هذا النموذج، تتصرف الشبكة مثل حيد من حجم محدود فيما يتعلق بالالتفاف، في حين لا يزال يسمح لنفسه أن يتمتد إلى ما لا نهاية.

## التأليف (الترجمة)

وكما ذكرت، كان الهدف من تصميم Befunge هو عمل لغة من الصعب ترجمتها. وقد تم الشروع في هذا مع تنفيذ ترميز تعديل ذاتي (التعليمة 'p' يمكن أن تكتب تعليمات جديدة في الملعب)، وملعب متعددة الأبعاد (يمكن تنفيذ التعليمات ذاتها في أربعة اتجاهات مختلفة.)
ومع ذلك، فقد تم التغلب على هذه العقبات، إلى حد ما، ومترجمين Befunge كانت مكتوبة باستخدام التقنيات الملائمة.
مترجم bef2c اشتمل مع توزيع 93 Befunge المعياري - باستخدم رمز مترابط: يتم ترجمة كل تعليمة لمقتطف من رمز C، ويتحكم في التدفقات من خلال قصاصات تماما كما يفعل في مترجم Befunge، (المشروط على قيمة بعض تسجيل 'الاتجاهات') وهذا لا يؤدي إلى ميزة كبيرة من مترجم جيد. لاحظ أن المترجم bef2c غير صحيح لأنه لا يعالج أي من 'P' أو وضع السلسلة، ولكنه لن يكون مستحيل لجعله يفعل ذلك (على الرغم من أن لغة C قد لا تكون مناسبة تماما لهذا).
المترجم بيتي Betty compiler، على سبيل المثال، ويعامل كل خط مستقيم محتمل من تعليمات بوصفه برنامج فرعي، وإذا كانت تعليمة 'P' تنبه على عمل برنامج فرعي، فإن البرنامج الفرعي يعاد ترجمته. هذا اختلاف مثير للاهتمام بشأن الترجمة الفورية، وأنه يؤدي إلى ميزة أفضل بكثير من مترجم، حيث يمكن تنفيذ العديد من التعليمات بكود محلي دون التدخل في اتخاذ القرارات في تسجيل 'الاتجاه'. 'direction'
BFC (مترجم (BeFunge ل Win32 كتبه أندرو كارتر (اليورانيوم 239)، ويستخدم ببساطة كعب ذاتية التنفيذ وتعديل المصفوفة 8025 x بايت المخصصة مسبقا داخل الكعب لتنفيذ أي برنامج befunge معين. الآثار السلبية لهذه التقنية تشمل وجود مترجم مرفق لكل برنامج Befunge. ومع ذلك، باستخدام حيل التحسين، يضمن BFC V1.1 حجم قابل للتنفيذ من 5632 بايت فقط.

## نموذج رمز Befunge – 93

أسلوب استخدام الأسهم لتغيير التحكم في التدفق يتجلى في برنامج مولد العدد العشوائي أدناه. اتباع الأسهم حول، التعليمات؟ ترسل مؤشر في اتجاهات عشوائية رئيسية حتى يضرب المؤشر رقما، يدفعه إلى المكدس. ثم ينتقل السهم إلى إخراج الرقم من المكدس ويعود المؤشر إلى الاتجاه الأول. المولد بشكل عشوائى. علما أنه لا يوجد @ لإنهاء هذا البرنامج بحيث ينتج تيار لانهائي من الأرقام العشوائية من 1 حتي 9.
> >?> ?>5^
هذا هو المثال الكلاسيكي برنامج "Hello World!" أولاً يتم دفع الحروف "olleH" إلى المكدس كأرقام ASCII. وانتشرت بعد ذلك من هذا المكدس في نظام LIFO والإخراج كأحرف النص لإعطاء "Hello". المساحة هو الحرف رقم 32 في ASCII، التي تم بناءه هنا عن طريق ضرب 4 في 8، قبل أن يكونوا مخرجات في شكل نص. الرمز المتبقي ثم النواتج "World!" بطريقة مماثلة، يليها حرف ASCII 10 (حرف تغذية سطر line feed، ينقل مؤشرالإخراج إلى سطر جديد)
> v
>48*, v
>25*,@
هذا يضيف حرف ASCII 10 (حرف تغذية السطر) إلى مكدس، ويدفع ثم "!dlrow ,olleH" إلى المكدس (النص يكون في الناتج، وعكسي) ثم يدخل حلقة التي تكرر أولاً الحرف الأخير على المكدس (حيث الآن المكدس سوف يبدو "\n!dlrow ,olleH" وبعد ذلك عملية "_" سوف تصرف الحرف الأخير مرة أخرى، ويسير في الاتجاه الأيمن إذا كان صفر، والأيسر إذا كان خلاف ذلك، وعندما يذهب يساراً، فإنه يكرر الحرف الأول على المكدس ويطبع الحرف (الذي يصرفه مرة أخرى)، ثم تقوم بعمل حلقات ثم من خلال هذا حتى تواجد صفر على المكدس (بعد ذلك سوف يسير في الاتجاه الأيمن ويخرج من البرنامج). لكي يعمل هذا كما هو متوقع تحتاج إلى مترجم متوافق الذي يرجع "returns" 0 عند محاولة صرف أي مكدس فارغ.
>25*"!dlrow ,olleH":v

## قائمة تعليمات Befunge - 93

| 0-9 | أدفع هذا الرقم على المكدس |
| + | إضافة: اطلق a و b ثم أدفعa b+ |
| - | طرح: اطلق a و b ثم أدفعa b- |
| * | ضرب: اطلق a و b ثم أدفعb a* |
| / | قسمة عدد صحيح: اطلق a و b ثم أدفعa b/ ثم قربه نزولاً، لو a كانت صفر أسأل المستخدم أي نتيجة يريدها. |
| % | البقية: اطلق aو b ثم أدفع الباقي من قسمة العدد الصحيح من b/a، لو a كانت صفر أسأل المستخدم أي نتيجة يريدها. |
| ! | لا المنطقية: اطلق قيمة لو القيمة تساوي صفر أدفع 1 إذا خلاف ذلك أدفع صفر. |
| ` | أكبر من: اطلق a و bثم أدفع 1 إذا كانت b>a إذا خلاف ذلك يكون صفر. |
| > | ابدأ بالسير إلى اليمين |
| < | ابدأ بالسير إلى اليسار |
| ^ | أبدأ بالسير إلى الأعلى |
| v | أبدأ بالسير إلى الأسفل |
| ? | أبدأ بالسير إلى جهة أساسية عشوائية |
| _ | اطلق قيمة وسير يميناً إذا القيمة تساوي صفر، ويساراً إذا خلاف ذلك |
| | | اطلق قيمة وسير لأسفل إذا القيمة تساوي صفر، ولأعلى إذا خلاف ذلك |
| " | أبدأ أسلوب السلسلة: أدفع أي حرف قيمة ASCII على طول الطريق حتى “التالية" |
| : | كرر القيمة أعلى المكدس |
| \ | بادل قيمتين أعلى المكدس |
| $ | اطلق قيمة من المكدس |
| . | اطلق قيمة وأخرجها كرقم صحيح |
| , | اطلق قيمة وأخرجها كحرف ASCII |
| # | Trampoline : تخطى الخلية التالية |
| p | استدعاء "put" (طريقة لحفظ القيمة لاستخدام لاحق) اطلق Y وXو Vثم غيير الحرف في موضع (x,y)في البرنامج إلى الحرف مع قيمة ASCII V |
| g | استدعاء "get" (طريقة لاسترجاع البيانات المخزنة) اطلق YوX ثم أدفع قيمة ASCII من الحرف عند الوضع في البرنامج |
| & | أطلب رقم من المستخدم ثم أدفعه |
| ~ | أطلب حرف من المستخدم ثم أدفع قيمته ASCII |
| @ | أنهي البرنامج |
معظم لغات البرمجة واحدة الأبعاد تتطلب بعض التمييز النحوي بين نص التعليق وشفرة المصدر—على الرغم من أن هذا التمييز قد يكون تافه كقاعدة Brainfuck بأن أي حرف ليس في المجموعة +-<>. هو تعليق. الغات مثل Lisp و Python تعامل السلاسل كتعليقات في السياقات حين لا تستخدم القيم. وبالمثل، في Befunge، وليس هناك قواعد لغوية للتعليق: لتضمين التوثيق في الكود، فإن المبرمج ببساطة يحدد مسار تدفق التحكم حول منطقة «تعليق» "comment"، بحيث لا يتم أبدا تنفيذ النص في هذه المنطقة.

## انظر أيضا

* برين فاك
- Playstation programming game using a similar language
* وايت سبيس (لغة برمجة)
* لغات البرمجة غير الاعتيادية

## وصلات خارجية

* Cat's Eye Technologies, the original author's web site
* Esoteric languages wiki
* Official Funge-98 Specification نسخة محفوظة 25 ديسمبر 2004 على موقع واي باك مشين.
* ZBefunge, written in Inform
* Jeffrey Lee's Befunge archive
* BFC V1.1 Win32 compiler
* Yet Another Befunge93 Interpreter - An open source Befunge93 interpreter, written in Java
* Official home of the Rc/Funge-98 Interpreter
* BeQunge - An n-dimensional Funge-98 interpreter
* WASABI - A Superbly Asinine Befunge Interpreter An Open-Source Befunge93 IDE written in Java
* Conforming Concurrent Befunge-98 Interpreter Befunge-98 interpreter which conforms to the specifications and implements almost every fingerprint available
* Language::Befunge Befunge-98 بيرل module at سي بي اي إن
* Language::Befunge::Debugger Graphic Befunge debugger written in Perl
* Fungi - A standards compliant Funge-98 interpreter and debugger written in Haskell.
* Inline::Befunge Perl module at CPAN to insert Befunge code into Perl code
* Visual Befunge Applet Visual Befunge Applet written in Java
* CoreLife, a 2 dimensional grid based programming language which predates Befunge
* 1 2 الموقع الرسمي: http://catseye.tc/node/Befunge-93.html.
* ↑ Talk:Befunge - Esolang نسخة محفوظة 03 يناير 2018 على موقع واي باك مشين.
* بوابة برمجة الحاسوب
* بوابة تقانة المعلومات
* بوابة علم الحاسوب