مالبولج
مالبولج ( تُلفظ / mælˈboʊldʒ / ) هي لغة برمجة باطنية متاحة للجميع، ابتكرها بن أولمستيد عام ١٩٩٨، وسُميت تيمناً بالدائرة الثامنة من الجحيم في جحيم دانتي، مالبولج . صُممت خصيصاً لتكون شبه مستحيلة الاستخدام، من خلال عملية حسابية غير بديهية، ونظام حسابي ثلاثي، ورمز ذاتي التغيير. [ ٢ ] تستند مالبولج إلى صعوبة لغات البرمجة الباطنية السابقة (مثل برينفك وبيفونج ) ، لكنها تُبالغ في هذا الجانب إلى أقصى حد، مستغلةً التاريخ المتشابك لعلوم الحاسوب والتشفير . على الرغم من هذا التصميم، فإنه من الممكن كتابة برامج مالبولج مفيدة.
البرمجة بلغة مالبولج
كان فهم لغة مالبولج صعبًا للغاية عند ظهورها، واستغرق الأمر عامين قبل ظهور أول برنامج مكتوب بها. ولم يسبق للمؤلف نفسه أن كتب برنامجًا بلغة مالبولج. [ 2 ] لم يكتب البرنامج الأول إنسان، بل تم توليده بواسطة خوارزمية بحث شعاعي صممها أندرو كوك ونُفذت بلغة ليسب . [ 3 ]
لاحقًا، نشر لو شيفر تحليلًا تشفيريًا للغة مالبولج، وقدّم برنامجًا لنسخ مدخلاتها إلى مخرجاتها. [ 4 ] كما احتفظ بالمفسر الأصلي ومواصفاته بعد توقف الموقع الأصلي عن العمل، وقدّم استراتيجية عامة لكتابة البرامج بلغة مالبولج، بالإضافة إلى بعض الأفكار حول اكتمالها التورينجي . [ 5 ]
اعتقد أولمستيد أن لغة مالبولج عبارة عن آلة خطية محدودة . يدور نقاش حول إمكانية تنفيذ حلقات منطقية في مالبولج، وقد استغرق الأمر سنوات عديدة قبل تقديم أول حلقة غير منتهية. لم يُعلن عن برنامج "99 زجاجة بيرة" الصحيح ، الذي يتعامل مع الحلقات والشروط غير التافهة، لمدة سبع سنوات؛ وكان أول برنامج صحيح من ابتكار هيساشي إيزاوا في عام 2005. [ 6 ] كما اقترح هيساشي إيزاوا وآخرون دليلًا للبرمجة بلغة مالبولج لأغراض التمويه لحماية البرمجيات. [ 7 ]
في عام 2020، نشرت كاميلا شيفشيك مترجم لغة ليسب مكتوب بلغة مالبولج أنشيكلد. [ 8 ] [ 9 ]
برامج نموذجية
مرحبا بالعالم!
يعرض هذا البرنامج عبارة " مرحباً بالعالم! ". [ 10 ]
(=<`#9]~6ZY327Uv4-QsqpMn&+Ij"'E%e{Ab~w=_:]Kw%o44Uqp0/Q?xNvL:`H%c#DD2^WV>gY;dts76qKJImZkj catبرنامج
يقرأ هذا البرنامج سلسلة نصية من المستخدم ويطبع تلك السلسلة، على غرار أداة سطر الأوامر في نظام يونكس cat. [ 11 ]
(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/. ~P< <:(8& 66#"!~}|{zyxwvu gJ% تصميم
لغة مالبولج هي لغة الآلة لآلة افتراضية ثلاثية ، وهي مترجم لغة مالبولج .
لا يتطابق المفسر القياسي والمواصفات الرسمية تمامًا. [ 12 ] أحد الاختلافات هو أن المترجم يتوقف عن التنفيذ عند وجود بيانات خارج النطاق 33-126. على الرغم من أن هذا اعتُبر في البداية خطأً في المترجم، إلا أن بن أولمستيد صرّح بأنه كان مقصودًا، وأن هناك في الواقع "خطأً في المواصفات". [ 2 ]
السجلات
يحتوي Malbolge على ثلاثة سجلات ، a و c و d . عند بدء تشغيل البرنامج، تكون قيمة جميع السجلات الثلاثة صفرًا.
يرمز a إلى "المُجمِّع"، ويُضبط على القيمة التي تُكتب بواسطة جميع عمليات الكتابة على الذاكرة، ويُستخدم للإدخال والإخراج القياسيين . أما c ، وهو مؤشر التعليمات، فهو خاص: إذ يُشير إلى التعليمة الحالية . [ 13 ] أما d فهو مؤشر البيانات. ويتم زيادته تلقائيًا بعد كل تعليمة، ولكن الموقع الذي يُشير إليه يُستخدم لأوامر معالجة البيانات.
تدوين المؤشر
يمكن لـ d أن يحتوي على عنوان ذاكرة؛ [d] هو سجل غير مباشر ؛ القيمة المخزنة في ذلك العنوان. [c] مشابه.
ذاكرة
تحتوي الآلة الافتراضية على 59049 موقعًا في الذاكرة (3 ^10 ) ، يمكن لكل منها استيعاب عدد ثلاثي مكون من عشرة أرقام . لكل موقع عنوان من 0 إلى 59048، ويمكنه استيعاب قيمة من 0 إلى 59048. عند تجاوز هذا الحد، يعود الرقم إلى الصفر.
تستخدم اللغة نفس مساحة الذاكرة لكل من البيانات والتعليمات . وقد تأثر ذلك بكيفية عمل الأجهزة مثل بنية x86. [ 2 ]
قبل بدء تشغيل برنامج مالبولج، يتم ملء الجزء الأول من الذاكرة بالبرنامج. يتم تجاهل جميع المسافات البيضاء في البرنامج، ولزيادة صعوبة البرمجة، يجب أن يبدأ كل شيء آخر في البرنامج كأحد التعليمات أدناه.
يتم ملء باقي الذاكرة باستخدام العملية المعقدة (انظر أدناه) على العنوانين السابقين ( [m] = crz [m - 2], [m - 1] ). تتكرر الذاكرة المملوءة بهذه الطريقة كل اثني عشر عنوانًا (تتكرر الأرقام الثلاثية الفردية كل ثلاثة أو أربعة عناوين، لذا يُضمن تكرار مجموعة من الأرقام الثلاثية كل اثني عشر عنوانًا).
تجدر الإشارة إلى أن المواصفات الرسمية لا تغطي الحالة الحدية لبرامج التعليمات الواحدة، حيث إن محاولة ملء موضع الذاكرة الثاني باستخدام العملية غير المنطقية ، كما ذُكر سابقًا، ستؤدي إلى أن يشير [m - 2] إلى خارج منطقة ذاكرة البرنامج. كما أن التنفيذ المرجعي لا يأخذ هذه الحالة في الحسبان صراحةً، مما يؤدي إلى سلوك غير مُعرَّف . [ 14 ]
في عام ٢٠٠٧، ابتكر أورجان يوهانسن لغة مالبولج غير المقيدة (Malbolge Unshackled)، وهي نسخة من لغة مالبولج لا تخضع لحدود الذاكرة التعسفية. وكان الهدف هو ابتكار لغة كاملة تورينج مع الحفاظ قدر الإمكان على روح لغة مالبولج الأصلية. لم تُغيّر أي قواعد أخرى، وتبقى جميع برامج مالبولج التي لا تصل إلى حد الذاكرة تعمل بكفاءة تامة. [ ١٥ ]
تعليمات
تحتوي لغة مالبولج على ثماني تعليمات . تحدد مالبولج التعليمة التي يجب تنفيذها عن طريق أخذ القيمة [c] ، وإضافة قيمة c إليها، وأخذ باقي قسمة الناتج على 94. تخبر النتيجة النهائية المفسر بما يجب فعله:
| قيمة ([c] + c) % 94 | تمثل التعليمات | توضيح |
|---|---|---|
| 4 | jmp [d] | ينسخ القيمة الموجودة في [d] إلى c . لاحظ أن c ستظل تزيد بعد تنفيذ هذه التعليمة، لذا فإن التعليمة التالية التي سيتم تنفيذها ستكون تلك الموجودة في [d] + 1 (باقي القسمة على 59049) . |
| 5 | خارج | يطبع قيمة a ، كحرف ASCII ، على الشاشة. |
| 23 | في | يُدخل حرفًا، كرمز ASCII، في ملف . تُعتبر أسطر جديدة أو فواصل أسطر رمزًا رقم 10. أما حالة نهاية الملف فهي رمز رقم 59048 . |
| 39 | rotr [d] mov a, [d] | يُدير القيمة في [d] بمقدار رقم ثلاثي واحد إلى اليمين ( يصبح 000211111 2 هو 2 000211111). ويخزن النتيجة في كل من [d] وفي ملف a . |
| 40 | mov d, [d] | ينسخ القيمة الموجودة في [d] إلى d . |
| 62 | crz [d], a mov a, [d] | يقوم هذا البرنامج بالعملية المعقدة (انظر أدناه) مع القيمة الموجودة في [d] وقيمة a . ويخزن النتيجة في كل من [d] و a . |
| 68 | لا | لا يفعل شيئاً. |
| 81 | نهاية | إنهاء برنامج مالبولج. |
| أي قيمة أخرى | يؤدي نفس وظيفة الرقم 68 : لا شيء. هذه القيم الأخرى غير مسموح بها في البرنامج أثناء تحميله، ولكنها مسموح بها بعد ذلك. | |
بعد تنفيذ كل تعليمة، يتم تشفيرها (انظر أدناه) بحيث لا تُكرر نفس العملية في المرة القادمة، إلا إذا حدثت قفزة. مباشرةً بعد القفزة، يقوم مالبولج بتشفير التعليمة التي تسبق التعليمة التي قفز إليها. ثم، تزداد قيمتا c و d بمقدار واحد، ويتم تنفيذ التعليمة التالية.
عملية مجنونة
لكل رقم ثلاثي من كلا المدخلين، استخدم الجدول التالي للحصول على رقم ثلاثي من النتيجة. على سبيل المثال، crz 0001112220، 0120120120 تعطي 1120020211.
| crz | المدخل 1 | |||
|---|---|---|---|---|
| 0 | 1 | 2 | ||
| المدخل 2 | 0 | 1 | 0 | 0 |
| 1 | 1 | 0 | 2 | |
| 2 | 2 | 2 | 1 | |
التشفير
بعد تنفيذ التعليمات، سيتم استبدال القيمة الموجودة في [c] (بدون إضافة أي شيء إليها) بنفسها mod 94. ثم يتم تشفير النتيجة باستخدام إحدى الطريقتين المتكافئتين التاليتين .
- الطريقة الأولى
- ابحث عن النتيجة أدناه. خزّن رمز ASCII للحرف الموجود أسفلها في [c] .
0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 ---------------------------------------------------------------------------------------------- 9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb - الطريقة الثانية
- ابحث عن النتيجة أدناه. خزّن النسخة المشفرة في [c] .
| نتيجة | مشفر | نتيجة | مشفر | نتيجة | مشفر | نتيجة | مشفر | نتيجة | مشفر |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 57 | 19 | 108 | 38 | 113 | 57 | 91 | 76 | 79 |
| 1 | 109 | 20 | 125 | 39 | 116 | 58 | 37 | 77 | 65 |
| 2 | 60 | 21 | 82 | 40 | 121 | 59 | 92 | 78 | 49 |
| 3 | 46 | 22 | 69 | 41 | 102 | 60 | 51 | 79 | 67 |
| 4 | 84 | 23 | 111 | 42 | 114 | 61 | 100 | 80 | 66 |
| 5 | 86 | 24 | 107 | 43 | 36 | 62 | 76 | 81 | 54 |
| 6 | 97 | 25 | 78 | 44 | 40 | 63 | 43 | 82 | 118 |
| 7 | 99 | 26 | 58 | 45 | 119 | 64 | 81 | 83 | 94 |
| 8 | 96 | 27 | 35 | 46 | 101 | 65 | 59 | 84 | 61 |
| 9 | 117 | 28 | 63 | 47 | 52 | 66 | 62 | 85 | 73 |
| 10 | 89 | 29 | 71 | 48 | 123 | 67 | 85 | 86 | 95 |
| 11 | 42 | 30 | 34 | 49 | 87 | 68 | 33 | 87 | 48 |
| 12 | 77 | 31 | 105 | 50 | 80 | 69 | 112 | 88 | 47 |
| 13 | 75 | 32 | 64 | 51 | 41 | 70 | 74 | 89 | 56 |
| 14 | 39 | 33 | 53 | 52 | 72 | 71 | 83 | 90 | 124 |
| 15 | 88 | 34 | 122 | 53 | 45 | 72 | 55 | 91 | 106 |
| 16 | 126 | 35 | 93 | 54 | 90 | 73 | 50 | 92 | 115 |
| 17 | 120 | 36 | 38 | 55 | 110 | 74 | 70 | 93 | 98 |
| 18 | 68 | 37 | 103 | 56 | 44 | 75 | 104 |
يذكر تحليل لو شيفر لشفرة مالبولج ست دورات مختلفة في التبديل . وهي مدرجة هنا:
- 33 ⇒ 53 ⇒ 45 ⇒ 119 ⇒ 78 ⇒ 49 ⇒ 87 ⇒ 48 ⇒ 123 ⇒ 71 ⇒ 83 ⇒ 94 ⇒ 57 ⇒ 91 ⇒ 106 ⇒ 77 ⇒ 65 ⇒ 59 ⇒ 92 ⇒ 115 ⇒ 82 ⇒ 118 ⇒ 107 ⇒ 75 ⇒ 104 ⇒ 89 ⇒ 56 ⇒ 44 ⇒ 40 ⇒ 121 ⇒ 35 ⇒ 93 ⇒ 98 ⇒ 84 ⇒ 61 ⇒ 100 ⇒ 97 ⇒ 46 ⇒ 101 ⇒ 99 ⇒ 86 ⇒ 95 ⇒ 109 ⇒ 88 ⇒ 47 ⇒ 52 ⇒ 72 ⇒ 55 ⇒ 110 ⇒ 126 ⇒ 64 ⇒ 81 ⇒ 54 ⇒ 90 ⇒ 124 ⇒ 34 ⇒ 122 ⇒ 63 ⇒ 43 ⇒ 36 ⇒ 38 ⇒ 113 ⇒ 108 ⇒ 39 ⇒ 116 ⇒ 69 ⇒ 112 ⇒ 68 ⇒ 33 ...
- 37 ⇒ 103 ⇒ 117 ⇒ 111 ⇒ 120 ⇒ 58 ⇒ 37 ...
- 41 ⇒ 102 ⇒ 96 ⇒ 60 ⇒ 51 ⇒ 41 ...
- 42 ⇒ 114 ⇒ 125 ⇒ 105 ⇒ 42 ...
- 50 ⇒ 80 ⇒ 66 ⇒ 62 ⇒ 76 ⇒ 79 ⇒ 67 ⇒ 85 ⇒ 73 ⇒ 50 ...
- 70 ⇒ 74 ⇒ 70 ...
يمكن استخدام هذه الحلقات لإنشاء حلقات تكرارية تقوم بأشياء مختلفة في كل مرة، وتصبح في النهاية متكررة. استخدم لو شيفر هذه الفكرة لإنشاء برنامج مالبولج (مضمن في تحليله للشفرات المرفق أدناه) الذي يكرر أي شيء يُدخله المستخدم.
المتغيرات
لا تُعتبر لغة مالبولج كاملة تورينج ، نظرًا لمحدودية ذاكرتها. ومع ذلك، فهي تتميز بالتنفيذ التسلسلي والتكرار والتنفيذ الشرطي. وقد بُذلت عدة محاولات لإنشاء نسخ كاملة تورينج من مالبولج.
- Malbolge20 هي نسخة من لغة Malbolge بحجم كلمة موسع يبلغ 20 ثلاثية، مما يسمح بكتابة برنامج بحجم يصل إلى 3.4 جيجابايت تقريبًا. [ 16 ]
- مالبولج-تي هي نسخة نظرية من مالبولج تعيد ضبط تدفق الإدخال/الإخراج عند الوصول إلى النهاية، مما يسمح ببرامج غير محدودة. ستكون مالبولج-تي متوافقة مع الإصدارات السابقة من مالبولج. [ 4 ]
- لغة مالبولج غير المقيدة هي نسخة كاملة من لغة تورينج، تسمح بكتابة برامج بأي طول. مع ذلك، ونظرًا لاختلافات الأوامر التي تسمح بقيم أعلى من 257، فإن برامج مالبولج الصحيحة قد لا تعمل بشكل صحيح في لغة مالبولج غير المقيدة. [ 17 ]
انظر أيضاً
مراجع
- 1 2 "مالبولج - إيسولانج" . مؤرشف من الأصل في 27 أغسطس 2022. تم الاسترجاع في 27 أغسطس 2022 .
- 1 2 3 4 5 تيمكين، دانيال (3 نوفمبر 2014). "مقابلة مع بن أولمستيد" . esoteric.codes . مؤرشف من الأصل في 20 مارس 2023. تم الاطلاع عليه في 7 يناير 2021 .
- ↑ كوك، أندرو. "malbolge: hello world" . مؤرشف من الأصل في 6 ديسمبر 2019. تم الاسترجاع في 8 يناير 2021 .
- 1 2 شيفر، لو (17 أبريل 2015). "مقدمة إلى مالبولج" . مؤرشف من الأصل في 11 يونيو 2023. تم الاسترجاع في 9 يونيو 2017 .
- ↑ ميخائيلوفا، ماريا (11 مايو 2012). "مالبولج - لغة برمجة" . بروجوبيديا. مؤرشف من الأصل في 9 يونيو 2023. تم الاسترجاع في 9 يونيو 2017 .
- ↑ "لغة مالبولج" . 99 زجاجة بيرة. 29 ديسمبر 2005. مؤرشف من الأصل في 14 مايو 2020. تم الاطلاع عليه في 19 نوفمبر 2020 .
- 1 2 إيزاوا، هيساشي. "طريقة البرمجة في لغة مالبولج المُبهمة" (ملف PDF) (باللغة اليابانية). جامعة ناغويا . مؤرشف (ملف PDF) من الأصل في 23 يونيو 2017. تم الاطلاع عليه في 9 يونيو 2017 .
- ^ Szewczyk، Kamila (4 مارس 2021)، iczelia / malbolge-lisp ، تم استرجاعه في 23 مارس 2021
- ↑ لافلين، غريغوري (26 مارس 2022). "مالبولج (نظرة ثانية)" . أوكلو . تم الاسترجاع في 24 أكتوبر 2023 .
- ↑ شيفشيك، كاميلا (4 مارس 2021)، iczelia/hello.mb ، مؤرشف من الأصل في 5 أغسطس 2021 ، تم استرجاعه في 23 مارس 2021
- ↑ لوتر، ماتياس. "قط مالبولج" . lutter.cc . مؤرشف من الأصل في 28 أغسطس 2022. تم الاطلاع عليه في 28 أغسطس 2022 .
- ↑ غرين، أوستن (1 ديسمبر 2000). "مالبولج" . جامعة لويزيانا للتكنولوجيا . مؤرشف من الأصل في 9 يوليو 2017. تم الاسترجاع في 9 يونيو 2017 .
- ↑ أولمستيد، بن (1998). "مواصفات مالبولج" . lscheffer.com . مؤرشف من الأصل في 11 يونيو 2017. تم الاطلاع عليه في 9 يونيو 2017 .
- ↑ أولمستيد، بن (1998). "مترجم مرجع مالبولج" . lscheffer.com . مؤرشف من الأصل في 8 أغسطس 2024. تم الاطلاع عليه في 27 سبتمبر 2024 .
- ↑ يوهانسن، أورجان (25 أكتوبر 2013). "مترجم للغة مالبولج غير المقيدة" (هاسكل) . oerjan.nvg.org . تم الاطلاع عليه في 9 يونيو 2017 .
- ↑ "Malbolge20 - Esolang" . esolangs.org . مؤرشف من الأصل في 12 ديسمبر 2022. تم الاطلاع عليه في 12 ديسمبر 2022 .
- ↑ "Malbolge Unshackled" . esolangs.org . 26 سبتمبر 2024. تم الاطلاع عليه في 3 ديسمبر 2024 .
روابط خارجية
- لغات البرمجة الباطنية
- لغات البرمجة غير القائمة على اللغة الإنجليزية
- لغات البرمجة التي تم إنشاؤها عام 1998
