لغة REXX ، الذكرى الأربعون

REXX هي لغة قديمة إلى حد ما ، متقدمة في وقتها. لقد ظهر ، حسب ويكيبيديا ، في عام 1979 ، أي أنه بلغ من العمر 40 عامًا مؤخرًا. ليست أكثر اللغات القديمة ، بالطبع ، ولكن سن مناسب.

Rexx عبارة عن اختصار ، وهذا يعني إعادة التنفيذ الموسَّع للتنفيذ ، والذي ربما يشير بنا إلى أسلافها EXEC / EXEC2. التقيت به في نظام التشغيل VM / SP 3 ، حيث جاء ليحل محل لغات البرمجة النصية هذه بدقة. ثم كان شائعًا في OS / 2 ، المستخدم في العديد من أنظمة التشغيل الأخرى ، وتم إنشاء العديد من التطبيقات واللهجات المشتقة.

صورة

لم يهتم كثيرا بحبريه ، سأحاول سد الثغرات في هذا المقال.

الأجداد ، الأصول ، المؤلفون


كان تنفيذ اللغة الأصلية مؤلفًا واحدًا ، وهو موظف في IBM Mike Cowlishaw. تمت كتابة هذا التطبيق في مجمّع S / 360.

تعتقد ويكيبيديا أن REXX تأثرت بـ PL / 1 و EXEC و EXEC2 و Algol. على العموم ، نعم ، هذه اللغة هي بلا شك في بناء الجملة - وريث Algol (أو Pascal ، إذا صح التعبير). وهذا هو ، حلقات ، كتل ، الخ المنشآت ليست محاطة بأقواس ، ولكن بالكلمات الرئيسية ، القيام / الإنهاء ، على سبيل المثال. بالنسبة إلى EXEC و EXEC2 ، تم إنشاء REXX كبديل لهما ، وربما لا علاقة لهما بهما. لكن مقارنة بـ PL / 1 REXX أبسط بكثير ، والغرض من اللغة مختلف تمامًا.

كيف يبدو رمز REXX:

/*    1  10 */ sum = 0 do count = 1 to 10 say count sum = sum + count end say "    " sum"." 

ملامح


ما ، في رأيي ، ما هو الأكثر إثارة للاهتمام أو غير عادية في هذه اللغة؟

1. بناء جملة اللغة مجاني تمامًا ، إنه ليس فورتران ، بالطبع. الغول وباسكال تبدو أكثر من غيرها. بشكل أساسي بشكل عام أيضًا.

هناك مشغلي نموذجي للبرمجة الهيكلية.

هناك وظائف وإجراءات. هنا ، من غير المعتاد بعض الشيء أن الإجراء يخفي كل المتغيرات من رمز الاتصال بشكل افتراضي ، ولكن يمكن إتاحة بعضها باستخدام إنشاء مفتاح الكشف <قائمة متغير>.

الكتابة ديناميكية. يمكن تفسير المتغير كسلسلة أو كرقم ، في لحظات مختلفة من التنفيذ ، كما قد لا يتم تعريفه (يمكن التحقق من ذلك ، على الرغم من أنه ملتوية). في الواقع ، تحتوي اللغة على نوع بيانات بدائي واحد - سلاسل يمكن من خلالها إجراء العمليات الحسابية إذا كانت السلسلة رقمًا صحيحًا.

هنا مثال صغير ويكيبيديا:

 say hello /* => HELLO */ hello = 25 say hello /* => 25 */ hello = "say 5 + 3" say hello /* => say 5 + 3 */ interpret hello /* => 8 */ drop hello say hello /* => HELLO */ 

يوضح هذا أن المتغير غير المحدد في السطر الأول (والأخير) يتم حسابه باسمه بالأحرف الكبيرة. هذه هي الطريقة للتحقق من عدم اليقين.

تفسير العبارة هو تناظرية لما يسمى اليوم عادة eval.

ربما تشبه معالجة الأخطاء Basic:

 signal on halt do forever ... /*   */ end halt: /* .    halt,    */ exit 

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

2. لم يكن لها تعبيرات منتظمة ، كما نقول في بيرل (ما يقرب من 10 سنوات تركت قبل بيرل ، ولكن). ظهر مفهوم التعبيرات العادية في وقت سابق ، وبالتأكيد كانت موجودة بالفعل ، على سبيل المثال ، فائدة grep موجودة بالفعل. بدلاً من ذلك ، كان هناك عامل تحليل ، وهو عبارة عن تناظرية مبسطة للوائح النظامية ، مع استبدال المجموعات بمتغيرات.

 parse [origin] [template] 

أي نقوم بتحليل محتويات المصدر (والتي يمكن أن تكون حجة لوظيفة أو متغير أو تعبير ، وما إلى ذلك) للامتثال للقالب. يمكن أن يحتوي القالب على حرفية تفصل القيم والمتغيرات التي استلمت القيمة من المصدر بين هذه الفواصل. بطريقة ما ، يبدو وكأنه مجموعات في التعبيرات العادية.

 fio = ', ' parse var fio firstName ',' LastName say firstName say LastName 

هذا ، بطبيعة الحال ، أبسط بكثير من التعبيرات العادية ، إذا كان ذلك بسبب عدم وجود أحرف وصفية مثل \ d ، لا تكرار في شكل * أو + ، لا بدائل ، لا شيء من هذا القبيل.

3. كان لدى Rexx واجهة برمجة التطبيقات (API) التي سمحت باستخدامها كلغة برمجة ليس فقط لنظام التشغيل (CMS) ، ولكن أيضًا لأي برنامج آخر يدعم واجهة برمجة التطبيقات هذه. أي في الواقع ، كانت لغة كتابة DSL. ربما واحدة من الأول. في الوقت نفسه ، يمكن أن يقوم وقت التشغيل بتنفيذ وتزويد المترجم الفوري بوظائف أو أوامر إضافية متوفرة كنتيجة للبرنامج.

بدا الأمر مثل هذا: عند بدء تشغيل محرر نصوص XEDIT ، بحث عن مكان ما على الأقراص القابلة للوصول ملف يسمى PROFILE XEDIT ، والذي يحتوي على برنامج نصي REXX. يمكن لهذا البرنامج النصي تعيين مفاتيح الوظائف ، وتحديد الأوامر الإضافية المتاحة من XEDIT. من حيث المعنى ، اليوم هو الأقرب إلى .bashrc ، على سبيل المثال. أو التناظرية لهيم.

وفقًا لذلك ، يمكن لإجراءات REXX والوظائف المحددة في PROFILE XEDIT تنفيذ أوامر المحرر والوصول إلى معلومات حول الملفات المفتوحة ، بما في ذلك محتويات الملف نفسه.

4. لم يتطلب أي بناء جملة خاص لنقل الأوامر إلى بيئة المضيف (أي ، OS ، أو ، على سبيل المثال ، محرر نصوص). بدلاً من ذلك ، تم تمرير جميع التعبيرات التي لم يتعرف عليها Rexx إلى التنفيذ. وبالتالي ، لكتابة أمر نظام التشغيل داخل البرنامج النصي ، كان يكفي لإلحاقه بعلامات اقتباس ، على سبيل المثال:

 'list * * * (stack' 

يمكن بناء أمر من خلال تسلسل ثوابت السلسلة ومتغيراتها. كان رمز عملية التسلسل مجرد مساحة.

لنقل الأمر إلى تطبيق آخر ، كان هناك بيان عنوان. على سبيل المثال ، عند استخدام محرر نصوص XEDIT في البيئة ، من أجل تنفيذ أمر XEDIT ، ولكن ليس نظام التشغيل (CMS) ، كان عليك القيام بذلك:

 address cms 'list * * * (stack' 

5. طبق نظام إدارة المحتوى واجهة API للوصول إلى حزمة أوامر نظام التشغيل ، والتي استخدمها Rexx أيضًا لتبادل البيانات. قام الأمر أعلاه بإرجاع قائمة الملفات الناتجة إلى المكدس ، حيث يمكن للبرنامج النصي التقاطها ، وقراءة سطر واحد كمدخل قياسي. يشبه هذا في بعض النواحي أنابيب Unix ، لكنه يختلف إلى حد ما عنهم. توجيه الإخراج لا يزال دفق بايت ، ومكدس في CMS عبارة عن مجموعة من السلاسل. بشكل عام ، هذا فرق نموذجي بين أيديولوجية يونيكس ونظام التشغيل من آي بي إم ، حيث كانت الملفات موجهة إلى حد كبير إلى سلاسل ثابتة أو متغيرة (ولكن معروفة في الوقت نفسه).

6. كجزء من واجهة برمجة التطبيقات ، يمكن للتطبيقات الوصول إلى متغيرات النص Rexx ، ويمكنهم قراءتها وتعديلها. كانت هذه طريقة أخرى لتبادل البيانات.

7. تم تنفيذ حساب فعال إلى حد ما من الدقة التعسفية. تعسفي - وهذا يعني على سبيل المثال 100 حرف أو أكثر - مقدار الذاكرة يكفي.

8. إدارة الذاكرة - التلقائي. على الرغم من وجود عامل إسقاط ، على سبيل المثال ، لحذف قيمة المتغير (مجموعة اقتران أو عناصره) ، ولكن على أي حال ، لم يكن لديك عمل مع مؤشرات وأحجام كتلة.

9. باعتبارها البنية الوحيدة ، ولكن في نفس الوقت بنية البيانات الشاملة جدًا ، كانت هناك صفائف ربطية ، تشبه إلى حد كبير جافا سكريبت ، على سبيل المثال. أي إذا كتبت a.1 ، فهذا عنصر الصفيف a بالمفتاح 1. إذا كتبت ab ، فهذا عنصر ذو المفتاح b.

دعنا نقول الإجراء لإضافة كلمة إلى القاموس:

 add_word: procedure expose dictionary. parse arg w n = dictionary.0 + 1 dictionary.n = w dictionary.0 = n return 

متغير القاموس في هذا الجزء هو مجموعة النقابي لدينا. الإجراء لا يُرجع هذه المصفوفة ، ولكنه يجعلها قابلة للوصول من الخارج (باستخدام الكشف). Dictionary.0 يخزن عدد العناصر في القاموس (هذه مجرد اتفاقية ، وكما ترون ، نحن ننفذها بأنفسنا) ، dictionary.n هي الكلمة التاسعة في القاموس.

10. لم يكن للغة وصول منخفض المستوى إلى الذاكرة أو إلى واجهة برمجة تطبيقات OC ، رغم أنه من حيث المبدأ كان من الممكن تمامًا كتابة شيء مشابه لذلك. يمكنني تسمية بضعة أمثلة على امتدادات اللغة ، أحدها مصمم للعمل مع قاعدة بيانات SQL / DS (DB2) ، والثاني - لتبادل الرسائل بين الأجهزة الافتراضية داخل VM / SP. أي أن كل شيء يمكنك ترتيبه باعتباره DSL ، من حيث المبدأ ، يمكن تنفيذه.

REXX الدعم في التطبيقات


بالإضافة إلى CMS نفسها ، دعمت REXX على الفور محرر النصوص الرئيسي XEDIT. سمح لك بكتابة وحدات ماكرو على REXX ، والتي يمكن تعليقها على مفاتيح الوظائف ، أو لاستدعاء الأوامر ، إما من سطر الأوامر أو ما يسمى. أوامر "بادئة" ، والتي تم إدخالها بجوار سطر (سطور) النص ، وسمحت لها (عليها) بالتلاعب بها. على سبيل المثال ، سمح لك الأمر d بحذف السطر المجاور الذي قمت بإدخاله ، وكانت هناك أوامر نسخ أو نقل وأخرى. يمكن لماكرو على REXX ، على سبيل المثال ، تحويل سلسلة إلى أحرف كبيرة أو صغيرة.

كان التطبيق الثاني الذي دعم اللغة في ذاكرتي يسمى DMS (نظام إدارة العرض ل CMS (DMS / CMS)) ، وكان أداة لتطوير برامج تفاعلية تتكون من لوحات. من REXX ، كان من الممكن تحديد أحد النماذج المرسومة مسبقًا ، وملء حقولها بالقيم ، وعرضها على الشاشة. بعد أن ضغط المستخدم على مفتاح الوظيفة ، تلقى البرنامج التحكم مرة أخرى ، واحتوت متغيرات REXX على قيم الحقول التي تم تغييرها. أقرب تماثل وظيفي لـ DMS أود أن أسميه HTML وأشكاله. وفيما يتعلق بالتعقيد (البساطة) في التطوير ، ربما كان ذلك أسهل قليلاً ، على الرغم من أن HTML يفوز بالتأكيد من حيث القدرات التعبيرية (على سبيل المثال ، لم تكن هناك صور على الإطلاق في DMS ، وهو أمر يمكن فهمه بواسطة أطراف النص).

تم استدعاء تطبيق آخر جدير بالذكر ISPF. لكنه كان بالفعل أوسع بكثير من DMS ، وكان أشبه ببيئة التطوير المتكاملة ، كما يبدو الآن ، معدلة لمحطات النص. ونعم ، تمت برمجة محرر النصوص أيضًا في REXX.

بدءًا من VM / SP 6 ، قدمت CMS أدوات لإنشاء نوافذ افتراضية متغيرة الحجم على الشاشة النهائية وعرض النص فيها. ظهرت واجهة برمجة التطبيقات المقابلة لـ REXX (بشكل أكثر دقة ، كانت في الأساس امتدادًا لـ REXX).

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

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

تأثير التنمية


أود أن أقول أنه مع ظهور REXX في VM / SP 3 ، بدأنا في الكتابة عليه جزءًا مهمًا مما سبق كتابته على سبيل المثال على PL / 1. هذه لغة قوية إلى حد ما وفي الوقت نفسه لا تزال لغة بسيطة تتيح لك تنظيم التطبيقات الكبيرة نسبيًا بشكل صحيح. بادئ ذي بدء ، ربما يرجع ذلك إلى قدرات التكامل الخاصة به ، عندما تم استخدامه بمثابة DSL.

تغطي القدرة على تلبية استعلامات قاعدة البيانات (SQL / DS) ، وعرض نماذج الشاشة ، وقراءة وكتابة الملفات ، جزءًا كبيرًا من احتياجات تطوير تطبيقات الأعمال.

من الواضح أن الكثير من الناس أحبوا اللغة. كان في OS / 2 ، وكان على Amigami ، تحت ويندوز ، وغيرها الكثير حيث. فيما بعد ، كان هناك كائن REXX مع ملحقات الكائنات ، و NetREXX لـ JVM. الشيء الرئيسي هو أن هذه اللغة لا تزال حية. وبشكل عام ، إذا كان لا بد لي من اختيار ما سأكتبه في البرامج النصية اليوم ، ففكر على سبيل المثال Rexx ، bash ، لغة الطيور cmd.exe تمامًا - سأختار بالتأكيد الأولى. ولكن بالمقارنة مع اللغات الجديدة بالفعل ، مثل Perl و Python والعديد غيرها ، فكل شيء غير واضح. لنفترض أن فكرة Rexx حول نقل الأوامر والمتغيرات إلى وقت التشغيل كانت جيدة - ولكن الفكرة ، كما يقول COM ، مع اتجاه كائنها ، لا تزال أكثر وظيفية.

على الرغم من السنوات الأربعين الماضية ، لا يزال يستخدم في IBM z OS ، وتم إصدار كتاب للغات ، وفقًا لـ Wikipedia ، مؤخرًا ، حوالي عام 2012. بالنسبة لأنظمة التشغيل المختلفة ، يمكن تنزيل التطبيقات الحية وتجربتها بنفسك.

Source: https://habr.com/ru/post/ar457182/


All Articles