ريبول
ريبول (بالإنجليزية: REBOL) هي لغة تبادل بيانات متعددة المنصات ولغة برمجة ديناميكية متعددة النماذج [5][6]، صممها كارل ساسينراث للاتصالات الشبكية والحوسبة الموزعة. ويطرح REBOL مفهوم اللغات الفرعية (اللهجات) dialect، وهي لغات عالية الكفاءة محدودة الاستخدام بحقول معينة domain-specific للأكواد والبيانات [6][7]، وهو ما يعد أبرز خواص اللغة وفقًا لمصممها.
وقد استخدم REBOL في برمجة عدد من تطبيقات الإنترنت (لأجهزة العميل والخادم) وتطبيقات قواعد البيانات والبرامج الخدمية وتطبيقات الوسائط المتعددة.[6][8][9]
التاريخ
خرج أول إصدار من لغة الـ REBOL للنور في عام 1997، وقد صممت على مدار عشرين عامًا بواسطة (كارل ساسينراث)، وهو المهندس والمطور الرئيسي لنظام أميغا أو إس، وذلك قيامًا على دراسته للسيمانطيقا الدلالية denotational semantics ومستخدما مفاهيم من لغات برمجة الـ Lisp و Forth و Logo و Self.
REBOL 2، المترجم، والذي أصبح قلب إصدارات المترجم الموسعة، صدر لأول مرة في 1999. REBOL/Comand، والذي أضاف تشفيرًا قوياً وأتاح الاتصالات بقواعد البيانات المفتوحة ODBC، صدر في سبتمبر 2000. REBOL/View وصدر في إبريل 2001، حيث أضاف إمكانيات رسومية على رأس اللغة الرئيسية. REBOL/IOS، وهو بيئة تعاونية ممتدة تم بناءها مع REBOL وصدرت في أغسطس 2001. REBOL/SDK، وقدّم خيار الأنوية kernels من أجل الربط، بالإضافة إلى معالج قبلي preprocessor، وصدر في ديسمبر 2002. REBOL 3، وهو الإصدار الأحدث من المترجم REBOL interpreter، وهو قيد التطوير حالياً، والنسخ المكتملة منه موجودة في السوق منذ يناير 2008.
اللغات الفرعية (اللهجات)
اللغات الفرعية للـ REBOL، والتي تشتهر حالياً بأنها محدودة بحقول معينة، هي لغات صُغرى micro-languages تم رفع كفاءتها لخدمة أغراض محددة. ويمكن استخدام الحقول لتحديد قواعد العمل وواجهات المستخدم الرسومية أو تتابع الشاشات أثناء تنصيب أي برنامج. وبوسع المستخدمين تحديد لهجاتهم الخاصة، بإعادة استخدام أي كلمة من كلمات REBOL القائمة وإعطاءها معنى معين في هذه اللهجة.[9] وتتم ترجمة اللهجات عن طريق الدوال التي تقوم بمعالجة الكتل البرمجية (أو سلاسل الإعراب) بشكل محدد. ويمكن أن نرى مثالاً على إمكانيات التفريع اللغوي (أي إنشاء اللهجات) لـ REBOL في كلمة return. ففي (لهجة تبادل البيانات)، يعد الـ return مجرد كلمة لا تحمل أي معنى محدد. أما في لهجة الـ do، نجد أن الـ return هنا متغير شامل global variable، يشير إلى دالّة محلية تقوم باستدعاء قيمة دالّية.[10] وفي لهجة الواجهة المرئية (VID)، نجد أن الـ return هنا تكون عبارة عن كلمة أساسية تدفع بمحرك التصميم لمحاكاة نتيجة تحميل carriage return، حيث تحرك «قلم الترجمة» إلى بداية الخط التالي.[7] ويجب على مترجم الـ REBOL الحامل للإمكانيات الرسومية أن يفهم ويترجم الكثير من اللهجات. ويوضح الجدول أدناه اللهجات الأكثر أهمية مرتبة حسب الأهمية:
اسم اللغة الفرعية (اللهجة) | الدالة التي تترجمها | الهدف |
---|---|---|
لهجة تبادل البيانات | تمثل البيانات والميتابيانات؛ وهي المنصة الشائعة للهجات للـ REBOL | |
لهجة do | الدالة do | البرمجة |
لهجة التعريب | parse الدالة | مطابقة الأنماط |
لهجة تحديد الدوال | make الدالة | تعريف الدوال؛ البرمجة الدالّية |
لهجة تحديد الكائنات الشيئية | make الدالة | تعريف/وراثة الكائنات؛ البرمجة القائمة على النمذجة programming prototype-based |
لهجة الواجهة المرئية (VID) أو ما يطلق عليه RebGUI | layout function أو display الدالة |
تحدد واجهة المستخدم الرسومية (GUI) |
لهجة الرسم | view الدالة | تحدد العناصر الرسومية (الخطوط، المضلّعات الخ) |
لهجة تحديد النصوص | do الدالة | تعريف النصوص |
لهجة سياسة الأمان | secure الدالة | تحديد سياسة الأمن |
بناء اللغة (السينتاكس)
تتسم لغة الـ REBOL بأنها من لغات البرمجة ذات الشكل الحر free-form، بمعنى أنها لا تحتاج لمواضع خاصة. ورغم ذلك، ينصح بمراعاة الإزاحة المتناسبة بين السطور (indentation) من أجل نقل أفضل لهيكل النص للقارئ البشري. وقد تتباين الخصائص البنائية للهجات المختلفة. والمنصة المشتركة لكافة لهجات الـ REBOL هي (لهجة لتبادل البيانات)؛ وهناك لهجات أخرى مشتقة منها. وبالإضافة لكونها المنصة المشتركة لكافة اللهجات، فإن (لهجة تبادل البيانات) تستخدم مباشرة لتمثيل البيانات والميتابيانات، وتجميع أبنية البيانات، وإرسال البيانات على الإنترنت، وحفظها في مجمع لتخزين البيانات. وعلى خلاف لغات البرمجة مثل سي C، نجد أن (لهجة تبادل البيانات) لا تتألف من إعلانات أو تعليمات أو صيغ أو كلمات مفتاحية. ويتخذ التيار النصي لـ (لهجة تبادل البيانات) شكل شجرة بيانات تتألف من كتل (والكتلة الجذرية تكون ضمنية implicit، فيما الكتل الفرعية يحدّ منها الأقواس المربعة "[]")، والسلاسل الحرفية strings (والتي تكون محدودة بعلامات الاقتباس المزدوجة "" أو بالأقواس المجعدة {} مناسبة للسلاسل متعددة الأسطر؛ مع استخدام علامات الإقحام مع الأحرف غير القابلة للطباعة) وعنوان الإنترنت URLs أو عناوين البريد الإلكتروني e-mail أو الملفات أو المسارات أو غيرها من القيم المُركّبة composite values. وعلى خلاف الكتل البرمجية للـ ALGOL، نجد أن كتل الـ REBOL هي قيم مركّبة مشابهة للصيغ الرمزية s-expressions في لغة الـ Lisp. وتحتوى الكتل البرمجية blocks بالإضافة إلى الأقواس على قيم مُركّبة أخرى (وقد تحتوي الكتلة البرمجية على كتل فرعية وأقواس وسلاسل حرفية...) أو قيم قياسية scalar مثل الكلمات أو الـ set-words (وهي الكلمات التي تلحقها في النهاية نقطتي الترقيم ":") أو الـ get-words (وهي الكلمات التي تسبقها نقطتي الترقيم) أو الـ lit-words (وهي الكلمات التي تسبقها الفاصلة العُليا) أو الأرقام أو النقود أو الحروف الخ، وتفصل بينها مساحات فارغة. ولاحظ أن الحروف الخاصة مسموح بها في الكلمات، ولذلك نجد أن a+b تمثل كلمة، فيما a + b ليست كذلك، لأنها تمثل تتابعًا لثلاث كلمات تفصل فيما بينها مساحات فارغة. وقد تظهر التعليقات comments بعد علامة الفاصلة المنقوطة ";" حتى نهاية السطر. ويمكن كتابة التعليقات متعددة الأسطر أو التعليقات التي لا يتجاهلها المعرّب المُعجمي lexical parser باستخدام أنواع البيانات «العاديّة» مثل السلاسل الحرفية متعددة الأسطر.[10]
المعاني
يمكن تقديم الكتل المحتوية على اللغة المحددة بحقل معين كوسائط arguments إلى دوال تقييم evaluator معينة.
Do
يعد المقيم الأكثر شيوعاً في الاستخدام هو الدالة do. وهي تُستخدم بشكل افتراضي في ترجمة النص الذي يدخل نافذة المترجم. واللهجة do والتي تترجمها الدّآلة do هي لهجة تعبيرية التوجه expression-oriented للغة تبادل البيانات. والوحدة السيمانطيقية الرئيسية للغة هي التعبير expression. وعلى خلاف لغات البرمجة الإجرائية المنحدرة من الـ ALGOL، نجد أن اللغة الفرعية do تخلو من الكلمات المفتاحية والتعليمات البرمجية. وتُستخدم الكلمات كمتغيرات غير حساسة لحالة الأحرف case insensitive. فعلى غرار اللغات الديناميكية، ليس للمتغيرات نوع مرتبط بها، والنوع يرتبط بقيم. والنتيجة هي أن تقييم الكلمة يرجع عندما تقابل الكلمة دالة do. ويمكن استخدام الكلمات الملحقة بنقطتي الترقيم set-words لأي كلمة من أجل عملية التعيين. ورغم غياب التعليمات البرمجية، إلا أن التعيينات، وإلى جانب الدوال ذات الآثار الجانبية، يمكن استخدامها في البرمجة الإجرائية.[10] وتقوم الكتل البرمجية بعملية التقييم لنفسها. وتُستخدم هذه الخاصية في معالجة كتل البيانات، وذلك في البرمجة الهيكلية، من خلال رفع هذه الكتل كوسائط للتحكم في دوال على غرار if و either و loop الخ ومن أجل صياغة اللهجات، عندما يتم تمرير إحدى الكتل البرمجية إلى دالة ترجمة معيّنة. ومن المشكلات الخاصة الجديرة بالملاحظة أن القيم المركّبة، والمرتبطة بالمتغيرات، لا تُنسخ. ولعمل نسخة منها، ينبغي تمرير القيمة إلى دالة copy.[10] وتتبع دالة الـ do أسلوبًا البوادئ في التقييم prefix style of evaluation، حيث تقوم الدالّة بمعالجة الوسائط التي تتبعها. ورغم ذلك فهناك أيضًا التقييم القائم على الزيادة الحرفية في الوسط (أو التوسيط) infix evaluation وباستخدام مؤثرات التوسيط infix operators. وللتقييم التوسيطي الأسبقية على التقييم بالبوادئ. فمثلاً abs -2 + 3 تقوم باستدعاء القيمة 1، نظرًا لأن عملية إضافة التوسيط لها الأسبقية على حساب القيمة المطلقة. وعند تقييم صيغ التوسيط، فإن ترتيب التقييم يكون من اليسار إلى اليمين، ولا يأخذ أي مؤثر operator الأسبقية على مؤثر آخر. فمثلاً
2 + 3 * 4
تقوم بإرجاع القيمة 20، في حين أن التقييم الذي يعطي الأسبقية للضرب (أي المضاعفة) سوف يستدعي النتيجة 14. وكافة المؤثرات لها نسخ تقوم على البوادئ. وتقوم الدالة do عادة بتقييم الوسائط قبل تمريرها إلى أي دالة. وعليه، فإن الصيغة التالية مثلاً:
print read http://en.wikipedia.org/wiki/REBOL
تقوم في البداية بقراءة http://en.wikipedia.org/wiki/REBOL
ثم تقوم بتمرير النتيجة بعد ذلك إلى الدالّة print. ويمكن استخدام الأقواس لتغيير ترتيب التقييم. وباستخدام التنويت بالبوادئ prefix notation، يمكن تلافي استخدام الأقواس في الصيغ.
وتوفّر قواعد الأسبقية البسيطة عددًا من المزايا منها:
- لا توجد حاجة «لاستشارة» جداول الأسبقية عند تحرير الصيغ
- لا توجد حاجة لإعادة تحرير الجداول عند تعريف مؤثرات جديدة.
- يمكن بسهولة إجراء الترجمة الصوتية من التنويت notation من الحروف الوسطية إلى البوادئ والعكس.
وهناك مساوئ منها:[6]
- اعتياد المستخدمين على قواعد الأسبقية الأقدم يؤدي لسهولة ارتكابهم الأخطاء.
Parse
دالة parse من الدوال المفضلة لتحليل وترجمة اللهجات حيث تقوم بمطابقة صيغ الإعراب parse expressions في زمن التشغيل. وتُكتب صيغ الإعراب parse expressions في لهجة الإعراب parse dialect، والتي تعتبر – وعلى غِرار اللغة do – لهجة موجهة بالصيغ. ومن خلال خلال لهجة الـ do، تستعين لغة الإعراب parse بكلمات مفتاحية تمثل المؤثرات والرموز اللانهائية nonterminals الأكثر أهمية، ولا تحتوي المؤثرات وسطية الإعراب على ما يكافئها من البوادئ prefixes وتستخدم قواعد الأسبقية (حيث نجد أن لـ sequence أسبقية أعلى من choice). ويمكن تضمين الإجراءات للأخذ بها أثناء عملية الإعراب أيضاً، كما يمكن استخدام دالة الـ parse لمعالجة الكتل البرمجية أو السلاسل الحرفية. وعند مستوى إعراب السلاسل الحرفية string parsing، ينبغي على الدالة إجراء عملية الإعراب «منخفضة المستوى»، بالأخذ في الاعتبار الحروف والحدود الفاصلة delimiters. وينتمي إعراب الكتل البرمجية block parsing للمستوى الأعلى، حيث يتضمن عملية المسح على مستوى قيم الـ REBOL. وتنتمي لهجة الإعراب لعائلة القواعد البرمجية والتي تمثلها لغة الإعراب التنازلية top-down parsing أو قواعد صيغ الإعراب parsing expression grammar. ويتمثل التشابه الرئيسي في وجود مؤثرات الـ sequence و choice الموجودة لدى كل أفراد عائلة القواعد. ويتضح بناء وتركيب لغة الإعراب والتشابه بين لهجة الإعراب والـ PEG من خلال هذه الترجمة الصوتية لأحد الأمثلة على الـ PEG والتي تقوم بإعراب إحدى الصيغ الحسابية:
Digit: charset [#"0" - #"9"] Value: [some Digit | "(" Expr ")"] Product: [Value any [["*" | "/"] Value]] Sum: [Product any [["+" | "-"] Product]] Expr: Sum parse/all "12+13" Expr
مثال
يمكن مثلاً عرض نافذة برنامج أهلا بالعالم التجريبية الشهيرة من خلال كتابة السطر البرمجي التالي:
view/title layout [h1 250x120 center middle "Hello world !"] "Hello world !"
وتُكتب محتويات وسيط الكتلة البرمجية لدالة layout في لغة الواجهة المرئية visual interface dialect.
التطبيقات
يعد التطبيق الرئيسي للغة الـ REBOL هو المترجم المتوافر في عدة نسخ وهي (/Core و /View و /Command و /SDK و /IOS). وبعض أجزاء هذا المترجم تتسم بكونها مفتوحة المصدر open source. فمثلاً، يعتبر سطح مكتب REBOL جزءًا مفتوح المصدر من مترجم الـ REBOL/View الذي يربط مجتمع REBOL على الإنترنت. وقد تمت إتاحة كل من REBOL/Core و REBOL/View لإنتاج تطبيقات قابلة للتوزيع التجاري بدون مقابل. ويتم تخزين بيئة زمن التشغيل حاليًا في ملف تنفيذي واحد. ويصل حجم REBOL/Core، وهو نسخة نافذة التحكم، إلى 300 كيلوبايت، أما حجم REBOL/View، وهي نسخة واجهة المستخدم الرسومية، فيصل إلى 650 كيلوبايت. وتقوم النسخة REBOL/View بتوفير إمكانيات دخول صوتية ورسومية مستقلة عن المنصّة، وتأتي مع أدواتها الخاصة للنوافذ ومجموعتها الممتدة من الأنماط (عناصر التحكم الرسومية GUI widgets). أما النسخ الموسّعة، على غرار REBOL/Command أو REBOL/SDK فتستلزم ترخيصًا له ثمن معين؛ حيث تتضمن خصائص مثل الاتصال المفتوح مع قواعد البيانات ODBC، وخيار إنشاء ملفات تنفيذية مستقلة بذاتها.
وتتوافر مجموعة من البرامج المجانية البديلة لهذا البرنامج، وهي:
- The RebGUI, an alternative to VID
- The Orca interpreter
- The Boron Scripting Language
- Red
مراجع
- وصلة مرجع: https://api.github.com/repos/rebol/r3. الوصول: 6 مارس 2019.
- وصلة مرجع: https://api.github.com/repos/rebol/rebol. الوصول: 19 أكتوبر 2018.
- وصلة مرجع: https://api.github.com/repos/rebol/r3. الوصول: 30 يوليو 2018.
- مذكور في: بورتاج.
- Sassenrath, Carl (2000). Inside the REBOL scripting language. Dr. Dobb's Journal, 6/2000. نسخة محفوظة 27 أبريل 2009 على موقع واي باك مشين.
- Roberts, Ralph (2000). REBOL for Dummies. Hungry Minds. ISBN 0-7645-0745-1.
- Auverlot, Olivier (2001). Rebol Programmation. Eyrolles. ISBN 2-212-11017-0.
- Auverlot, Olivier (2007). Rebol - Guide du programmeur.
- In English: Auverlot, Olivier, Wood, Peter W.A. (2008). Rebol - A programmer's guide. Lulu.com
- Goldman, E., Blanton, J. (2000). REBOL: The Official Guide. McGraw-Hill Osborne Media. ISBN 0-07-212279-X.
وصلات خارجية
- ريبول على موقع Open Hub (الإنجليزية)
- الموقع الرسمي
- A REBOL tutorial
- Developer network
- REBOL Script Library
- REBOL one-line programs
- REBOL programs cookbook
- RIX - a search engine for REBOL web pages, registering only sites containing the word «rebol»
- بوابة برمجة الحاسوب