EFORTH for MK-161: هياكل البيانات

هذه المقالة هي نهاية سلسلة من المقالات على آلة حاسبة قابلة للبرمجة. ابدأ هنا .

تحتل أوامر لغة الإدخال "Electronics MK-161" نصف الملف eForth0.mkl فقط. النصف الثاني مشغول بجداول ، والتي لم تكن أقل صعوبة في تطويرها من كتابة الجزء الحسابي من المترجم. دعنا نحاول معرفة كيفية استخدام هذه الجداول.


يعلم البروفيسور ويرث أن "البرمجة الصغيرة" تتكون من تطوير عنصرين مهمين على قدم المساواة - الخوارزميات وهياكل البيانات.

لقد صادفنا بالفعل بنية بيانات واحدة. هذا هو نص VCA (الكلمات عالية المستوى) الموجود في ذاكرة البايت. يقوم أربعة معالجات بتفسير حقول المعلمات الخاصة بـ VCA الخاصة بهم بطرق مختلفة:

.DB DOVAR ;      .DB … ;      .DB DOCON ;    .DW _ ;   .DB DOCONM ;     .DW _ ;   .DB DOLST ;     .DW 1, 2,… EXITT ;   

يرتبط بنية البيانات البسيطة نسبياً التالية بـ TYPE "الرسائل القياسية". يتم ترقيم جميع رسائل eForth ونقلها إلى ذاكرة البرنامج الرخيصة. إذا كانت الكلمة TYPE تطبع حرفًا واحدًا ، فقد يكون رمزها هو رقم هذه الرسالة ، من 0 إلى 7.

 ;   TYPE .BASE tblTYPE: .DBB str7,str6, str5, str4, str3, str2, str1, str0 

في لغة MK الموسعة ، يعيّن الأمر الزائف .BASE "الأساس" للأمر .DBB ، والذي يضع تسلسلات إزاحة السطر str7 ، str6 ، بالبايت ، إلخ. بالنسبة إلى الملصق الأساسي tblTYPE. إضافة أرقام من 0 إلى 7 إلى عنوان الجدول ، يمكن قراءة هذا الإزاحة منه. إضافة الإزاحة التي تم العثور عليها إلى tblTYPE ، نحصل على عنوان السطر المطلوب.

يحتوي البايت الأول من السلسلة على طوله. eForth يستخدم على نطاق واسع من هذه الخطوط العد .

لقد صادفنا أيضًا جدول tblTokens ، الذي يسرد عناوين الشفرات لكل 208 كلمة مدمجة. إذا لم تكن الكلمة بدائية ، فسيحتوي الجدول على 0. سيؤدي الانتقال إلى العنوان 0 إلى إعادة تشغيل eForth مع صرير.

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

تحدثت أيضًا عن الجدول tblCHPUT ، وهو جدول تجميعي لأكواد التحكم عند عرض خطاب على شاشة الآلة الحاسبة. تقوم الجداول السبعة الأخرى ، من tblKeyNum إلى tblKeyRusF ، بترجمة رمز زر مضغوط في أوضاع لوحة مفاتيح مختلفة إلى رمز حرف 8 بت. يوجد عنوان الروتين الفرعي المسؤول عن وضع لوحة المفاتيح النشطة في السجل العشري ptrKbdInt.

في المجموع ، بقيت بنية بيانات واحدة فقط بدون تجميع في ملف eForth0.mkl ، وهذه هي جداول التعرف على الاسم. دعونا نتركها للحلوى (انظر 5) بعد الطبق الرئيسي - جدولان عنوانان مخزّنان في الذاكرة العشرية. أولاً ، سنزود أنفسنا بالأدوات اللازمة "لتلوين" هذه العناوين.

1. العمل مع العناوين: HEAD! و HEAD @


 HEAD! ( xt nfa r -- )     r,  xt  nfa. HEAD@ ( r -- xt nfa lex )     r,  xt, nfa  . 

يمكن أن يحفظ سجل عشري واحد MK-161 12 منزلة عشرية. يستخدم eForth هذا السجل لتخزين ثلاثة أرقام صغيرة ، كل منها من 0 إلى 9999. تسمى "الحقول" الثلاثة لتخزين هذه الأرقام A و B و C: AAAABBBBCCCC. تشير العلامة العشرية فقط إلى الحقل A.

يحصل HEAD @ primitive على رقم التسجيل ويقسم الرقم من هناك إلى الحقول ، ثم HEAD! يجمع الحقول برقم طويل ويكتب "الوحش" الناتج في السجل المحدد. ولكن هناك فروق دقيقة.

يحتوي "العنوان العشري" للكلمة في الحقل أ على عنوان اسمه (nfa). إذا كان هذا العنوان سالبًا ، فسيتم تخزين الاسم في ذاكرة البرنامج. يحتوي الحقل B على الرمز المميز للكلمة (xt). الحقل C يسمى المعجم. يخزن بت IMMEDIATE وإشارة إلى أن الكلمة مخصصة فقط للترجمة.

HEAD @ يقسم الرأس إلى أجزاء. في الجزء العلوي من الحزمة ، يوجد حقل المعجم C ، أسفله هو حقل الاسم أ. الحقل ب ، حيث يتم تخزين الرمز المميز عادةً ، هو في أسفله.

الرأس! إعادة تعيين الحقل C.

2. مضمنة العناوين




يتم ترتيب رؤوس كل كلمة من الكلمات 208 المضمنة (0 إلى 207) ، بدءًا من R44. يحتوي الحقل "أ" دائمًا على رقم سالب ، حيث يتم ترميز أسماء هذه الكلمات في ذاكرة البرنامج.

الحقول B و C قابلة للتحرير. لذلك ، يمكن للمستخدم إعادة تعريف الكلمات المضمنة وجعل الفوري الذي يحتاجونه منها (انظر 4).

3. عناوين المستخدم




العمل مع 208 أسماء محددة مسبقًا فقط يحفظ ذاكرة البايت ، ولكنه ممل بشكل غير عادي. لذلك ، قمت بتطوير بنية بيانات أخرى حيث يقتصر الخيال في اختيار اسم على 32 حرفًا فقط. يتكون هذا الهيكل من 32 قائمة ، كل منها مسؤول عن كلمات المستخدم بطول معين. كل من هذه القوائم 32 لديها عنوان شخصي. القوائم نفسها تقفز فوق الذاكرة العشرية ، ولكن يتم تخزين رؤوسها دائمًا في R301 ... R332.

فرز الكلمات حسب طول الاسم هو تسليط الضوء على 161eForth الهامة. يؤدي الفرز إلى تقليل عدد المقارنات بشكل كبير عند البحث عن كلمة باسمها ، مما يؤدي إلى تسريع عملية الترجمة. من يحتاج إلى وظائف التجزئة إذا كان لكل اسم طول معروف؟

للبساطة ، يحتوي عنوان القائمة على نفس البنية مع الحقول A و B و C مثل عنوان الكلمة. الغرض من هذه الحقول مختلف. يحتوي الحقل أ على رقم السجل الأول في القائمة. يحتوي الحقل B على عدد السجلات المقدمة إلى القائمة. يخزن الحقل C عدد الكلمات التي تكون عناوينها موجودة بالفعل في القائمة.

في بداية العمل ، تكون الحقول C تساوي الصفر ؛ الكلمات غائبة في جميع القوائم. الحقول B هي 2 ، ويتم إعطاء كل قائمة بضعة سجلات لتبدأ. تشير الحقول A إلى كتل من 2 سجلات تبدأ بـ R333.

كل قائمة تحتوي على عناوين الكلمات. لقد قمنا بالفعل بتفكيكها (انظر 1). هنا ، ربما ، سيكون عنوان الاسم (nfa) موجبًا ويشير إلى خط الحساب ، والذي يتم تخزينه تقليديًا أمام نص VCA. أيضًا ، الرمز المميز في الحقل B هو عنوان حقل الرمز (cfa) الذي ينتقل إلى الذاكرة الثنائية مباشرةً بعد هذا الاسم. هناك استثناء واحد - إذا تم تحديد الكلمة بالفعل ، فإن الحقل "أ" سيشير إلى الاسم القديم. لماذا تخزين السلسلة مرة أخرى؟ الذاكرة الثنائية مكلفة.

عندما تكون جميع سجلات القائمة ممتلئة (B = C) ، توفر الكلمة PUBLISH 5 أماكن مجانية أخرى ، مع دفع بنية البيانات هذه في المكان الصحيح وضبط الروابط (A) في رؤوس القائمة.

4. نشر كلمة جديدة: العمل والنشر


 LAST ( -- a )      . WORK ( -- a )     . PUBLISH ( -- )     . $,n ( nfa -- )     ,    nfa. ?UNIQUE ( a -- a )  ,    . 

اتضح أن بنية البيانات المطورة من أجل MK-161 لتخزين عناوين الكلمات عملية وعملية دمجها بسهولة في eForth. عندما تنشئ CREATE أو CONSTANT أو: كلمة جديدة ، فإنها تصل إلى كلمة النظام $ ، n لإنشاء عنوان للكلمة بالاسم المحدد. يشير $ ، n إلى "UNIQUE للتحقق - هل نقوم بإنشاء كلمة جديدة أو إعادة تعريف الكلمة القديمة؟

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

في أي حال ، يقوم $ ، n بإنشاء رأس جديد في متغير العمل - إنه سجل عشري يمكنه تخزين 12 بت من الرأس. إذا لم يتم العثور على الاسم ، فسيتم تضمينه في القاموس قبل حقل الرمز ، كما يحدث في 86eForth والعديد من Forts الأخرى. تمكنت MK-161 من الاستغناء عن "مجال الاتصال" ؛ وهذا يحفظ أيضًا الذاكرة الثنائية.

يقوم PUBLISH primitive بإكمال تعريف الكلمة. عند ترجمة الكلمات النقطية ، يتم استدعاء PUBLISH من ؛ ؛ ونتيجة لذلك ، لم يكن مطلوبًا SMUDGE bit. يتم تحديد المكان الذي يتم فيه نسخ الرأس من العمل بواسطة المتغير الأخير. إذا كان LAST صفرًا ، فسيتم إنشاء رأس جديد في القائمة المقابلة (انظر 3). هل القائمة كاملة؟ بعد ذلك ، ستضيف PUBLISH 5 سجلات أخرى ، أربعة منها للمستقبل.

بعد تشغيل PUBLISH ، يشير المتغير LAST دائمًا إلى عنوان الكلمة الأخيرة. هذا يساعد IMMEDIATE على القيام بعملها عن طريق تغيير مجال المعجم.

5. (FIND) وجداول التعرف على الاسم


 (FIND) ( a -- r T | a F )    r,        a. FIND ( a -- a F | xt 1 | xt -1)    .  1,  IMMEDIATE. 

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

في البداية (FIND) ، يجد في جدول tblLen عنوان الجدول النقابي الرئيسي ، حيث يتم "تحضير" الأسماء المعروفة للطول المطلوب. في هذا الجدول (FIND) يبحث عن الحرف الأول من الاسم. في معظم الحالات ، يتيح لك هذا على الفور معرفة رقم تسجيل العنوان للكلمة التي تم البحث عنها - بالحرف الأول والطول.

يحدث أن العديد من الكلمات من نفس الطول لها نفس الأحرف الأولى. ثم بدلاً من رقم التسجيل (FIND) ، يتعثر عنوان الجدول النقابي التالي (رقم القراءة هو 300 أو أكثر) ويستمر البحث في الحرف الثاني. وهكذا ، حتى يتم العثور على الكلمة أو ثبت أنه لا توجد مثل هذه الكلمة.

بالطبع ، بعد تطابق الحروف الأولى (FIND) ، يتم التحقق من الاسم بالكامل. لكن جداول الاعتراف جعلت سريعًا . في هذا الربيع ، استثمرت الكثير من وقتي فيها ، والآن يوفرون وقت البحث. يتم فرز "المفاتيح" فيها أبجديًا. آسف ، يبصقون MK-161 البرامج الثابتة على ذلك.

من أجل التوافق ، قمت بتنفيذ كلمة FIND من Fort ANS [4] ، والتي تثق في بدائية "العمل الأسود" (FIND). الكلمة تعتبر بالفعل؟ UNIQUE تبحث أيضًا عن وسيطة من خلال (FIND).

6. مترجم خارجي


يحتوي الكتاب [1] على وصف شامل لـ eForth ، بما في ذلك مترجم "نص" خارجي. هو الذي ينفذ أو يجمع النص المصدر بلغة الحصن. ظهرت اختلافات بين المترجمين النصيين لهجات فورت الأخرى ([2] ، [3]) على مدى العقود الماضية ، ولكن هناك القليل منها.

يوجد أدناه مخطط كتلة لمترجم نصي مأخوذ من [1]. كن حذرا - هذا "المترجم" لديه وضع تجميع! كلمة $ COMPILE هي المسؤولة عن تجميع نص Forte في "رمز مخيط" ، والتي قمنا بتنفيذها بالتفصيل في مثل هذه المقالة في المقالة الأولى. عند تنفيذ $ INTERPRET بدلاً من ذلك ، يتم تنفيذ الكلمات المدخلة فورًا - وضع التفسير. EVAL "يحسب" السلسلة بأكملها التي تم إدخالها ، مع استدعاء إحدى هاتين الكلمتين لكل كلمة تم إدخالها.



بعد مخطط الكتلة ، يقوم المؤلف بفك تشفير أي من الكتل يفعل. إليكم ترجمتها. عادةً ما تتطابق أسماء البلوك مع أسماء الكلمات الرابعة. كلمة اسم؟ غائب في عملي ، تم استبداله بنجاح بالسرعة (FIND) (انظر 5).

MAINإعداد محرك فورت الظاهري
COLDتهيئة متغيرات النظام
إحباطتدفق مكدس البيانات. خطأ معالج
QUITإعادة تعيين مكدس الإرجاع وأدخل حلقة المترجم
QUERYقبول إدخال النص من المحطة
EVALحساب أو تفسير سلسلة من النص
تحليلحدد كلمة من النص المدخل
تفسير $تفسير الكلمة
ترجمة $ترجمة كلمة
الاسم؟ابحث عن كلمة في القاموس
عدد؟تحويل سلسلة النص إلى عدد صحيح
EXECUTEتنفيذ كلمة
IMMED؟هل هذه الكلمة أمر فوري؟
حرفيتجميع الحرفي بأكمله
COMPILEترجمة رمزية


يوفر الكتاب أيضًا الكود المصدري لكل كلمة في نسخة Windows ، مع شرح موجز. ما هو إصدار MK-161 مختلفة ، قلت لك بالفعل. الكود المصدري للتنفيذ الخاص بي موجود في الأرشيف: the-hacker.ru/2019/161eforth0.5b.zip

أخيرًا ، سوف أذكر تنفيذ كلمة (PARSE) بلغة MK-161 - تحت Windows ، يكون VCA. استغرق تصحيح الأخطاء أسبوعًا ، لكنه سرع عملية التجميع بمقدار النصف . تقوم الكلمة (PARSE) بكل "العمل القذر" لـ PARSE لعزل الكلمات الفردية من دفق نص الإدخال.

الإضافات الخاصة بي إلى المترجم الخارجي عبارة عن كلمتين ، بالإضافة إلى دورة QUIT المعتادة: TLOAD المذكورة بالفعل والمأخوذة من الإصدارات القديمة من FILE. تترجم الكلمة FILE I / O إلى وحدة التحكم ، ولكنها تقرأ أسطرًا للترجمة الفورية من منفذ RS-232. بعد المعالجة الناجحة لكل سطر ، يتم إخراج حرف برمز 11 إلى المنفذ ، ويجب أن ينتهي الملف الذي تم تنزيله من الكمبيوتر بالكلمة QUIT.

لم أصحح كلمة FILE بعد. إذا كان أي شخص يحتاج إليها ، شارك انطباعاتك.

انتهت مراجعة 161eForth للبقع الضيقة ، لكن Fort هي أداة مرنة بشكل لا يصدق يمكن لكل مالك تخصيصه. حتى عندما تكون قد اكتشفت كل شيء بدقة ، فإن شخصًا ما في مكان ما على هذا الكوكب سيأتي بخدعة أخرى يمكن أن تفاجئك.

إليكم الكلمات الأخيرة للمؤلف من [1]:

منذ 26 عامًا ، أعيد كتابة العديد من المرات. في كل دبلجة ، حاولت جعلها أكثر بساطة ووضوحًا. الآن في الإصدار 86eForth v5.2 ، أعتقد أنني حققت الصحة وأنا سعيدة للغاية.

كما قال أينشتاين:
يجب أن يكون كل شيء بسيطًا بقدر الإمكان ، ولكن ليس أكثر بساطة.

جعل الإصدار 86eForth v5.2 أكثر سهولة ، وربما كسره أو عدم استخدامه كأداة برمجة.

أدب


  1. الدكتور تشن هانسون تينغ. eForth and Zen - الإصدار الثالث ، 2017. متوفر على Amazon Kindle.
  2. بارانوف إس إن ، نوزدرونوف ن. لغة الحصن وتنفيذه. - لام: الهندسة الميكانيكية. لينينغراد. القسم ، 1988.
  3. سيمينوف يو البرمجة بلغة FORT. - م: الراديو والاتصالات ، 1991.
  4. الجواب الرابع X3.215-1994. الترجمة .
  5. SP-Forth الوثائق .
  6. Offete Enterprises (Dr. Chen-Hanson Ting) ، مؤلف كتاب 86eForth v5.2 ، باللغة الإنجليزية.
  7. قصة ميخائيل بوخوف "الحقيقة الحقيقية" مع برنامج "Moonwalker-1" ، حيث حصلت على KDPV وأحب الآلات الحاسبة السوفيتية.

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


All Articles