كومودور بيسك
المحتويات

بدايةً، كومودور بيسيك(تُعرف كذلك باسم PET BASIC أو CBM-BASIC)، هي إحدى لهجات لغة البرمجة بيسيك التي صُممت لسلسلة الحواسيب المنزلية بـ 8 بت من إنتاج شركة كومودور إنترناشيونال، والتي امتدت إصداراتها من جهاز كومودور بي إي تي – PET (عام 1977) وحتى جهاز كومودور 128 (عام 1985). وفيما يلي تفاصيل أوسع عن ذلك.
كذلك، تطابقت النسخة الأولى لبرنامج كومودور بي بي تي (PET) إلى حد كبير مع تطبيق مايكروسوفت الأصلي باستثناء بعض التحسينات الطفيفة. وعلى المنوال نفسه، جاء إصدار BASIC 2.0 المدمج في جهاز كومودور 64 – C64، والذي اعتُمد كذلك في أجهزة كومودور 128 – C128 (عند تشغيله في وضع محاكاة C64) وطرازات أخرى تالية. في المقابل، زودت أجهزة PET اللاحقة بنسخة BASIC 4.0، والتي حافظت على البنية الأساسية للإصدار الأول لكنها تميزت بإضافة حزمة من الأوامر المخصصة للتعامل مع قرص مرن.
وفي هذا الصدد، شكلت نسخة BASIC 3.5 أول تحديث جوهري في مسار هذه اللغة؛ حيث عُزِّزت بحزمة أوامر جديدة تدعم الرسوميات والصوت، إلى جانب تضمين مُجمِّع مصغر مدمج في شاشة عرض لغة الآلة على جهازي كومودور 16 – C16 و كومودور بلس/4 – Plus/4. وعقِب ذلك، أُرفق إصدار BASIC 7.0 مع حاسوب كومودور 128، مستعيناً بالأوامر المهيكلة المستوحاة من نسخة BASIC 3.5 الخاصة بجهاز Plus/4، إلى جانب تزويده بمُحرر للرسوميات المتحركة وكلمات مفتاحية مخصصة للاستفادة الكاملة من قدرات الجهاز المتقدمة. أما الإصدار الأخير BASIC 10.0، فكان مخصصاً لجهاز كومودور 65 الذي ألغي إنتاجه ولم يُطرح تجارياً في الأسواق.
ومن ناحية أخرى، يستند هذا النظام الأساسي إلى لغة مايكروسوفت بيسيك 6502؛ مما يجعله يتشارك في الكثير من السمات مع لغات بيسيك 6502 المعاصرة له في تلك الفترة، ومن أبرزها أبلسوفت بيسيك. وقد نجحت شركة كومودور إنترناشيونال|كومودورفي الاستحواذ على ترخيص لغة بيسيك من شركة مايكروسوفت عام 1977، وذلك وفق اتفاقية "الدفع لمرة واحدة دون رسوم ملكية تالية"؛ وجاء هذا الاتفاق بعد أن رفض جاك تراميل عرضاً قدّمه بيل غيتس يقضي بدفع 3 دولارات أمريكية عن كل وحدة مبيعة، حيث علّق تراميل قائلاً: «أنا متزوج بالفعل»، مؤكداً أنه لن يدفع ما يزيد عن 25,000 دولار أمريكي كقيمة إجمالية لترخيص دائم .
تحرير البرامج
ومن ناحية أخرى، تفتقر حواسب كومودور بي إي تي إلى خاصية نقل البرامج ديناميكياً، إذ يلتزم أمر LOAD بالتحميل المباشر بحسب عنوان الذاكرة المخزن في أول بايتين من الملف. هذا التصميم أدى إلى خلل عند تبادل ملفات لغة بيسيك المكتوبة على حواسب كومودور الطرازات الأخرى، حيث تستقر تلك الملفات في عناوين مرتفعة لا يمكن للمفسر الأصلي لجهاز PET التعرف عليها، مما استدعى ابتكار برمجيات وسيطة لإعادة ترحيل الكود إلى النطاق السليم. وتزداد هذه المشكلة تعقيداً مع البرامج المنتجة عبر عائلة كومودور سي بي إم؛ إذ إن المعالجة الافتراضية لبيسيك في تلك العائلة تبدأ من النقطة صفر ($0)، ما يعني أن محاولة فتحها على حاسوب PET ستجبر المعالج على الكتابة في صفحة صفرية الحساسة للنظام، مسببةً تجميد الجهاز (Crash). لذا، يصبح المسار الوحيد لتشغيلها هو تعديل البايتين الأوليين مسبقاً عبر محررات القطاعات.
علاوةً على ذلك، كانت طريقة تجزئة الكود هذه تعاني من خللٍ يتمثل في أنه عند إضافة عبارة REM (عبارة BASIC لإضافة تعليق إلى الكود) متبوعةً بـ {Shift-L} ، عند محاولة عرض قائمة البرنامج، كان مُفسِّر BASIC يُوقف القائمة فورًا، ويعرض SYNTAX ERROR ( ? ، ثم يعود إلى READY. وقد استغلّ المبرمجون هذا الخلل إلى حدٍّ ما لحماية أعمالهم، على الرغم من سهولة تجاوزه.
في هذا الإطار، بفضل اختصار الكلمات المفتاحية، أصبح من الممكن كتابة المزيد من التعليمات البرمجية في سطر واحد (والذي قد يشغل سطرين على شاشات العرض ذات 40 عمودًا - مثل C64 أو PET، أو أربعة أسطر على شاشة VIC-20 ذات 22 عمودًا). سمح هذا بتوفير طفيف في المساحة الإضافية اللازمة لتخزين أسطر البرنامج الإضافية، لا أكثر. كانت جميع أوامر BASIC تُجزأ إلى رموز وتشغل بايتًا واحدًا (أو اثنين، في حالة عدة أوامر من BASIC 7 أو BASIC 10) في الذاكرة بغض النظر عن طريقة إدخالها. كانت هذه الأسطر الطويلة تُشكل عائقًا عند التحرير. يعرض الأمر LIST الكلمة المفتاحية للأمر بالكامل، مما يُطيل سطر البرنامج إلى ما بعد سطري الشاشة أو الأربعة التي يمكن إدخالها في ذاكرة البرنامج.
من جانب آخر، عند تنفيذ أمر LOAD متبوعاً بالمعامل الاختياري 1 (كخيار ثانٍ بعد رقم الجهاز)، يتم توجيه البرنامج ليُشحن في عنوان الذاكرة المكتوب داخل أول بايتين من الملف نفسه، مع تجاوز هذين البايتين وتطهيرهما من الذاكرة فور تحديد مسار التحميل. أما إذا استُغني عن هذا المعامل، فإن النظام ينقل البرنامج افتراضياً إلى نقطة انطلاق مساحة لغة بيسيك، والتي تتفاوت قيمتها الرقمية وتوزيعها التقني تِبعاً لنوع الجهاز. يُذكر كذلك أن نسخاً معينة من لغة كومودور بيسيك عُزِّزت بأوامر الإدخال والإخراج الثنائية BLOAD و**BSAVE**؛ محاكيةً بذلك الأسلوب المتبع في Applesoft BASIC لإدارة وتخزين الصور النقطية مباشرة عبر عناوين ذاكرة معينة ومخصصة.
وفي السياق ذاته، تتيح أنظمة كومودور اختصار الكلمات المفتاحية لـ BASIC عبر إدخال حرف غير مُزاح أولاً، متبوعاً بحرف مُزاح (باستخدام مفتاح Shift). يؤدي هذا الإجراء إلى ضبط البت الأعلى، مما يجعل المُفسِّر يتوقف عن القراءة ويحلل العبارة بناءً على جدول بحث؛ وهذا يعني قبول العبارة حتى موضع ضبط البت الأعلى كبديل لكتابة الأمر كاملاً. ومع ذلك، ونظراً لأن جميع كلمات BASIC الرئيسية تُخزَّن في الذاكرة كرموز أحادية البايت، فإن هذه الآلية كانت تسهيلاً لإدخال العبارات وليست تحسيناً للأداء.
من جانب آخر، في مجموعة الأحرف الافتراضية التي تدعم الأحرف الكبيرة فقط، تظهر الأحرف المُزاحة كرموز رسومية؛ فمثلًا، يمكن اختصار الأمر GOTO إلى G{Shift-O} (والذي يظهر على الشاشة بشكل G Γ). وتتكون غالبية هذه الاختصارات من حرفين، إلا أنها تكون أطول في بعض الحالات؛ حيث كان يحدث لبس بين الأوامر، مما يتطلب إدخال المزيد من الأحرف غير المُزاحة قبل الحرف المزاح، مثل اختصار GO{Shift-S} (والذي يظهر كـ GO♥) والمطلوب للأمر GOSUB.وفي المقابل، لم يكن لبعض الأوامر شكل مختصر إما لقصرها أو لتشابهها مع أوامر أخرى؛ ومثال ذلك الأمر INPUT الذي افتقر للاختصار بسبب تعارض تهجئته مع الكلمة المفتاحية المنفصلة #INPUT والتي تقع بالقرب من بداية جدول البحث الخاص بالكلمات المفتاحية. أما الأمر PRINT الأكثر استخداماً، فكان له اختصار أحادي شهير وهو علامة الاستفهام ?؛ كما هو متبع في أغلب لهجات مايكروسوفت بيسيك. ويُعد اختصار الأوامر بالاعتماد على الأحرف المزاحة ميزة فريدة تميزت بها لغة كومودور بيسيك دون غيرها.
ومن جهة أخرى، تميزت أنظمة كومودور بقدرتها الفائقة على حفظ الملفات المُسمّاة عبر أي وسيط تخزين، بما في ذلك أشرطة الكاسيت؛ وهي وسيلة تخزين شائعة تزامنت مع أجهزة كومودور بي إي تي وظلت مُستعملة طوال عهد حواسب كومودور ذات معمارية 8 بت كخيار اقتصادي منخفض التكلفة للتخزين الجماعي. وفي حين اقتصر دعم أسماء الملفات في أغلب الأنظمة المعاصرة على قرص مرن فقط—مما عقّد عملية حفظ ملفات متعددة على الوسائط الأخرى وأجبر مستعمليها على تدوين قراءات عدّاد جهاز التسجيل يدوياً لتحديد موقع الملف بطريقة غير دقيقة وعرضة للخطأ—أتاح جهاز PET (عبر إصدار BASIC 2.0) استدعاء الملفات من الكاسيت بالاسم مباشرة؛ حيث يقوم النظام بفحص البيانات تسلسلياً ويتجاهل أي ملف لا يتطابق اسمه مع الطلب. وعلاوة على ذلك، حظي نظام الملفات ببنية سجلات قوية تدعم عمليات التحميل والحفظ، كما اعتمد تسجيل البيانات في أشرطة كومودور على الطريقة الرقمية بدلاً من التقنيات التناظرية الأقل تكلفة وموثوقية التي اتبعها المنافسون؛ مما تطلب استخدام جهاز كومودور داتاسيت المتخصص بدلاً من المسجلات القياسية. ورغم توفر محولات هجينة تدعم التحويل من التناظري إلى الرقمي لتشغيل المسجلات العادية، إلا أن فارق تكلفتها كان ضئيلاً مقارنة باقتناء جهاز Datasette الأصلي.
علاوةً على ذلك، تمثلت إحدى المزايا المريحة لمُفسِّر لغة BASIC المقيم في ذاكرة القراءة فقط ونواة نظام التشغيل (نواة كومودور) في أجهزة كومودور، في وجود محرر الشاشة الكاملة . وبالرغم من أن لوحات مفاتيح كومودور لم تكن تحتوي إلا على مفتاحي مؤشر (أسهم) ينعكس اتجاههما عند الضغط على مفتاح العالي (Shift)، إلا أن محرر الشاشة كان يتيح للمستعملين إدخال الأوامر المباشرة، أو كتابة أسطر البرنامج وتعديلها من أي موضع على الشاشة؛ فإذا كان السطر مسبوقاً برقم، يجري تفسيره وتخزينه في ذاكرة البرنامج، أما الأسطر التي لا تبدأ برقم فيتم تنفيذها مباشرة بمجرد وضع المؤشر عليها والضغط على مفتاح الإدخال (Return/Enter). وقد شكّل هذا الأسلوب قفزة نوعية في واجهات إدخال البرمجيات مقارنة بلغات بيسيك الشائعة في الحواسب المنزلية آنذاك، والتي كانت تعتمد عادة على محررات الأسطر (Line Editors) عبر أمر EDIT منفصل، أو ميزة "مؤشر النسخ" التي تقتطع السطر عند موضع المؤشر.
تاريخ
كذلك، اعتمدت شركة كومودور إنترناشيونال على الشفرة المصدرية للغة بيسيك ذات الرسوم الثابتة، وتولت تطويرها داخلياً لتدعم كافة حواسبها المنزلية الأخرى ذات معمارية 8 بت. ولم يُدرج إشعار حقوق الطبع والنشر الخاص بشركة مايكروسوفت علناً إلا مع إطلاق جهاز كومودور 128 (الذي ضمّ إصدار BASIC 7.0). ورغم ذلك، كانت مايكروسوفت قد زرعت ميزة خفية (بيضة فصح (برمجيات)) في برمجيتها لإثبات ملكيتها للمصدر؛ فند كتابة الأمر WAIT 6502,1 على أجهزة كومودور بي إي تي المزودة بإصدار BASIC 2.0 أو نسخ الترقية، تطبع الشاشة كلمة !MICROSOFT في أعلاها. وقد تميزت هذه الميزة بذكاء تصميمها وتعميتها العالية، بحيث لم تظهر العبارة في أي عملية هندسة عكسية (Disassembly) للمُفسِّر المصدري.
وفي هذا الصدد، زُوِّد حاسوب كومودور 64 الشهير بإصدار لغة BASIC 2.0 المدمج في ذاكرة القراءة فقط (ROM)، على الرغم من إطلاقه في الأسواق بعد سلسلة أجهزة كومودور بي إي تي – PET/CBM التي كانت تعمل بالإصدار الأحدث BASIC 4.0. ويعود السبب في ذلك إلى طبيعة تصميم جهاز كومودور 64 المخصصة للاستخدام المنزلي، في حين استهدفت عائلة أجهزة PET القطاعات التجارية والتعليمية التي تتطلب استخداماً مكثفاً للغة البرمجة المدمجة. علاوة على ذلك، ساهم هذا الاختيار في خفض تكاليف الإنتاج والتصنيع، نظراً لأن الإصدار الثاني كان يلائم شرائح الذاكرة (ROM) ذات السعات التخزينية الأصغر حجمًا.
BASIC 10.0
ومن جهة أخرى، c65manual.txt Commodore 65 preliminary documentation (March 1991), with addendum for ROM version 910501.
BASIC 2.0
علاوةً على ذلك، Angerhausen et al. (1983). The Anatomy of the Commodore 64 (for the full reference, see the C64 article).
نسخ غير منشورة
بدلاً من
من جهة ثانية، الإصدار 3.6 (نموذج أولي غير مُصدر). مطابقة على وجه التقريب للإصدار V7.0، مع الاختلافات التالية:
بدلاً من
استخدم كواجهة مستخدم
إضافةً إلى ذلك، في جهاز كومودور 64، كان عرض دليل الملفات على القرص يتم بطريقة غريبة؛ حيث يتعين على المستعمل تحميل دليل القرص كأنه "برنامج بيسيك" عبر الأمر LOAD "$",8. وعند استعراضه عبر أمر LIST، يظهر الدليل على الشاشة في قالب برنامج بيسيك مُحاكي، حيث يُعرض حجم كتلة الملف (Blocks) مكان "رقم السطر"، واسم الملف بين علامتي اقتباس مكان "التعليمات البرمجية". وكان لهذه العملية ضريبة تقنية قاسية، إذ تؤدي فوراً إلى الكتابة فوق البرنامج المخزن في الوقت الحالي في الذاكرة ومسحه بالكامل.
من جانب آخر، وللتغلب على هذه المعضلة وتفادي فقدان الأكواد أثناء العمل، ظهرت برمجيات وإضافات أنظمة تشغيل شهيرة مثل DOS Wedge (فضلًا عن خرطوشات التوسعة مثل The Final Cartridge III أو Action Replay). قامت هذه الأدوات بحقن أوامر ومختصرات جديدة في مفسر البيسيك (مثل استخدام رمز @$ أو >$)، مما سمح للمطورين بعرض قائمة دليل القرص مباشرة على شاشة الجهاز كأمر فوري ونظيف، دون المساس بالبرنامج المفتوح في الذاكرة أو التأثير عليه.
مثال على التعليمات البرمجية
ومن ناحية أخرى، بينما تضمنت بعض الإصدارات المتقدمة من لغة كومودور بيسيك (مثل BASIC 3.5 و 7.0) أوامر مخصصة للتعامل مع الأقراص مثل DLOAD و DSAVE، افتقر الإصدار BASIC 2.0 المُدمج في جهاز كومودور 64 (C64) إليها تماماً. هذا النقص استلزم من المستعمل تحديد رقم جهاز محرك الأقراص يدوياً (والذي يكون عادةً 8 أو 9) عند استخدام أمر LOAD القياسي، كأن يكتب المبرمج LOAD "PROGRAM",8؛ لأن الأمر بدون تحديد رقم الجهاز كان يُشير افتراضياً إلى مسجل الشريط المغناطيسي (Datassette) برقم 1.
في هذا الإطار، ومن بين أبرز أوجه القصور الأخرى في لغة بيسيك 2.0 الخاصة بجهاز كومودور 64، الغياب التام لأمر DIRECTORY أو CATALOG لعرض محتويات وملفات القرص المرن دون مسح الذاكرة الرئيسية للبرنامج الحالي (RAM).
ومن جهة أخرى، على غرار أجهزة الكمبيوتر المنزلية الأخرى، كانت أجهزة كومودور تبدأ التشغيل مباشرةً بمفسر لغة BASIC. وكان بالإمكان إدخال أوامر ملفات BASIC وأوامر البرمجة في لتحميل البرامج وتنفيذها. وفي حال إيقاف تنفيذ البرنامج باستخدام مفتاح التشغيل/الإيقاف، تُحفظ قيم المتغيرات في ذاكرة الوصول العشوائي (RAM) ويمكن طباعتها لأغراض تصحيح الأخطاء. بل إن جهاز 128 خصص بنك الذاكرة الثاني بسعة 64 كيلوبايت لتخزين المتغيرات، مما يسمح ببقاء القيم حتى إصدار أمر NEW أو RUN . هذا، فضلًا عن محرر الشاشة المتقدم المضمن في كومودور BASIC، منح بيئة البرمجة تجربة شبيهة ببيئة REPL ؛ حيث كان بإمكان المبرمجين إدراج أسطر البرنامج وتعديلها في أي مكان على الشاشة، وبناء البرنامج بشكل تفاعلي. وهذا على عكس أنظمة التشغيل الموجهة للأعمال في ذلك الوقت مثل CP/M أو MS-DOS ، والتي كانت تبدأ التشغيل عادةً بواجهة سطر الأوامر . وإذا كانت لغة برمجة مطلوبة على هذه المنصات، كان لا بد من تحميلها بشكل منفصل.
أوامر غير موجودة
- أمر إضافي:
- V10 (نموذج أولي غير مُصدر)
- أوامر الرسومات/الفيديو:
- إدخال الماوس :
- ملف نصي ( أداة التسلسل ):
- تحرير البرنامج:
- إدارة الذاكرة:
- الأوامر غير المُنفذة:
حزم التوسعة البارزة
- (VIC-20؛ يتم تسليمه على خرطوشة ROM ) (كومودور)
- Super Expander 64 (C64؛ خرطوشة) (كومودور)
- لغة سيمونز بيسك (C64؛ خرطوشة) (كومودور)
- رسومات بيسك (C64؛ قرص مرن) ( هيسوير )
- BASIC 8 (C128؛ قرص مرن وشريحة ذاكرة قراءة فقط داخلية اختيارية) ( Walrusoft )
- فيجن بيسك (C64؛ قرص مرن) (دينيس أوزبورن)
- جيفي دوس (التصاميم الإبداعية الصغيرة)
- المصادر
البدائل
من جانب آخر، صدرت الكثير من إضافات لغة BASIC لجهاز Commodore 64، نظرًا للإمكانيات المحدودة نسبيًا للغة BASIC 2.0 الأصلية. ومن أشهر هذه الإضافات إضافة DOS Wedge ، التي كانت مُضمنة في قرص الاختبار/العرض التوضيحي لجهاز Commodore 1541. أضافت هذه الإضافة، التي يبلغ حجمها 1 كيلوبايت، عددًا من الأوامر المتعلقة بالقرص، بما في ذلك إمكانية قراءة دليل القرص دون حذف البرنامج الموجود في الذاكرة. دُمجت ميزاتها لاحقًا في إضافات أخرى من جهات خارجية، مثل خرطوشة Epyx FastLoad الشهيرة. كما أضافت إضافات أخرى للغة BASIC كلمات مفتاحية إضافية لتسهيل برمجة الرسوميات المتحركة والصوت والرسومات عالية الدقة، مثل Simons' BASIC (1983) وVision BASIC (2022).
ومن جهة أخرى، كما افتقرت إصدارات BASIC السابقة من Commodore إلى أوامر تصحيح الأخطاء المدمجة (Debugging)، مما يجعل تتبع مسار التنفيذ واكتشاف الأخطاء أو حصر المتغيرات غير المستعملة أمراً صعباً للغاية ويتطلب جهداً يدوياً؛ لذا أضيفت في النسخ المتقدمة أوامر مخصصة للتتبع مثل TRON و TROFF (لتشغيل وإطفاء وضع التتبع).
كذلك، هذا التوجه دفع المبرمجين إلى فهم البنية الهندسية للمعالج الدقيق 6502 بشكل أعمق، وكيفية التعامل مع الذاكرة وسجلات النظام بشكل مباشر، مما أدى في النهاية إلى ظهور جيل متمكن من مطوري الألعاب والبرمجيات المتقدمة الذين استغلوا كامل قدرات الجهاز الكامنة، والتي لم يكن بمقدور مفسر BASIC التقليدي إخراجها.
وعلى صعيد آخر، أدت قيود لغة BASIC 2.0 على جهاز C64 إلى استخدام لغة الآلة ROM المدمجة في BASIC. لتحميل ملف إلى موقع ذاكرة محدد، يتم قراءة اسم الملف ومحرك الأقراص ورقم الجهاز من خلال استدعاء: ; ويتم تحديد الموقع في سجلات X وY: ; ويتم استدعاء روتين التحميل: .
وفي هذا الصدد، فضلًا عن ذلك، تُعامل جميع المتغيرات كمتغيرات عامة. يصعب إنشاء حلقات تكرار محددة بوضوح تتجاوز بنية FOR...NEXT، مما يدفع المبرمج غالبًا إلى الاعتماد على... أمر (تم تصحيح هذا لاحقًا في BASIC 3.5 بإضافة ، و أوامر ). غالبًا ما كانت هناك حاجة لإنشاء متغيرات العلامات لتنفيذ مهام معينة.
ومن جهة أخرى، على الرغم من أن افتقار لغة BASIC 2.0 إلى ميزات الصوت أو الرسومات المدمجة كان محبطاً للعديد من المستعملين (حيث كان يتطلب استخدام أوامر معقدة مثل POKE و PEEK للتحكم في رقاقة الصوت SID أو رقاقة الرسوميات VIC)، إلا أن بعض النقاد والمطورين جادلوا بأن هذا النقص كان مفيداً في نهاية المطاف؛ لأنه أجبر المستعملين وهواة البرمجة على تعلم لغة الآلة (Machine Language) ولغة التجميع (Assembly).
ومن ناحية أخرى، من وجهة نظر البرمجة الحديثة، مثّلت الإصدارات الأولى من لغة كومودور بيسيك والنسخ المعاصرة لها الكثير من مآزق البرمجة السيئة للمبرمج. وبما أن أغلب هذه المشكلات نابعة في الأصل من لغة مايكروسوفت بيسيك (MS BASIC) الأم، فقد عانت جميع برامج بيسيك المنزلية على وجه التقريب في ذلك الوقت من أوجه قصور هيكلية مماثلة. كان المبرمج مُلزماً بتعيين رقم لكل سطر في البرنامج؛ وكان من الممارسات الشائعة زيادة الأرقام بمقدار معين (مثل 5 أو 10 أو 100) لترك مساحات رقمية فارغة تُسهل إدراج أسطر جديدة لاحقاً أثناء تحرير البرنامج أو تصحيحه. ومع ذلك، فإن سوء التخطيط أو التوسع غير المتوقع في الكود كان يعني أن إدراج أجزاء كبيرة في البرنامج غالباً ما يستهلك تلك الفراغات الرقمية المتاحة، مما يتطلب إعادة هيكلة ترقيم الكود بالكامل يدوياً (أو الاعتماد على أدوات خارجية لإعادة الترقيم Renumbering).وللتغلب على هذا القيد، ابتكر المبرمجون تقنيات معمارية خاصة؛ كان من أبرزها بدء البرنامج من أرقام أسطر منخفضة جداً تحتوي على جدول قفز (Jump Table) مكون من عبارات GOSUB أو GOTO. ومن خلال هذا الجدول، يتم تقسيم جسم البرنامج الأساسي إلى أقسام ووحدات منطقية تبدأ عند أرقام أسطر رئيسية متباعدة ومحددة سلفاً (مثل 1000، 2000، 3000، وهكذا). وإذا استدعت الحاجة إضافة قسم برمي كبير أو وظيفة جديدة بالكامل، لم يكن المبرمج بحاجة لحشرها بين الأسطر المزدحمة، بل كان يقوم ببساطة بتعيين رقم السطر الرئيسي التالي المتاح لها (مثل 4000) وكتابة الكود هناك، ثم إدراجه كخيار إضافي داخل جدول القفز الرئيسي في بداية البرنامج. حمت هذه الآلية المطورين من معضلة نفاد أرقام الأسطر وحافظت على حد أدنى من التنظيم التقني في عصر "كود السباغيتي".
وفي هذا الصدد، تضمنت الإصدارات اللاحقة من لغة BASIC على أجهزة Commodore وغيرها من المنصات أمر RENUMBER (إعادة الترقيم)، والذي يتضمن القدرة على إعادة ترقيم أسطر البرنامج بالكامل وتحديث كافة مراجع القفز (مثل عبارات GOTO و GOSUB) تلقائياً لتتوافق مع الترقيم الجديد، إلى جانب أمر ترقيم الأسطر التلقائي AUTO الذي يقوم تلقائياً بتوليد وإدراج أرقام الأسطر للمبرمج أثناء الكتابة بحسب زيادة (Increment) محددة سلفاً.
وفي هذا الصدد، كانت مجلة الأقراص الخاصة بجهاز C64، Loadstar ، بمثابة مكان للمبرمجين الهواة، الذين شاركوا مجموعات من الأوامر الأولية للغة BASIC، والتي يتم استدعاؤها باستخدام . [ مطلوب مصدر ]
أداء
وفي السياق ذاته، من السمات الفريدة للغة كومودور بيسيك استخدام رموز التحكم لتنفيذ مهام مثل مسح الشاشة أو تحديد موضع المؤشر داخل البرنامج؛ ويمكن استدعاء هذه الرموز إما عن طريق إصدار الأمر PRINT CHR$(X) حيث يمثل X رمز التحكم المراد إصداره (مثلًا، PRINT CHR$(147) هو رمز التحكم لمسح الشاشة)، أو بالضغط على المفتاح المعني بين علامتي اقتباس، وبالتالي فإن الضغط على مفتاح مسح الشاشة بعد علامة الاقتباس سيؤدي إلى عرض BASIC للتمثيل المرئي لرمز التحكم (في هذه الحالة، حرف قلب مقلوب)، والذي يتم تنفيذه عند تشغيل البرنامج (طباعة رموز التحكم مباشرة تستعمل ذاكرة أقل وتُنفذ بشكل أسرع من استدعاء دالة CHR$). هذا بالمقارنة مع تطبيقات BASIC الأخرى التي تحتوي عادةً على أوامر مخصصة لمسح الشاشة أو تحريك المؤشر.
ومن ناحية أخرى، اشتهرت لغة BASIC 2.0 ببطء عملية جمع البيانات المهملة (Garbage Collection) للسلاسل النصية. ويتم استدعاء عملية جمع البيانات المهملة تلقائياً في كل مرة تمتلئ فيها المساحة المخصصة للسلاسل النصية في الذاكرة أو عند تنفيذ دالة FRE؛ وإذا كان هناك الكثير من متغيرات السلاسل النصية والمصفوفات التي تم التلاعب بها خلال البرنامج، فقد يستغرق مسح الذاكرة وإعادة تنظيمها أكثر من ساعة في أسوأ الظروف (حيث يقوم المفسر بفحص كل سلسلة نصية ومقارنتها مراراً وتكراراً بنظام البحث المتداخل).
كذلك، لم يكن ترتيب تنفيذ أسطر لغة كومودور بيسيك مُحددًا بترقيم الأسطر، بل كان يتبع ترتيب ارتباطها في الذاكرة. كانت أسطر البرنامج تُخزن في الذاكرة كقائمة مرتبطة أحادية، تحتوي على مؤشر (يحتوي على عنوان بداية سطر البرنامج التالي)، ورقم السطر، ثم الكود المرمز للسطر.
في هذا الإطار، يدعم نظام كومودور بيسك كذلك عوامل التشغيل الثنائية (ثنائية البايت، ذات الإشارة، المتمم الثنائي ) ، ، و . على الرغم من أن هذه الميزة كانت جزءًا من كود Microsoft 6502 BASIC الأساسي، إلا أنها عادة ما يتم حذفها في تطبيقات أخرى مثل Applesoft BASIC .
ومن ناحية أخرى، بما أن أجهزة كومودور ذات 8 بت (باستثناء جهاز C128) لا يمكنها تشغيل برامج الأقراص تلقائياً، فإن الأسلوب المعتاد المتبع هو تضمين برنامج BASIC صغير في بداية الملف (مثل 10 SYS 2048) لبدء تنفيذ كود لغة الآلة.
كذلك، وقد قدمت لغة BASIC 4.0 نظاماً مُحسناً وذكياً لجمع البيانات المهملة باستخدام مؤشرات الرجوع (Back-pointers)، مما قلل وقت المعالجة من ساعات إلى أجزاء من الثانية، وتتضمن جميع الإصدارات اللاحقة من Commodore BASIC هذا النظام المُطور كذلك.
ومن جهة أخرى، بما أن توليد الأرقام العشوائية الحقيقية أمر مستحيل مع بيان ، من الشائع في C64 و C128 استخدام قناة الضوضاء البيضاء لشريحة SID للأرقام العشوائية.
من جهة ثانية، كان تنسيق الأرقام الأصلي في لغة كومودور بيسيك، كما هو الحال في لغتها الأم مايكروسوفت بيسيك (MS BASIC)، هو نظام الفاصلة العائمة (Floating-point). واستعملت أغلب تطبيقات بيسيك المعاصرة آنذاك بايتًا واحدًا للأس (Exponent) وثلاثة بايتات للكسر العشري (Mantissa). وتبلغ دقة عدد الفاصلة العائمة باستخدام كسر عشري من ثلاثة بايتات نحو 6.5 خانات عشرية فقط، مع كثرة أخطاء التقريب.
ومن ناحية أخرى، يمكن أن يصل طول سطر البرنامج إلى 80 حرفاً في أغلب الأجهزة، ولكن في الأجهزة ذات 40 عموداً للنص، كان السطر يلتف إلى السطر التالي على الشاشة. أما في جهاز VIC-20، الذي كان مزوداً بشاشة عرض من 22 عموداً، فقد كان بإمكان سطر البرنامج أن يشغل أربعة أسطر شاشة. رفع إصدار BASIC 7.0 على جهاز Commodore 128 الحد الأقصى لسطر البرنامج إلى 160 حرفاً (أربعة أسطر من 40 عموداً أو سطرين من 80 عموداً).
علاوةً على ذلك، ال عانت دالة في لغة BASIC 2.0 من عيب تقني آخر يتمثل في عدم قدرتها على التعامل مع الأعداد الموقعة التي تزيد عن 32768، وبالتالي، إذا تم استدعاء الدالة على جهاز C64 (ذاكرة BASIC تبلغ 38 كيلوبايت)، فسيتم عرض قيمة سالبة للذاكرة الحرة المتاحة (إضافة 65535 إلى الرقم المُبلغ عنه ستُعطي القيمة الصحيحة للذاكرة الحرة). لم تتجاوز الذاكرة الإجمالية المتاحة للغة BASIC في جهازي PET وVIC-20 32 كيلوبايت، لذا لم يظهر هذا القيد إلا بعد تطوير جهاز C64. قامت وظيفة في لغة BASIC 3.5 و 7.0 بتصحيح هذه المشكلة و تم كذلك "تقسيم" في BASIC 7.0 إلى وظيفتين، إحداهما لعرض ذاكرة نص برنامج BASIC الحرة والأخرى لعرض ذاكرة المتغيرات الحرة.
من جانب آخر، يتم تعيين متغيرين نظاميين لها في لغة BASIC؛ حيث يحتوي كل من TI و TI$ على الوقت الحالي. المتغير TI هو متغير للقراءة فقط ولا يمكن تعديله؛ وسيؤدي القيام بذلك إلى ظهور رسالة خطأ في بناء الجملة (?SYNTAX ERROR). في المقابل، يمكن استخدام المتغير TI$ لعرض أو ضبط الوقت عبر سلسلة نصية مكونة من ستة أرقام بصيغة "ساعات دقائق ثوانٍ" (ويحدث خطأ في بناء الجملة عند استخدام سلسلة غير مكونة من ستة أرقام).
من جانب آخر، ويجب تعريف المصفوفات الأكبر حجماً مسبقاً، وإلا سيُظهر مفسر BASIC خطأً (مثل ?BAD SUBSCRIPT ERROR) عند تشغيل البرنامج. ولا يمكن تغيير أبعاد المصفوفة أو إعادة تعريفها داخل البرنامج إلا بعد مسح جميع المتغيرات والمصفوفات من الذاكرة تماماً باستخدام عبارة CLR، وإلا واجه المستعمل خطأ إعادة التعريف (?REDIM'D ERROR). تُملأ المصفوفات الرقمية تلقائياً بالأصفار عند إنشائها، وقد يحدث تأخير مؤقت في تنفيذ البرنامج إذا تم تحديد أبعاد مصفوفة كبيرة بسبب الوقت الذي يستغرقه النظام في حجز وتصفير مساحة الذاكرة المطلوبة.
وفي هذا السياق، كما أنه من غير الممكن إيقاف عملية جمع البيانات المهملة أو مقاطعتها لأن لغة BASIC لا تفحص مفتاح التوقف (RUN/STOP) أثناء تنفيذ هذه العملية، مما يجعل الجهاز يبدو وكأنه متجمد تماماً.
في هذا الإطار، تحتوي لغة BASIC 3.5 والإصدارات الأحدث على أوامر مناسبة لمسح الشاشة وتحريك المؤشر.
وفي هذا الصدد، بينما كانت تطبيقات 8080/Z80 من Microsoft BASIC تدعم متغيرات الدقة الصحيحة والمزدوجة، كانت تطبيقات 6502 تعتمد على الفاصلة العائمة فقط.
وعلى صعيد آخر، لا تتطلب سطور البرنامج في لغة كومودور بيسيك مسافات في أي مكان (ولكن يعرض أمر LIST دائماً مسافة واحدة بين رقم السطر والعبارة، مثلًا، 100 IFA=5THENPRINT"YES":GOTO160)، وكان من الشائع كتابة البرامج بدون مسافات. أُضيفت هذه الميزة لتوفير الذاكرة لأن مُجزئ الكلمات لا يُزيل أي مسافة مُدرجة بين الكلمات الرئيسية: وجود المسافات يُؤدي إلى استهلاك إضافي للذاكرة؛ حيث يتم استهلاك بايت واحد عن كل مسافة في البرنامج المُجزأ أثناء التنفيذ. ويقوم المُجزئ بإزالة المسافات بين رقم السطر وعبارة البرنامج.
علاوةً على ذلك، وفي المقابل، استعملت تطبيقات مايكروسوفت بيسيك الموجهة لمعالجات 6502 حسابات الفاصلة العائمة ذات 40 بت؛ مما يعني أن المتغيرات كانت تشغل خمسة بايتات للتخزين (أربعة بايتات للكسر العشري وبايت واحد للأس)، على عكس تنسيق الفاصلة العائمة ذات 32 بت الموجود في نسخة بيسيك-80 (BASIC-80).
وفي هذا السياق، يمكن أن تتراوح أرقام الأسطر من 0 إلى 65520، وتستهلك خمسة بايتات للتخزين بغض النظر عن عدد الأرقام في رقم السطر (حيث يستغرق رقم السطر بايتين دائماً في القائمة المرتبطة، فضلًا عن المؤشر وبايت نهاية السطر)، مع العلم أن التنفيذ يكون أسرع كلما قل عدد الأرقام عند البحث عن الأسطر. كما أن وضع عدة تعليمات في سطر واحد (باستخدام النقطتين الرأسيتين :) يقلل من استهلاك الذاكرة ويسرع التنفيذ، لأنه يقلل من عدد المؤشرات وأرقام الأسطر المخزنة في الذاكرة ويختصر وقت المفسر في الانتقال بين الأسطر.
إضافةً إلى ذلك، تقوم عبارة SYS تلقائياً بتحميل سجلات وحدة المعالجة المركزية (CPU Registers) بالقيم الموجودة في مواقع الذاكرة من 780 إلى 783 لجهاز كومودور 64 (والتي تختلف عناوينها على الأجهزة الأخرى)؛ حيث يمكن استخدام هذه الآلية لتمرير البيانات إلى إجراءات لغة الآلة، أو كوسيلة لاستدعاء وظائف النواة (KERNAL) مباشرة من لغة BASIC (مثلًا: تنفيذ السطر POKE 780,147:SYS 65490 يقوم بوضع رمز مسح الشاشة في السجل ثم استدعاء روتين النواة المسؤول عن الطباعة ليمسح الشاشة فوراً).
إضافةً إلى ذلك، وعندما كانت السرعة أمراً حاسماً، قام بعض المبرمجين بتحويل أجزاء من برامج BASIC إلى لغة التجميع 6502 أو 6510، والتي تُحمَّل بشكل منفصل من ملف أو تُدرج في الذاكرة عبر عبارات DATA في نهاية برنامج BASIC، ثم تُنفَّذ من BASIC باستخدام الأمر SYS، إما من الوضع المباشر أو من البرنامج نفسه. وعندما تكون سرعة تنفيذ لغة الآلة كبيرة جداً، كما هو الحال في الألعاب أو عند انتظار إدخال المستعمل، يمكن للمبرمجين الاستقصاء عن طريق قراءة مواقع ذاكرة محددة (باستخدام الأمر PEEK، مثل قراءة الموقع 198 لجهاز كومودور 64، أو الموقع 208 لجهاز كومودور 128، مما يشير إلى حجم قائمة انتظار لوحة المفاتيح) لتأخير أو إيقاف التنفيذ.
وفي السياق ذاته، على الرغم من أن لغة Commodore BASIC تدعم متغيرات الأعداد الصحيحة الموقعة (المشار إليها بعلامة النسبة المئوية) في النطاق − -32768 إلى 32767، إلا أنها تُستعمل عمليًا فقط لمتغيرات المصفوفات، وتتمثل وظيفتها في توفير الذاكرة عن طريق تحديد حجم كل عنصر من عناصر المصفوفة ببايتين (ستشغل مصفوفة من 2000 عنصر 10000 بايت إذا تم تعريفها كمصفوفة أعداد عشرية، ولكنها ستشغل 4000 بايت فقط إذا تم تعريفها كمصفوفة أعداد صحيحة). إن تعريف أي متغير كعدد صحيح يؤدي ببساطة إلى قيام BASIC بتحويله مرة أخرى إلى عدد عشري، مما يبطئ تنفيذ البرنامج ويهدر الذاكرة حيث أن كل علامة نسبة مئوية تستهلك بايتًا إضافيًا للتخزين (بما أن هذا ينطبق كذلك على مصفوفات الأعداد الصحيحة، يجب على المبرمج تجنب استخدامها إلا في حالة استخدام مصفوفات كبيرة جدًا تتجاوز الذاكرة المتاحة إذا تم تخزينها كعدد عشري). كما أنه من غير الممكن أو مواقع ذاكرة التي تزيد عن 32767 مع تعريف العنوان كعدد صحيح موقع.
من جانب آخر، على غرار مفسر لغة مايكروسوفت بيسيك الأصلي، فإن لغة كومودور بيسيك أبطأ من لغة الآلة الأصلية بسبب عبء الترجمة أثناء التشغيل. وقد أظهرت نتائج الاختبارات أن نسخ 16 كيلوبايت من ذاكرة القراءة فقط (ROM إلى ذاكرة الوصول العشوائي (RAM) يستغرق أقل من ثانية واحدة في لغة الآلة، مقارنةً بأكثر من دقيقة في لغة بيسيك. [ بحاجة لمصدر ]ولتحقيق سرعة تنفيذ أعلى، بدأ المبرمجون باستخدام تقنيات متنوعة لتسريع الأداء؛ إحداها هي تخزين قيم الفاصلة العائمة شائعة الاستخدام في متغيرات بدلاً من القيم الحرفية، لأن تفسير اسم المتغير كان أسرع من تفسير رقم حرفي. وبما أن الفاصلة العائمة هي النوع الافتراضي لكافة الأوامر، فإن استخدام أرقام الفاصلة العائمة كوسائط يُعد أسرع من استخدام الأعداد الصحيحة.
علاوةً على ذلك، يمكن استخدام النقطة (.) بدلاً من الرقم 0 (وبالتالي بدلاً من أو بدلاً من )، سيتم تنفيذ هذا بشكل أسرع قليلاً.
كذلك، ومع ذلك، من الممكن تشغيل البرنامج تلقائياً فور انتهائه من التحميل دون الحاجة لأن يكتب المستعمل أمر RUN. يتم تنفيذ هذه العبارة تلقائياً من خلال تضمين جزء من التعليمات البرمجية التي تقوم بتعديل أو "إقحام" (Hooking) موجّه أمر "جاهز" لـ BASIC (المعروف بـ BASIC READY Vector) والموجود عند عنوان الذاكرة $0302 (أو $0303)، ليتغير مسار التنفيذ ويتحول مباشرة إلى روتين التشغيل الخاص بالبرنامج بدلاً من العودة لوضع الإدخال المباشر.
علاوةً على ذلك، ستبحث عبارتا GOTO و GOSUB من السطر الحالي إلى الأسفل للعثور على رقم السطر في حال تنفيذ قفزة إلى الأمام (Forward jump)، أما في حال القفزة إلى الخلف (Backwards jump)، فستعودان إلى بداية البرنامج لبدء البحث من هناك. يؤدي هذا إلى إبطاء البرامج الكبيرة، لذا يُفضل وضع البرامج الفرعية (Subroutines) الشائعة الاستخدام بالقرب من بداية البرنامج.
وفي هذا الصدد، لا تُعدّ هذه الساعة طريقة موثوقة جداً لحفظ الوقت بدقة عالية؛ إذ تتوقف تماماً عن العد عند إيقاف المقاطعات (Interrupts) -وهو ما يتم بواسطة بعض إجراءات النواة (KERNAL routines)- كما أن عمليات الوصول إلى منفذ المسلسل السريع IEC (أو منفذ IEEE-488 على أجهزة PET) تؤدي إلى إبطاء تحديث الساعة وتأخرها ببضع نبضات.
وفي السياق ذاته، أسماء المتغيرات لا تتجاوز حرفين فقط؛ ومن هنا تأتي أسماء المتغيرات ، ، و تشير جميع الاختصارات إلى نفس المتغير.
ومن ناحية أخرى، باستخدام اختصارات مثل ? بدلاً من PRINT، يُمكن كتابة المزيد من الأوامر في سطر واحد. يعرض إصدار BASIC 7.0 رسالة الخطأ ?STRING TOO LONG إذا أدخل المستعمل سطر برنامج يزيد طوله عن 160 حرفاً. أما الإصدارات السابقة، فلم تكن تُظهر أي خطأ، بل كانت تعود لعرض رسالة READY بعد سطرين في حال تجاوز طول السطر الحد المسموح به. يُحتسب رقم السطر ضمن عدد الأحرف الإجمالي لسطر البرنامج، لذا فإن رقم سطر مكون من خمسة أرقام سيؤدي إلى السماح بأربعة أحرف أقل مقارنة برقم مكون من رقم واحد.
وفي هذا الصدد، تُمثل المتغيرات النصية بوضع علامة الدولار بجانب اسم المتغير. وبالتالي، فإن المتغيرات ، ، و يُفهم كل من على أنه قيمة مستقلة. كما تُعتبر متغيرات المصفوفة مختلفة عن المتغيرات البسيطة، وبالتالي و لا يشير إلى المتغير نفسه. يشير حجم مصفوفة السلاسل النصية إلى عدد السلاسل المخزنة فيها، وليس إلى حجم كل عنصر، والذي يُخصص ديناميكيًا. على عكس بعض تطبيقات Microsoft BASIC الأخرى، لا يتطلب Commodore BASIC حجز مساحة للسلاسل النصية عند بدء تشغيل البرنامج.
وفي هذا السياق، أضافت شركة كومودور عبارة SYS، المُستعملة لبدء برامج لغة الآلة، ولم تكن موجودة في كود مايكروسوفت بيسيك الأصلي، الذي كان يحتوي فقط على دالة USR لاستدعاء إجراءات لغة الآلة.
إضافةً إلى ذلك، ال تستعمل دالة في لغة Commodore BASIC الساعة لتوليد أرقام عشوائية؛ ويتم ذلك عن طريق ، إلا أن استخدامها محدود نسبيًا لأنها لا تُرجع إلا أرقامًا بين 0 و255. بخلاف ذلك، تعمل بنفس طريقة تطبيقات Microsoft BASIC الأخرى، حيث يتم استخدام تسلسل شبه عشوائي عبر قيمة بذرة ثابتة مكونة من 5 بايتات مخزنة في مواقع الذاكرة عند التشغيل. على جهاز C64 (يختلف الموقع على الأجهزة الأخرى). سيؤدي إدخال قيمة RND مع أي رقم أكبر من 0 إلى توليد رقم عشوائي مُدمج من القيمة المُضمنة في دالة وقيمة البذرة، والتي يتم تحديثها بمقدار 1 في كل مرة يتم فيها تنفيذ دالة RND. يؤدي استخدام RND مع رقم سالب إلى نقطة في تسلسل قيمة البذرة الحالية المحددة بواسطة الرقم.
ومن جهة أخرى، بخلاف أجهزة 8-بت الأخرى مثل Apple II، تحتوي جميع أجهزة Commodore على ساعة مدمجة يتم تهيئتها إلى الصفر عند التشغيل وتحديثها مع كل نبضة من مؤقت PIA/VIA/TED/CIA، أي 60 مرة في الثانية (أو 50 مرة في الأنظمة التي تعمل بنظام PAL).
وفي هذا السياق، كما هو الحال مع أغلب إصدارات Microsoft BASIC الأخرى، إذا لم يتم تعريف مصفوفة باستخدام عبارة DIM قبل استخدامها، يتم تعيين أبعاد المصفوفة تلقائياً إلى عشرة عناصر في كل بُعد (عملياً 11 عنصراً لأن عدّ عناصر المصفوفة يبدأ من الصفر، أي من 0 إلى 10).
من جانب آخر، أثناء كتابة البرنامج، كانت لغة بيسيك تُعيد ترتيب أسطر البرنامج في الذاكرة باستمرار بحيث تكون أرقام الأسطر والمؤشرات مرتبة تصاعدياً. ومع ذلك، بعد كتابة البرنامج، كان تغيير أرقام الأسطر والمؤشرات يدوياً باستخدام أوامر POKE يسمح بتنفيذ البرنامج خارج الترتيب، أو حتى إعطاء كل سطر نفس رقم السطر. وفي بدايات استخدام بيسيك تجارياً، كانت هذه التقنية تُستعمل كحيلة لحماية البرامج لمنع التعديل العشوائي عليها.
Commodore/Microsoft Basic version timeline
من جانب آخر، Bill Gates’ Personal Easter Eggs in 8 Bit BASIC, pagetable.com
BASIC 3.5
وفي هذا الصدد، Gerrard, Peter; Bergin, Kevin (1985). The Complete COMMODORE 16 ROM Disassembly. Gerald Duckworth & Co. Ltd. .
BASIC 7.0
إضافةً إلى ذلك، Jarvis, Dennis; Springer, Jim D. (1987). BASIC 7.0 Internals. Grand Rapids, Michigan: Abacus Software, Inc. .
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟