المعلوماتية > برمجيات

لغات البرمجة الباطنية، عندما تجتمع البرمجة بالفن والدعابة!

لا بدّ أنك سمعتَ عن بعض لغات البرمجة التقليدية الشائعة التي يستخدمها المطوّرون عادة كلغة جافا، لكن هناك مجموعة كبيرة من لغات أخرى تُعرف بـ«اللغات الباطنية»، أي أنها مفهومة من قبل فئة صغيرة من الناس.

تختلف هذه اللغات عن اللغات التقليدية السابقة، فهي لغاتٌ غير مصممة لتقديم حلول فعالة للمشكلات الحاسوبية، وإنما لتجربة أفكار غريبة أو لإثبات مفهوم ما أو يمكن استخدامها كنكتة للتسلية. كما أن هذه اللغات تُعتبر ذات شعبية بين القراصنة والهواة.

هناك الكثير من هذه اللغات، اخترنا لكم باقة منها:

1. Chicken:

لغة برمجة مكونة من كلمة واحدة فقط وهي "Chicken". قام بتطويرها المبرمج السويدي "Torbjörn Söderstedt" بعد سماعه لمحاكاة ساخرة عن الخطابات العلمية أجراها "Doug Zongker"، وهو مهندس في شركة «غوغل»، في عام 2007 في مؤتمر الجمعية الأمريكية لتقدم العلوم AAAS، والذي لم يفهم أحد منه شيئاً حينها!

يتألف البرنامج المكتوب بهذه اللغة من كلمة "chicken" و"\n" (سطر جديد). ويحتوي كل سطر على عدد من الـchickens المفصولة فيما بينها بفراغات. عدد الـchickens في كل سطر يقابل شيفرة ما، وبالتالي إذا كان لدينا عدة أسطر، فلدينا بالنتيجة عدة تعليمات (شيفرات) تُحمل إلى ذاكرة البرنامج المُعبر عنها بمكدس ويتم تنفيذها باستخدام تعلمية القفز.

يوضح المثال أدناه برنامجاً لطباعة كلمة "Chicken" على الشاشة:

اضغط هنا لمشاهدة العرض التقديمي، أو هنا لقراءة الورقة العلمية التي اُستلهِمت منها هذه اللغة.

اضغط هنا للدخول إلى الصفحة الشخصية لمُطوّر هذه اللغة حيث يُمكنك اختبارها.

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken

chicken chicken chicken chicken chicken chicken

2. Brainf*ck:

بالنظر إلى اسم هذه اللغة، فهي تُشير إلى أشياء معقدة أو غير اعتيادية تتجاوز حدود الفهم، ويُمكن أن تتسببَ بصداع لأي مبرمج!

تم تطوير هذه اللغة من قِبل طالب الفيزياء السويسري "Urban Müller" في عام 1993 كلغة يُمكن أن تُـنفذ بأصغر مترجم، فقد كان حجم النسخة الأولى منه 296 بايت، أما النسخة الثانية فكانت بحجم 240 بايت. وقد صدرت عدة نُسخ لاحقاً وصل حجم المترجم في إحداها إلى 100 بايت فقط.

تستخدم هذه اللغة ثمانية أوامر فقط ومؤشر تعليمة، كل منها عبارة عن محرف واحد فقط، مما يجعل حدود هذه اللغة ضيقة جداً وغير عملية. هذه الأوامر هي ">" لتحريك المؤشر خطوة واحدة إلى اليمين، و"<" لتحريك المؤشر خطوة واحدة إلى اليسار، و"+" لزيادة محتوى الخلية بمقدار واحد، و"-" لإنقاص محتوى الخلية بمقدار واحد، و"." لطباعة البايت الذي يُؤشر عليه المؤشر، و"،" لقراءة بايت من الدخل وتخزينه في الخلية التي يُؤشرعليها المؤشر، و"[" كبداية حلقة تكرارية شرط توقفها هو أن يكون محتوى الخلية المؤشر عليها صفراً، و"]" نهاية حلقة تكرارية.

وكمثال بسيط، يُوضح السطر التالي برنامجاً مكتوباً بلغة Brainf*ck لجمع محتوى خلية إلى أخرى مجاروة لها:

[->+<]

تتم عملية الجمع بإجراء حلقة تكرارية يتم فيها في كل دورة إنقاص محتوى الخلية اليسرى بمقدار واحد وزيادة محتوى الخلية اليمنى بمقدار واحد حتى يساوي محتوى الخلية اليسرى الصفر.

وكمثال آخر فيما يلي برنامج طباعة جملة "Hello World":

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

<<+++++++++++++++.>.+++.------.--------.>+.>.

3. شكسبير Shakespeare:

في وقت متأخر من إحدى ليالي شهر شباط، كان "Jon Aslund" و"Karl Hesselstörm" يعملان على حلِّ وظيفة برمجية من عدة أسئلة لعرضها في التاسعة من صباح اليوم التالي. عندما وصلا إلى السؤال الرابع المتعلق بمادة التحليل النحوي للغات البرمجة، شعرَا بالتعب منه، فتركاه جانباً وانتقلا إلى السؤال الأخير الذي كان ممتعاً على عكس ما سبقه من أسئلة، وذلك لأنه سُمح للطلاب بفعل أي شيء يحلو لهم في هذا السؤال طالما ينطوي على تحليل نحوي وتحليل للمفردات. بدلاً من إنهاء السؤال الرابع، بدأ "Jon Aslund" و"Karl Hesselstörm" بطرح بعض الأفكار العظيمة، فكانت لغة شكسبير!

كان الهدف تصميم لغة تظهر بشكل مختلف تماماً عن باقي اللغات، فكل برنامج مكتوب بلغة شكسبير هو عبارة عن مسرحية.

يبدأ أي برنامج بلغة شكسبير بالتعريف بقائمة الشخصيات كـ«روميو» و«جولييت». تُصرح هذه الشخصيات عن عدد المكدسات اللازمة لتنفيذ البرنامج (تخيل كل شخصية على أنها صندوق مفتوح من الأعلى). تدخل هذه الشخصيات إلى الحوار مع بعضها البعض، ومن خلال حديثها تقوم بعمليات الدخل والخرج وكتابة أو التقاط آخر قيمة تظهر على المكدسات. كما يمكن لهذه الشخصيات أن تسأل بعضها البعض أسئلة تلعب دور العبارات الشرطية. بشكل عام يشبه نموذج البرمجة المستخدم هنا نموذج لغة التجميع (Assembly).

يوضح المثال أدناه عبارة شرطية مع تعليمة قفز:

Juliet:

Am I better than you?

Hamlet:

If so، let us proceed to scene III.

اضغط هنا لمشاهدة برنامجاً (مسرحية) مكتوباً بلغة شكسبير.

4. اضحك بصوت مرتفع Lolcode:

تم تطوير هذه اللغة في عام 2007 من قِبل "Adam Lindsay" الباحث في جامعة Lancaster البريطانية، إذ استلهم هذه اللغة من lolspeak، والتي هي عبارة عن صور صغيرة لقطط تصرخ مع وجود نص مكتوب على الصورة، وغالباً ما يكون النص غريباً أو مليئاً بالأخطاء القواعدية.

يبدأ أي برنامج Lolcode بعبارة الترحيب (!Hi)، وينتهي بعبارة الشكر (Ok Thanks Bye). تُعدُّ Lolcodeلغةً مرحة ذات جاذبية أكثر من كونها لغة عملية.

يُوضح المثال التالي طباعة جملة "Hello World":

HAI

CAN HAS STDIO?

VISIBLE "Hello World!"

KTHXBYE

وقد استُلهمت لاحقاً لغة LOLPython من هذه اللغة من قبل "Andrew Dalke"، حيث استخدمت تراكيب مشابهة لـLolcode ، ويتم تنفيذها عن طريق تحويل رمازها المصدري إلى لغة Python.

5. أرنولد ArnoldC:

من منكم لا يعرف الممثل الأمريكي «أرنولد شوارزنيجر» وأفلامه المشهورة كفيلمَي "Terminator" و"Total Recall"!

كان "Lauri Hartikka" من محبي هذا الممثل، لدرجة أنه استلهم أقواله في أفلامه وأنشأ لغةً حملت اسمه. فعلى سبيل المثال للتعبير عن "False" و"True"، استخدم هاتين الجملتين على التوالي " I LIED"، و"NO PROBLEMO". فيما يلي مثال يُوضح طباعة عبارة "Hello World".

IT'S SHOWTIME

TALK TO THE HAND "Hello World!"

YOU HAVE BEEN TERMINATED

6. المسافة البيضاء Whitespace:

تم تطوير هذه اللغة في عام 2002 من قبل "Edwin Brady" و"Chris Morris" كنكتة بمناسبة كذبة نيسان. في حين أن معظم لغات البرمجة تتجاهل محارف المسافة البيضاء (spaces، tabs، newlines)، تستخدمها لغة Whitespace كأوامر، متجاهلةً أي محارف أخرى، وبهذه الميزة يُمكن لهذه اللغة أن تُكتب داخل لغات البرمجة التقليدية التي تتجاهل هذه المحارف.

تتكون الأوامر هنا من تسلسل من (spaces، tabs، newlines)، فعلى سبيل المثال، التسلسل التالي tab-space-space-space ينفذ عملية الجمع على أعلى عنصرين في المكدس.

فيما يلي، مثال يُوضح طباعة عبارة "Hello World": اللون الأحمر (space)، اللون الأزرق (tab).

تفيدُ هذه اللغة بشكل خاص في حالات التجسس. تخيل أن لديك برنامجاً سرياً لا تريد لأحد أن يشاهده، ماذا ستفعل عندها؟ ببساطة، احذف الملف من حاسوبك بعد أن تطبعه ورقياً، واستعد في وقت لاحق لكتابته عندما ترغب في ذلك، فلا أحد سيعرف أن المسافات البيضاء الموجودة في ورقتك هذه تخفي بالفعل رمازاً حاسوبياً فعالاً!

7. HQ9+:

طُورت هذه اللغة من قِبل "Cliff L. Biffle" ، ولها القدرة على القيام بأربع وظائف فقط والتي أعطت هذه اللغة اسمها:

H لطباعة جملة "Hello World" الشهيرة.

Q لطباعة الملف المصدري للبرنامج.

9 لطباعة كلمات أغنية "99 Bottles of Beer on the Wall".

+ لزيادة قيمة واحدة إلى المكدس في الذاكرة. الجدير بالذكر أن قيمة المكدس لا يمكن الوصول إليها بأي حال من الأحوال.

لاحقا قام "David Morgan-Mar" بكتابة لغة HQ9++ كلغة كائنية التوجه مبنية على HQ9+ الأصلية. وهي تعدُّ لغةً كائنية نقية (كل ما فيها مكون من كائنات، ولا وجود لبنى متغيرات «غير نقية» تخزن في الذاكرة مباشرة). تحتوي هذه اللغة على أمر إضافي وهو ++، الذي يقوم بزيادة قيمة المكدس مرتين ويقوم بإنشاء كائن جديد. كما الأمر مع المكدس، لا يمكن الوصول إلى هذا الكائن.

8. Velato:

تم تطوير هذه اللغة في عام 2009 من قِبل "Daniel Temkin". تَستخدم هذه اللغة الملفاتِ الصوتية (MIDI file) كشفرة مصدر، إذ يتم تحديد الأوامر من خلال النغمات وترتيب العلامات الموسيقية. تسمح Velato بالمرونة في التأليف (فالرماز المصدري ماهو إلا نوطة موسيقية)، فالبرامج الوظيفية المكتوبة بهذه اللغة لا تبدو كنوطات عشوائية، وإنما يغلب عليها تجانس كبير وتبدو كموسيقا الجاز.

فيما يلي مثال يُوضح طباعة عبارة "Hello World!"، يُمكنك الضغط هنا لسماع هذا البرنامج.

9. Chef:

بشكل مشابه للغة شكسبير، تم تطوير هذه اللغة في عام 2002 من قبل "David Morgan-Mar"، حيث أن البرامج المكتوبة بهذه اللغة لا تشبه شيئاً سوى وصفات الطبخ. ولهذه اللغة مبادئ تصميم أساسية:

● لا ينبغي للرماز المصدري أن يُولد خرجاً صحيحاً فقط، وإنما يجب أن يكون الخرج لذيذاً وسهلَ التحضير.

● ينبغي على الوصفات أن تراعي الميزانيات المالية المختلفة.

● على الوصفة أن تكون مترية.

بكلمات أخرى، على الوصفة أن تعمل كرماز مصدري وأن تُحضر وتُؤكل.

فيما يلي وصفة تُوضح طباعة عبارة "Hello World Souffle"، وإذا قمتَ بطبخها، فسوف تحصل على كعكة الشوكولا!

Hello World Souffle.

This recipe prints the immortal words "Hello world!"،

in a basically brute force way.

It also makes a lot of food for one person.

Ingredients.

72 g haricot beans

101 eggs

108 g lard

111 cups oil

32 zucchinis

119 ml water

114 g red salmon

100 g dijon mustard

33 potatoes

Method.

Put potatoes into the mixing bowl.

Put dijon mustard into the mixing bowl.

Put lard into the mixing bowl.

Put red salmon into the mixing bowl.

Put oil into the mixing bowl. Put water into the mixing bowl.

Put zucchinis into the mixing bowl. Put oil into the mixing bowl.

Put lard into the mixing bowl. Put lard into the mixing bowl.

Put eggs into the mixing bowl. Put haricot beans into the mixing bowl.

Liquefy contents of the mixing bowl.

Pour contents of the mixing bowl into the baking dish.

Serves 1.

10. Piet:

هذه اللوحة الرائعة هي البرنامج الذي يطبع "Hello World" بلغة Piet!

صُممت هذه اللغة من قِبل "David Morgan-Mar"، و تتميز بأن البرامج المكتوبة بها هي عبارة عن صور تشابه إلى حد كبير الفن التجريدي. وتتمُّ عملية ترجمة البرنامج عن طريق مؤشر يتحرك ضمن الصورة من منطقة ملونة إلى منطقة ملونة أخرى.

يوجد 20 لوناً محجوزاً في لغة Piet يرتبط بسلوكيات معينة، ويرتب 18 منها حسب اللون (أحمر وأصفر وأخضر وسماوي وأزرق وأرجواني) والسطوع (فاتح وعادي وقاتم). بالإضافة إلى الأبيض و الأسود (لا يمتلكان أي ترتيب).

عند الخروج من منطقة ملونة إلى منطقة ملونة أخرى، يتم تنفيذ إجراء بحسبِ فرق اللون والسطوع بين المنطقتين، ولا يمكن الدخول إلى منطقة سوداء.

في حال كانت المنطقة التالية سوداء، فإن البرنامج سيختار منطقة أخرى، وإذا لم يكن هناك منطقة متاحة بلون آخر فسينتهي البرنامج. أما النقاط البيضاء فهي مجرد نقاط عبور تسمح للمؤشر بالحركة من خلالها ولا تمتلك أي وظيفة. بينما تكون سلوكيات الألوان الأخرى غير محددة، فهي متروكة للمترجم والمفسر (Compiler and Interpreter)، إذ يمكن تجاهلها مثل اللون الأبيض أو معاملتها كما تتم معاملة اللون الأسود.

بقي أن نقول أن هذه اللغة سميت بهذا الاسم نسبة إلى الرسام الهولندي "Piet Mondrian". لمعرفة السبب، يمكن مقارنة البرنامج الذي يطبع كلمة "Piet" (الصورة الأولى)، مع لوحة "Composition with Red،Yellow and Blue" للفنان Piet (الصورة الثانية).