لغة البرمجة GRASS

GRASS ( نظام التكافل الرسومي ) هي لغة برمجة مصممة لكتابة نصوص رسوميات متجهة ثنائية الأبعاد . تشابهت GRASS مع لغة BASIC في تركيبها، لكنها أضافت تعليمات عديدة لتحديد حركة الكائنات ثنائية الأبعاد، بما في ذلك تغيير الحجم والتحريك والتدوير بمرور الوقت. كانت هذه الوظائف مدعومة مباشرةً من قبل محطة Vector General ثلاثية الأبعاد التي صُممت GRASS من أجلها. وسرعان ما لاقت رواجًا كبيرًا بين الأوساط الفنية التي كانت تجرّب وسيط رسومات الحاسوب الجديد ، واشتهرت بشكل خاص باستخدامها من قبل لاري كوبا لإنشاء الرسوم المتحركة الأصلية "لن يكون مهاجمة نجمة الموت أمرًا سهلاً" في فيلم حرب النجوم (1977).

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

تاريخ

عشب

طُوِّرت النسخة الأصلية من برنامج GRASS بواسطة توم ديفانتي لأطروحته لنيل درجة الدكتوراه من جامعة ولاية أوهايو عام 1974. [ 1 ] وقد طُوِّر البرنامج على جهاز PDP-11 /45 يُشغِّل شاشة Vector General 3DR . [ 1 ] وكما يوحي الاسم، كان هذا الجهاز مُخصَّصًا للرسومات المتجهة فقط . احتوى برنامج GRASS على عدد من أوامر الرسم المتجه، وكان قادرًا على تنظيم مجموعات منها في تسلسل هرمي، وتطبيق تأثيرات الرسوم المتحركة المختلفة على "أشجار" كاملة من الصورة دفعة واحدة (مخزَّنة في مصفوفات). [ 1 ]

بعد تخرجه، انتقل ديفانتي إلى جامعة إلينوي في شيكاغو سيركل . هناك، انضم إلى دان ساندين ، وشكّلا معًا مختبر سيركل غرافيكس هابيتات (المعروف اليوم باسم مختبر التصور الإلكتروني ، أو EVL). كان ساندين قد انضم إلى الجامعة عام 1971، وقام ببناء معالج صور ساندين ، أو IP. كان معالج الصور عبارة عن حاسوب تناظري يستقبل مدخلين فيديو، ويمزجهما، ويلوّن النتائج، ثم يعيد إنتاج مخرجات التلفزيون. وصفه ساندين بأنه النسخة المرئية من جهاز توليف موغ . [ 1 ]

أضاف ديفانتي نظام GRASS الحالي كمدخل لوحدة الملكية الفكرية، مُنشئًا بذلك معالج GRASS/Image Processor ، الذي استُخدم طوال منتصف سبعينيات القرن العشرين. ولجعل النظام أكثر فائدة، أضاف ديفانتي وساندين أنواعًا مختلفة من الأوامر "الفريدة" إلى نظام GRASS الحالي، لكن هذه التغييرات جعلت اللغة أكثر خصوصية. في عام 1977، أعاد عضو آخر في فريق Habitat، نولا دوناتو، تصميم العديد من هياكل التحكم في GRASS إلى أشكال أكثر عمومية، مما أدى إلى ظهور GRASS3 الأكثر وضوحًا . [ 1 ]

يعتمد عمل لاري كوبا في عالم حرب النجوم على تصوير شبه آلي لنظام GRASS يعمل على جهاز Vector General 3D . يحتوي جهاز VG3D على مكونات داخلية تُجري تحويلات أساسية - كالتكبير والتصغير والتدوير - في الوقت الفعلي دون الحاجة إلى التفاعل مع الحاسوب. ولا تتم الاتصالات البطيئة مع لغة GRASS إلا عند عرض مشاهد جديدة. يظهر هذا بوضوح في تسلسل الفيلم، حيث تُظهر الأجزاء الأولى منه دوران وتكبير نجمة الموت بسرعة فائقة، بينما تتطلب الأجزاء اللاحقة التي تحاكي الطيران في الخندق تحميل مشاهد جديدة من "أشجار" GRASS، والتي تظهر في مجموعات.

ZGRAS و UV-1

في عام ١٩٧٧، تعرّف ديفانتي على جيف فريدريكسن، مصمم الرقائق الإلكترونية الذي كان يعمل في شركة ديف ناتينغ أسوشيتس . تعاقدت شركة ميدواي، قسم ألعاب الفيديو التابع لشركة بالي، مع ناتينغ لإنشاء شريحة تعريف رسومية موحدة . كانت ناتينغ تعتزم استخدامها في معظم ألعاب الأركيد المستقبلية، بالإضافة إلى جهاز ألعاب فيديو كانت تعمل عليه والذي سيتحول لاحقًا إلى أستروكيد . أبدت ميدواي اهتمامًا كبيرًا برؤية لغة GRASS تعمل على نظامها، وتعاقدت مع ديفانتي لنقلها إلى منصتها. عمل عدد من الأشخاص في هابيتات، بالإضافة إلى بعض الأشخاص من ناتينغ، على المشروع الذي أطلقوا عليه اسم Z Box . أصبح تشغيل GRASS3 عليه يُعرف باسم ZGRASS . [ ١ ]

كان جهاز Z-Box جهازًا للرسومات النقطية ، على عكس أنظمة GRASS الأصلية، لذا فبينما احتفظ ZGRASS بمعظم خصائص GRASS3، فقد أضاف عددًا من الأوامر المخصصة للصور النقطية. وشمل ذلك مجموعة واسعة من أوامر نقل كتل البتات لمحاكاة الرسوم المتحركة ثنائية الأبعاد (sprites) ، وهو أمر لم يكن متوفرًا في الجهاز. [ 1 ] لم تُصدر شركة Midway هذا العمل، لكن شركة Circle أنتجت أجهزةً مبنية عليه تحت اسم Datamax UV-1 .

GRASS RT/1

كان الإصدار الأخير من GRASS هو RT/1 ، وهو نسخة مُعدّلة من GRASS لمنصات أخرى، حيث فصلت اللغة عن نموذج العرض، مما سمح بنقلها إلى منصات أخرى. وُجدت إصدارات لأنظمة MS-DOS ، وMicrosoft Windows ، ومنصة SGI باستخدام OpenGL ، و HP-UX ، وAIX ، و Macintosh ، و Amiga . لا تزال اللغة مشابهة للإصدارات السابقة، لذا يبقى سبب تغيير الاسم غير واضح.

وصف

يستند هذا الوصف إلى كتيبات Bally الأصلية بالإضافة إلى وصف ACM. [ 2 ]

استندت لغة Zgrass إلى مجموعة قياسية من أوامر BASIC، واستخدمت معظم قواعدها النحوية. لكن ما ميّز Zgrass عن BASIC هو أن جميع الأوامر كانت في الواقع دوالًا تُرجع قيمًا، على غرار لغة البرمجة C. فإذا لم تكن هناك قيمة إرجاع واضحة، كان من المتوقع أن تُرجع الدالة 1 في حال نجاحها، و0 في حال فشلها. على سبيل المثال، PRINT PRINT 10يُعد الأمر غير مسموح به في BASIC، لكن في Zgrass سيطبع 10 110، حيث يُمثل الرقم 1 القيمة التي تُرجعها الدالة second PRINT، أي "لقد نجحتُ في إخراج السلسلة '10'".

كانت البرامج في لغة Zgrass تُعرف باسم "الماكرو"، وتُخزّن كسلاسل نصية. كان هذان الأمران مقصودين، إذ سمحت Zgrass بتحويل أي سلسلة نصية إلى برنامج. على سبيل المثال، MYBOX="BOX 0,0,100,100,2"يُعرّف الأمر `$` سلسلة نصية (لا حاجة لعلامة الدولار ($) على المتغير كما في لغة Microsoft BASIC ) تحتوي على جزء من كود Zgrass. بمجرد الكتابة MYBOXمن تلك النقطة، يتم تشغيل الأمر (أو الأوامر) الموجودة بداخلها. يمكن استخدام هذه الميزة بدلاً من GOSUBالأمر التقليدي في لغة BASIC، ولكنها تتميز بميزة إضافية تتمثل في وجود اسم واضح بدلاً من رقم سطر غامض. بالإضافة إلى ذلك، يبقى الأمر على شكل سلسلة نصية في الذاكرة، ويمكن تعديله أثناء التشغيل باستخدام عمليات السلاسل النصية القياسية.

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

كانت أرقام الأسطر اختيارية في Zgrass، وعادةً ما تظهر فقط على الأسطر المستهدفة GOTO. تتطلب معظم مترجمات BASIC أرقام أسطر لكل سطر من التعليمات البرمجية، ولكن ذلك كان بسبب استخدامها في "محرر الأسطر" - إذا كنت بحاجة إلى تعديل سطر معين، فإن الطريقة الوحيدة للإشارة إليه هي من خلال رقمه. استخدم Zgrass محررًا أكثر تطورًا بملء الشاشة، مما ألغى هذه الحاجة. سمح Zgrass لأي سلسلة نصية بالعمل كرقم سطر، GOTO 10وكلاهما GOTO MARKERكان صالحًا.

تضمنت Zgrass أيضًا فروعًا غير مُسماة، باستخدام SKIPتعليمة تُحرك البرنامج للأمام أو للخلف عددًا مُحددًا من الأسطر. يُعد هذا الأمر مهمًا في Zgrass لأن أرقام الأسطر كانت اختيارية، وقد تستخدم وحدات ماكرو مختلفة نفس التسميات. على سبيل المثال، LOOPSTARTمن المُحتمل وجود بعض الاختلافات في العديد من أجزاء التعليمات البرمجية، مما GOTO LOOPSTARTقد يؤدي إلى تضارب في الأسماء. SKIPوقد تجنب استخدام هذه التعليمات هذا الاحتمال.

تماشيًا مع غرضها الأصلي كلغة رسومية، تضمنت لغة Zgrass العديد من الأوامر للرسم البسيط. كان نظام إحداثيات Zgrass يحتوي على نقطة واحدة لكل بكسل في وضع الدقة العالية لشريحة الرسومات من Nutting، مما يُنتج شبكة 320×202. كان جهاز Astrocade، بحكم تصميمه، لا يدعم سوى وضع الدقة المنخفضة للشريحة، وهو شاشة عرض 160×101. لتجنب مشاكل التعيين المحتملة، وُضعت نقطة الصفر في مركز الشاشة. كانت المواقع من -160 إلى 160 صالحة على المحور X، ومن -101 إلى 101 صالحة على المحور Y. في جهاز Astrocade، استُخدمت المواقع الموجبة فقط، بينما في جهاز UV-1، كان النطاق بأكمله متاحًا.

أضافت Zgrass مجموعةً شبه كاملة من وظائف المصفوفات، نظرًا لاستخدامها الواسع في الرسومات. وشمل ذلك إمكانية "التقاط" أجزاء من الشاشة في مصفوفة كصورة نقطية ، والتي يمكن معالجتها كأي عنصر رسومي آخر. وقد مكّن هذا Zgrass من تضمين وظائف شبيهة بالرسوم المتحركة ثنائية الأبعاد في اللغة، وهو أمر لم يكن متوفرًا بشكل مباشر في جهاز Nutting. ومن الميزات الأخرى التي لم يتضمنها Astrocade القدرة على معالجة المصفوفات بسرعة معقولة، لذا احتوى جهاز UV-1 على وحدة معالجة الفاصلة العائمة ( FPU) من Zilog لتحسين الأداء.

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

تضمنت Zgrass أيضًا سلسلة من الأوامر التي "غطت" نظام CP/M، مما سمح بالوصول إلى القرص دون الحاجة إلى الخروج إلى موجه الأوامر. كان بإمكانك بسهولة حفظ وحدات الماكرو في ملفات مُسماة، وتحميلها بنفس الطريقة، مما يسمح لك بإنشاء برامج عن طريق تحميل وحدات ماكرو مختلفة من القرص في برنامج واحد كبير. كما كانت الأوامر تُنشئ تلقائيًا نسخة احتياطية من كل عملية حفظ. تم دعم ميزات مماثلة لتخزين أشرطة الكاسيت ، ولكن الغريب أن الصيغة لم تكن متوازية: كانت أوامر القرص تبدأ بـ D-شيء ما، مثل DPUT، بينما لم تكن أوامر الشريط تبدأ بـ T-شيء ما، مثل TPUT، بل كانت تبدأ بـ شيء ما-شريط، مثل PUTTAPE.

مع البرامج المُنشأة من وحدات مُختارة عشوائيًا، احتاجت لغة Zgrass إلى تحكم أفضل في متغيراتها مقارنةً بلغة BASIC. في BASIC، جميع المتغيرات "عامة"، لذا إذا استخدمت روتينتان فرعيتان المتغير `x` I، الذي يُستخدم عادةً كمتغير فهرس حلقة، فقد تُغيّران قيم بعضهما البعض، مما يؤدي إلى مشاكل يصعب تصحيحها. في Zgrass، قد يجد المبرمج الذي يُحمّل وحدتين أن كلتيهما تُستخدمان Iكعداد حلقة، مما قد يُسبب مشاكل. لمعالجة هذه المشكلة، اعتبرت Zgrass المتغيرات المُسماة بأحرف صغيرة محليةً فقط لتلك الوحدة، لذا Iكان i`x` و`x` متغيرين مختلفين، عام ومحلي على التوالي. الغريب أن الأمثلة المُرفقة مع اللغة لا تستخدم هذه الميزة على نطاق واسع، مما قد يُربك المبرمجين الجدد الذين قد لا يكونون على دراية بوجودها.

مثال

SINCURVE = [ PROMPT "ما هي الإزاحة؟" INPUT OFFSET x = -160 angle = 0 POINT OFFSET + x , SIN ( angle ) * 80 , 3 angle = angle + 2 IF ( x = x + 1 ) < 159 , SKIP -2 ]

يُنشئ هذا النص ماكرو جديدًا يُسمى SINCURVE SINCURVE، والذي يمكن استدعاؤه ببساطة عن طريق كتابته SINCURVEفي موجه الأوامر، أو من ماكروات أو برامج أخرى. يستخدم SINCURVE متغيرين محليين، هما x و angle ، بالإضافة إلى متغير عام يُسمى OFFSET .

يُعدّ الرمز PROMPT/ INPUTتعديلًا على لغة BASIC الأصلية، INPUTحيث لا يطلب إدخالًا إذا قام المستخدم بكتابته في سطر الأوامر عند استدعاء الماكرو. في هذه الحالة، SINCURVEستؤدي الكتابة إلى ظهور موجه الأوامر وانتظار البرنامج للإدخال، بينما SINCURVE 30ستتجاوز الكتابة موجه الأوامر وسيتم تعيين قيمة OFFSET تلقائيًا إلى 30. يتيح هذا استخدام ماكرو واحد بشكل تفاعلي وداخل البرنامج كدالة.

POINTيُعد هذا مثالًا على أحد أوامر الرسومات العديدة المُضمنة في لغة Zgrass. POINTيتطلب الأمر تحديد موقعي X وY، بالإضافة إلى لون. في هذا المثال، OFFSETيُحرك المُدخل من المستخدم موضع المنحنى على الشاشة (x)، بينما يُحدد موضع Y بواسطة دالة حسابية ، مُكبّرةً بشكل مناسب للعرض (في هذه الحالة، 80 ضعفًا). يُحدد اللون في المُدخل الأخير، وهو 3 في هذه الحالة. كان جهاز UV-1 يستخدم سجلات الألوان، لذا لم يكن الرقم 3 يُشير إلى لون مُحدد، بل إلى لون مُختار من لوحة الألوان الحالية.

وهذا IFالأمر جدير بالذكر أيضاً. فهو يضع زيادة، (x=x+1)، قبل الاختبار، وهي ميزة غير متوفرة عادةً في لغة BASIC. في هذه الحالة، يُطلب من عبارة IF استدعاء الدالة SKIP -2إذا كانت القيمة صحيحة، مما سيؤدي إلى الرجوع سطرين للخلف، ويمكن استخدامها بدلاً من GOTO، حيث لا يوجد رقم سطر مستهدف.

ملحوظات

مراجع

الاقتباسات

فهرس