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

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.
vv  <     <
    2
    ^  v<
 v1<?>3v4
    ^   ^
> >?> ?>5^
    v   v
 v9<?>7v6
    v  v<
    8
. > > ^
^<
هذا هو المثال الكلاسيكي برنامج "Hello World!" أولاً يتم دفع الحروف "olleH" إلى المكدس كأرقام ASCII. وانتشرت بعد ذلك من هذا المكدس في نظام LIFO والإخراج كأحرف النص لإعطاء "Hello". المساحة هو الحرف رقم 32 في ASCII، التي تم بناءه هنا عن طريق ضرب 4 في 8، قبل أن يكونوا مخرجات في شكل نص. الرمز المتبقي ثم النواتج "World!" بطريقة مماثلة، يليها حرف ASCII 10 (حرف تغذية سطر line feed، ينقل مؤشرالإخراج إلى سطر جديد)
> v
v  ,,,,,"Hello"<
>48*, v
v,,,,,,"World!"<
>25*,@
هذا يضيف حرف ASCII 10 (حرف تغذية السطر) إلى مكدس، ويدفع ثم "!dlrow ,olleH" إلى المكدس (النص يكون في الناتج ،و عكسي) ثم يدخل حلقة التي تكرر أولاً الحرف الأخير على المكدس (حيث الآن المكدس سوف يبدو "\n!dlrow ,olleH" وبعد ذلك عملية "_" سوف تصرف الحرف الأخير مرة أخرى، ويسير في الاتجاه الأيمن إذا كان صفر، والأيسر إذا كان خلاف ذلك، وعندما يذهب يساراً، فإنه يكرر الحرف الأول على المكدس ويطبع الحرف (الذي يصرفه مرة أخرى)، ثم تقوم بعمل حلقات ثم من خلال هذا حتى تواجد صفر على المكدس (بعد ذلك سوف يسير في الاتجاه الأيمن ويخرج من البرنامج). لكي يعمل هذا كما هو متوقع تحتاج إلى مترجم متوافق الذي يرجع "returns" 0 عند محاولة صرف أي مكدس فارغ.
>25*"!dlrow ,olleH":v
                 v:,_@
                >  ^