لغة برمجة الأنظمة

لغة برمجة الأنظمة ( SPL) ، والتي تُختصر غالبًا إلى SPL وتُعرف أحيانًا باسم SPL/3000 ، هي لغة برمجة إجرائية طورتها شركة هيوليت-باكارد لسلسلة الحواسيب الصغيرة HP 3000 ، وقد طُرحت لأول مرة عام 1972. استُخدمت SPL لكتابة نظام التشغيل الأساسي لـ HP 3000 ، وهو نظام التشغيل متعدد البرامج (MPE). وقد أُشير إلى لغات مماثلة على منصات أخرى بشكل عام باسم لغات برمجة الأنظمة ، مما أدى إلى بعض الالتباس.

كانت لغة برمجة أنظمة ألفا (Alpha Systems Programming Language )، نسبةً إلى مشروع التطوير الذي أنتج سلسلة 3000، وقد صُممت SPL للاستفادة من تصميم معالج ألفا القائم على المكدس . وهي مستوحاة من ESPOL ، وهي لغة مشتقة من ALGOL، استخدمتها أنظمة Burroughs B5000 للحاسوب المركزي ، والتي أثرت أيضًا على عدد من لغات الستينيات مثل PL360 و JOVIAL .

خلال منتصف سبعينيات القرن العشرين، أدى نجاح أنظمة HP إلى ظهور عدد من اللغات المشتقة من لغة SPL. ومن الأمثلة على ذلك ZSPL لمعالج Zilog Z80 ، و Micro-SPL لجهاز Xerox Alto . وقد ألهمت الأخيرة لعبة Action! لأجهزة Atari ذات 8 بت ، والتي حققت نجاحًا لا بأس به. واتبعت الأخيرة بنية لغة باسكال بشكل أوثق ، متخليةً عن بعض خصائص SPL المميزة.

استُخدمت لغة SPL على نطاق واسع خلال فترة تشغيل النسخة الأصلية ذات 16 بت من منصة HP 3000. في ثمانينيات القرن الماضي، أُعيد تنفيذ HP 3000 وMPE في محاكي يعمل على منصات HP 9000 القائمة على معالجات PA-RISC . روّجت HP للغة باسكال كلغة النظام المفضلة على PA-RISC، ولم تُوفر مُترجمًا للغة SPL. أثار هذا الأمر مخاوف بشأن صيانة الكود ، فتم طرح مُترجمات SPL من جهات خارجية لتلبية هذه الحاجة.

تاريخ

أطلقت شركة هيوليت-باكارد أولى حواسيبها الصغيرة ، سلسلة HP 2100 ، عام 1967. صُممت هذه الحواسيب في الأصل من قِبل فريق خارجي يعمل لصالح شركة يونيون كاربايد ، وكانت مُخصصة بشكل أساسي لتطبيقات التحكم المُدمج في الصناعة، وليس لسوق معالجة البيانات الأوسع. رأت HP في ذلك توافقًا طبيعيًا مع أعمالها القائمة في مجال أجهزة القياس، وسوّقتها في البداية لهؤلاء المستخدمين. مع ذلك، وجدت HP أن نسبة السعر إلى الأداء في هذه الحواسيب تُحقق لها نجاحًا متزايدًا في سوق الأعمال. [ 1 ] [ 2 ]

خلال هذه الفترة، اكتسب مفهوم المشاركة الزمنية شعبيةً متزايدة، لا سيما مع انخفاض تكاليف الذاكرة الأساسية وبدء تزويد الأنظمة بذاكرة أكبر. في عام 1968، طرحت شركة HP نظامًا متكاملًا يتألف من جهازين من سلسلة 2100 يعملان بنظام HP Time-Shared BASIC ، والذي وفّر نظام تشغيل كاملًا بالإضافة إلى لغة برمجة BASIC . حققت هذه الأنظمة الثنائية، المعروفة مجتمعةً باسم HP 2000، نجاحًا فوريًا. [ 3 ] كان لنظام HP BASIC تأثيرٌ بالغٌ لسنواتٍ عديدة، ويمكن ملاحظة بنيته في عددٍ من لغات BASIC الخاصة بالحواسيب الصغيرة ، بما في ذلك Palo Alto TinyBASIC و Integer BASIC و North Star BASIC و Atari BASIC وغيرها.

بدأ المصممون في شركة HP يتساءلون: "إذا استطعنا إنتاج نظام مشاركة زمنية بهذه الجودة باستخدام حاسوب متواضع مثل 2116، فماذا يمكننا أن نحقق لو صممنا حاسوبنا الخاص؟" [ 4 ] ولتحقيق هذه الغاية، بدأت الشركة في عام 1968 بتشكيل فريق أكبر لتصميم بنية جديدة متوسطة الحجم. ضمّ الفريق الجديد أعضاءً عملوا على أنظمة الحواسيب المركزية من Burroughs و IBM ، وكانت المفاهيم الناتجة تُشبه إلى حد كبير نظام Burroughs B5000 الناجح للغاية . استخدم B5000 معالج آلة مكدس سهّل تنفيذ البرمجة المتعددة ، واختارت HP هذه البنية نفسها للمفهوم الجديد. [ 5 ]

تمّ النظر في تصميمين: جهاز حاسوب مركزي ضخم ذو 32 بت يُعرف باسم أوميغا، وتصميم ذو 16 بت يُعرف باسم ألفا. انصبّ معظم الجهد على أوميغا، ولكن في يونيو 1970، أُلغي المشروع. أدّى ذلك إلى إعادة تصميم شاملة لألفا لتمييزه عن أجهزة 2100، وظهر في النهاية بخطط لتصميم نظام تشغيل أكثر تطورًا. كان من المُفترض أن يعمل أوميغا بنظام الدفعات ، وأن يستخدم حاسوبًا أصغر، يُسمى "الواجهة الأمامية"، لمعالجة تفاعلات المستخدم. كان هذا هو نفس مفهوم التشغيل لسلسلة 2000. مع ذلك، لم يكن جهاز 2000 آخر كافيًا لألفا، فتقرر اعتماد نظام تشغيل واحد للدفعات والتفاعل وحتى التشغيل في الوقت الفعلي . [ 5 ]

لإنجاح هذا الأمر، تطلّب الأمر تصميمًا متطورًا لحافلة الحاسوب مع وصول مباشر واسع النطاق للذاكرة (DMA)، ونظام تشغيل متطورًا لتوفير استجابات سريعة لإجراءات المستخدم. كما تميّز جهاز B5000، في عصره، بأن نظام تشغيله ووظائفه الأساسية كانت جميعها مُبرمجة بلغة برمجة عالية المستوى ، وهي ESPOL . كانت ESPOL مشتقة من لغة ALGOL، ومُعدّلة خصيصًا للعمل على أجهزة B5000، وهو مفهوم كان له تأثير كبير في ستينيات القرن الماضي، وأدى إلى ظهور لغات جديدة مثل JOVIAL و PL/360 و BCPL . قرر فريق HP استخدام لغة مشتقة من ALGOL أيضًا لأنظمة التشغيل الخاصة بهم. كانت لغة HP المشابهة تُعرف في البداية باسم لغة برمجة أنظمة ألفا (Alpha Systems Programming Language). [ 5 ]

استغرق تطوير جهاز ألفا عدة سنوات قبل ظهوره عام 1972 باسم HP 3000. لم يمضِ على طرح الجهاز في السوق سوى بضعة أشهر حتى اتضح أنه لا يعمل بشكل صحيح، مما اضطر شركة HP إلى سحب جميع أجهزة 3000 المباعة. أُعيد طرحه في أواخر عام 1973 بعد إصلاح معظم مشاكله. أدى تحديث رئيسي للنظام بأكمله، وجهاز CX، ونظام MPE-C لتشغيله، إلى تحسين صورته، وحقق جهاز 3000 نجاحًا كبيرًا آخر خلال النصف الثاني من سبعينيات القرن العشرين. [ 5 ]

حقق SPL نجاحًا كبيرًا، ما جعله منتشرًا على نطاق واسع تقريبًا مثل لغة BASIC المستخدمة في سلسلة 2000، ومثلها، ظهرت نسخ عديدة من SPL لمنصات أخرى. ومن أبرزها Micro-SPL، وهي نسخة كُتبت خصيصًا لمحطة عمل Xerox Alto . كانت هذه الآلة تستخدم BCPL كلغة أساسية، لكن عدم الرضا عن أدائها دفع هنري بيكر إلى تصميم لغة غير تكرارية قام بتنفيذها مع كلينتون باركر عام 1979. [ 6 ] ثم قام كلينتون بتعديل Micro-SPL لاحقًا لإنتاج لعبة Action! لأجهزة كمبيوتر أتاري ذات 8 بت عام 1983. [ 7 ]

أعادت HP تصميم نظام HP 3000 على شريحة PA-RISC، مُشغّلةً إصدارًا جديدًا من نظام التشغيل يُعرف باسم MPE/iX. يحتوي MPE/iX على وضعين: "الوضع الأصلي" لتشغيل التطبيقات التي أُعيد تجميعها لشريحة PA-RISC باستخدام مُجمّعات Pascal الأحدث، و"الوضع المتوافق" لتشغيل جميع البرامج الموجودة عبر المحاكاة. لم تُوفر HP مُجمّعًا للوضع الأصلي لـ MPE/iX، لذا لم يكن نقل البرامج الموجودة إلى المنصة الجديدة عملية سهلة. ولتلبية هذه الحاجة، طوّرت شركة Allegro Consultants لغةً متوافقة مع SPL تُسمى "SPLash!"، والتي يُمكن تجميعها إلى كود HP 3000 الأصلي لتشغيله داخل المُحاكي، أو إلى الوضع الأصلي. وفّر هذا مسارًا لنقل برامج SPL الموجودة. [ 8 ]

لغة

بناء الجملة الأساسي

تتبع لغة SPL عمومًا اصطلاحات بناء جملة ALGOL 60، وستكون مألوفة لأي شخص لديه خبرة في ALGOL أو اللغات المشتقة منها، مثل Pascal و Modula-2 . ومثل تلك اللغات، يمكن أن تمتد عبارات البرنامج على عدة أسطر وتنتهي بفاصلة منقوطة. يُشار إلى التعليقات بالكلمة COMMENTالمفتاحية، أو بوضع نص التعليق بين علامتي << و >>. [ 9 ]

تُجمّع التعليمات البرمجية في كتل باستخدام BEGIN وEND، مع العلم أنه كما في لغة باسكال، يجب أن يتبع نهاية البرنامج نقطة. يُحاط البرنامج ككل بـ BEGIN وEND، على غرار باسكال، ولكن دون وجود كلمة PROGRAM أو عبارة مشابهة في الأعلى. [ 10 ] والسبب في ذلك هو أن لغة SPL تسمح باستخدام أي كتلة من التعليمات البرمجية كبرنامج مستقل، أو تجميعها في برنامج آخر ليعمل كمكتبة. لم يكن إنشاء التعليمات البرمجية كبرنامج أو برنامج فرعي جزءًا من اللغة نفسها، بل كان يتم عن طريق وضع $CONTROL SUBPROGRAMتوجيه المُجمِّع في أعلى الملف. [ 11 ]

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

على عكس لغة باسكال، حيث كان PROCEDUREكل من `and` و`and` FUNCTIONمفهومين منفصلين، تستخدم لغة SPL نهجًا أقرب إلى لغة C، حيث PROCEDUREيمكن إضافة نوع بادئة إلى أي `and` لتحويله إلى دالة. وتماشيًا مع بنية لغات أخرى شبيهة بلغة ALGOL، تُدرج أنواع المعاملات بعد الاسم، وليس كجزء منه. على سبيل المثال: [ 12 ]

إجراء عدد صحيح FACT(N)؛ القيمة N؛ عدد صحيح N؛

يُعلن عن دالة FACT تأخذ قيمة N، وهي عدد صحيح. VALUEيشير هذا إلى أن هذا المتغير يُمرر بالقيمة، وبالتالي لن يرى المُستدعي أي تغييرات تُجرى عليه داخل الدالة. [ 13 ] تُحدد الدالة قيمة الإرجاع الخاصة بها عن طريق عبارة إسناد إلى اسمها.

حقيقة := تعبير؛

على الرغم من عدم استحسانها، سمحت لغتا ALGOL وPascal بتسمية الشيفرة باستخدام اسم يبدأ بعلامة تنتهي بنقطتين رأسيتين، ويمكن استخدامه لاحقًا كهدف للحلقات GO TOوالعبارات. أحد الاختلافات الطفيفة هو أن لغة SPL تتطلب تعريف أسماء التسميات في قسم المتغيرات باستخدام الكلمة LABELالمفتاحية. [ 14 ]

أضافت لغة SPL إلى هذا المفهوم عبارةً ENTRYسمحت بتعريف هذه التسميات بشكلٍ أدقّ على أنها "نقاط دخول" يمكن الوصول إليها من سطر الأوامر. تُعرَض التسميات المُسمّاة في عبارة (عبارات) الدخول لنظام التشغيل، ويمكن استدعاؤها من أمر RUN. على سبيل المثال، يمكن كتابة برنامج يحتوي على دوالّ نصية لتحويل الأحرف إلى أحرف كبيرة أو صغيرة، ثم توفير نقاط دخول لهاتين الحالتين. ويمكن استدعاء هذا البرنامج من سطر الأوامر كما يلي RUN $STRINGS,TOUPPER: [ 15 ]

أنواع البيانات

يتمثل أبرز اختلاف بين لغة SPL ولغة ALGOL في أن أنواع بياناتها خاصة جدًا بالجهاز، وتعتمد على تنسيق الكلمات ذي النهاية الكبيرة 16 بت الخاص بجهاز 3000. [ 10 ]

النوع INTEGERهو نوع مُوَقَّع ذو 16 بت، حيث يُمثِّل 15 بت القيمة، ويُمثِّل البت الأقل أهمية الإشارة. DOUBLEهو عدد صحيح ذو 32 بت، وليس نوعًا من أنواع الأعداد العشرية. REALهو قيمة عددية عشرية ذات 32 بت، حيث يُمثِّل 22 بت الجزء الكسري و9 بتات الأس، بينما LONGهو قيمة عددية عشرية ذات 64 بت، حيث يُمثِّل 54 بت الجزء الكسري و9 بتات الأس. [ 16 ]

BYTEيُستخدم لمعالجة الأحرف، ويتكون من كلمة آلة 16 بت تحتوي على حرف واحد 8 بت في البتات الأقل أهمية. تحتوي مصفوفات نوع BYTE على حرفين 8 بت لكل كلمة آلة 16 بت. LOGICALهو نوع عدد صحيح غير مُوقّع 16 بت، وعند استخدامه في تعبير شرطي، يُرجع القيمة "صحيح" إذا كان البت الأقل أهمية يساوي 1، و"خطأ" خلاف ذلك. يمكن إجراء العمليات الحسابية على الأعداد الصحيحة غير المُوقّعة على البيانات المنطقية، ويتم تجاهل أي تجاوز. لا يوجد ما يُعادل المُعدِّل PACKEDالموجود في لغة باسكال، لذا LOGICALفهو يُهدر الذاكرة إلى حد ما [ 17 ] عند استخدامه لتخزين رقم ثنائي واحد فقط، على الرغم من أن لغة SPL تُوفر معالجة سلاسل البتات كبديل.

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

الأعداد الصحيحة أ، ب، ج القيمة المنطقية D = A + 2

يُعرّف هذا السطر ثلاثة متغيرات عددية صحيحة من 16 بت، A وB وC، ثم قيمة منطقية (LOGICAL) من 16 بت أيضًا. =يشير الرمز `D`، كما في لغة باسكال، إلى "مكافئ لـ" وليس "يحصل على قيمة"، كما هو الحال :=في لغات مثل ألغول. لذا، ينص السطر الثاني على "تعريف متغير D موجود في نفس موقع الذاكرة الخاص بـ A+2"، وهو في هذه الحالة موقع المتغير C أيضًا. يسمح هذا بقراءة القيمة نفسها كعدد صحيح عبر C أو كقيمة منطقية عبر D. [ 18 ]

قد تبدو هذه الصيغة غريبةً للقراء المعاصرين حيث تُعتبر الذاكرة عمومًا صندوقًا أسود ، لكنها تُستخدم استخداماتٍ مهمةً في برمجة الأنظمة، حيث تحتفظ مواقع ذاكرة مُحددة بقيم من المكونات المادية الأساسية. على وجه الخصوص، تسمح هذه الصيغة بتعريف متغير يُشير إلى بداية جدول القيم، ثم تعريف متغيرات إضافية تُشير إلى قيم مُحددة داخل الجدول. إذا تغير موقع الجدول، يكفي تغيير قيمة واحدة فقط، وهي العنوان الابتدائي، وستتبعها جميع المتغيرات الفردية تلقائيًا في مواقعها النسبية الصحيحة. [ 18 ]

يتم تعريف المؤشرات بإضافة POINTERالمُعدِّل إلى أي تعريف متغير، ويتم فك مرجعية موقع الذاكرة للمتغير باستخدام @. وبالتالي، INTEGER POINTER P:=@Aيُعرِّف مؤشرًا تحتوي قيمته على عنوان المتغير A، وليس قيمة A نفسها. [ 19 ]@ يمكن استخدام على جانبي عملية الإسناد؛ @P:=Aحيث يضع قيمة A في P، مما قد ينتج عنه مؤشر معلق ، @P:=@Aبينما يجعل P يشير إلى A، في حين P:=Aيضع قيمة A في الموقع الذي يشير إليه P حاليًا. [ 20 ]

على نحو مماثل، تتضمن لغة SPL دعمًا للمصفوفات شبيهًا بلغة C، حيث يكون متغير الفهرس عبارة عن إزاحة بعدد الكلمات من موقع الذاكرة المُحدد للمتغير الأولي. على عكس لغة C، توفر SPL مصفوفات أحادية البعد فقط، وتستخدم الأقواس بدلًا من المعقوفات. [ 21 ] يمكن أيضًا تعريف المتغيرات GLOBAL، وفي هذه الحالة لا يتم تخصيص أي ذاكرة محلية لها، ويُفترض أن التخزين مُعرّف في مكتبة أخرى. [ 22 ] وهذا يُحاكي externالكلمة المفتاحية في لغة C.

يمكن تحديد القيم الحرفية باستخدام لواحق مختلفة، وتُعتبر القيم التي لا تحتوي على لاحقة فارغة INTEGER. على سبيل المثال، 1234تُفسَّر على أنها INTEGER، بينما 1234Dتُفسَّر على أنها DOUBLE. Eيُشير الرمز إلى REALو L. [ 23LONG ] تُفصل ثوابت السلاسل النصية بعلامات اقتباس مزدوجة، وتُغلَّف علامات الاقتباس المزدوجة داخل السطر بعلامة اقتباس مزدوجة ثانية . [ 24 ]

يمكن استخدام الثوابت في تعريف المتغيرات لتحديد قيمة ابتدائية، كما في المثال التالي INTEGER A:=10. لاحظ استخدام "assign-to" بدلاً من "is-a". بالإضافة إلى ذلك، احتوت لغة SPL على EQUATEكلمة مفتاحية تسمح بتعريف سلسلة نصية كمتغير، ثم استبدال أي مثيل لهذا المتغير في الكود بالسلسلة النصية نفسها أثناء عملية الترجمة. [ 25 ] وهذا مشابه للكلمة constالمفتاحية في لغة C.

تجزئة الذاكرة

كان جهاز HP 3000 الكلاسيكي يُنظّم الذاكرة الفعلية في 1 أو 2 أو 4 أو 8 أو 16 بنكًا، كل منها يحتوي على 64 كيلوبايت (65536 كلمة من 16 بت). كان الكود (المشترك، غير القابل للتعديل) والبيانات منفصلين، ويُخزّنان في مقاطع متغيرة الطول، يصل طول كل منها إلى 32 كيلوبايت. ضمن العملية، كانت عناوين البيانات، مثل المؤشرات، عبارة عن إزاحات 16 بت من سجل أساسي (يُعرف باسم DB)، أو إزاحات نسبية من سجل مؤشر (Q أو S) تُنتج عنوانًا صالحًا ضمن منطقة بيانات العملية (المسماة المكدس). مع أن النظام كان مُوجّهًا بشكل أساسي نحو الكلمات من 16 بت، إلا أنه كان يدعم عنونة البايتات الفردية في مصفوفة باستخدام عنوان الكلمة حيث يُخزّن البايت، مُزاحًا إلى اليسار بت واحد، ثم إضافة 0 للوصول إلى البايت العلوي، أو 1 للوصول إلى البايت السفلي. وهكذا، كانت عناوين البايتات منفصلة ومُميزة عن عناوين الكلمات، وكان تفسير العنوان سياقيًا بحتًا. أثبت هذا الأمر أنه مُشكلة كبيرة، وكان مصدرًا للعديد من الأخطاء في كلٍ من نظام التشغيل ورمز المستخدم. كان لا بد من توخي الحذر عند التعامل مع عناوين البايتات كأعداد غير مُوقّعة من 16 بت (أي من النوع المنطقي) عند استخدامها، على سبيل المثال، في حسابات الطول، لأنه بخلاف ذلك، سيتم التعامل مع عنوان بايت بقيمة 2^16 أو أكبر كقيمة مُوقّعة بنظام المتمم الثنائي، مما يؤدي إلى حساب خاطئ للأطوال أو الإزاحات.

كان بإمكان كل عملية الوصول إلى ما يصل إلى 254 مقطعًا برمجيًا، يصل طول كل منها إلى 32 ألف كلمة. قُسّمت هذه المقاطع إلى نطاقين: 191 مقطعًا "نظاميًا" مشتركًا بين جميع العمليات، و63 مقطعًا "مستخدميًا" مشتركًا بين جميع العمليات التي تُشغّل البرنامج نفسه. حدّد نقل التحكم إما رقم روتين داخل المقطع الحالي، أو رقم مقطع خارجي ورقم روتين داخله. وفّر جدول صغير في نهاية المقطع عنوان نقطة دخول الروتين.

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

تضمنت لغة SPL مجموعة متنوعة من أنظمة الدعم التي تسمح بتقسيم البرامج بسهولة، ثم جعل هذا التقسيم غير مرئي نسبيًا في الكود. كانت الآلية الأساسية هي استخدام $CONTROL SEGMENT=asegmentnameتوجيه المُصرّف الذي يُحدد الجزء الذي يجب وضع الكود التالي فيه. كان الإعداد الافتراضي هو MAINLINESEG، ولكن يمكن للمبرمج إضافة أي عدد من الأجزاء المسماة الإضافية لتنظيم الكود في كتل. [ 26 ]

ميزات أخرى

تضمنت لغة SPL ميزة "استخراج البتات" التي سهّلت التعامل معها . يمكن الوصول إلى أي بت، أو سلسلة بتات، في كلمة باستخدام .(x:y)الصيغة التالية، حيث يمثل x و y موضعَي بت البداية والنهاية من 0 إلى 15. (من المهم معرفة أن x و y يجب أن يكونا ثابتين معروفين وقت الترجمة). وبالتالي، A.(8:15)تُعيد هذه الصيغة البايت الأدنى من الكلمة التي تخزن A. [ 27 ] يمكن استخدام هذا التنسيق لتقسيم البتات ودمجها حسب الحاجة. بالإضافة إلى ذلك، تم توفير عمليات إضافية للإزاحة والتدوير، ويمكن تطبيقها على أي متغير &، على سبيل المثال A:=A & LSR(3). [ 28 ]

مثال

يُظهر هذا البرنامج البسيط، من نسخة عام 1984 من الدليل المرجعي، معظم ميزات لغة SPL. [ 11 ]

يُفصل البرنامج ككل بين BEGINو END.. يبدأ بتعريف سلسلة من المتغيرات العامة، A وB وC، ثم يُعرّف إجراءً واحدًا ويستدعيه عشرين مرة. لاحظ أن الإجراء لا يحتوي على BEGIN وEND خاصين به لأنه يتضمن سطرًا واحدًا فقط من التعليمات البرمجية الفعلية، X:=X*(Y+Z);ولا INTEGER X,Y,Zيُعتبر جزءًا من التعليمات البرمجية نفسها، بل يُشير إلى نوع المعاملات الثلاثة التي يتم تمريرها في السطر السابق، ويُعتبر جزءًا من ذلك السطر. [ 11 ]

يبدأ عدد صحيح A:=0، B، C:=1؛ الإجراء N(X,Y,Z)؛ عدد صحيح X، Y، Z؛ X:=X*(Y+Z); من أجل B:=1 حتى 20 كرر N(A,B,C)؛ نهاية.

مراجع

الاقتباسات

  1. ليبسون 2017 .
  2. "تاريخ الحاسوب الرقمي 2116A" . HP .
  3. "حواسيب هيوليت/باكارد" . كان جهاز 2000A أول نظام مشاركة زمنية من طراز HP 2000 في السوق حوالي عام 1969.
  4. غرين 2004 .
  5. 1 2 3 4 إيدلر 1995 .
  6. بيكر، هنري؛ باركر، كلينتون (سبتمبر 1979). "Micro-SPL" (ملف PDF) .
  7. باركر، كلينتون (31 ديسمبر 2015). "مقابلة أنتيك رقم 111، كلينتون باركر، انطلق!" (بودكاست). أجرى المقابلة راندي كينديج.
  8. "SPLash! مُجمِّع لغة SPL للوضع الأصلي لنظام MPE/iX" . شركة Allegro Consultants. 1 يناير 2004.
  9. SPL 1984 ، ص. 1.2، 1.3.
  10. 1 2 SPL 1984 ، ص. 1.1.
  11. 1 2 3 SPL 1984 ، ص. 1.5.
  12. SPL 1984 ، ص. 1.11.
  13. SPL 1984 ، الصفحات 7-4.
  14. SPL 1984 ، ص. 3.15.
  15. SPL 1984 ، ص. 1.13، 1.14.
  16. SPL 1984 ، ص 2.1–2.3.
  17. SPL 1984 ، ص. 2.4.
  18. 1 2 SPL 1984 ، ص. 3.2.
  19. SPL 1984 ، ص. 2.13.
  20. SPL 1984 ، ص. 4.4.
  21. SPL 1984 ، ص. 2.12.
  22. SPL 1984 ، ص. 3.6.
  23. SPL 1984 ، ص. 2.6.
  24. SPL 1984 ، ص. 2.11.
  25. SPL 1984 ، ص. 3.18.
  26. SPL 1984 ، ص. 1.8.
  27. SPL 1984 ، ص. 4.6.
  28. SPL 1984 ، ص. 4.9.

فهرس