بلدي قليلا التبديلات: الثلاثي Brainfuck ، أو ما هو الجنون


الشكل 1: BrainfuckPC تتابع الكمبيوتر في خلفية مؤلفها

استمرارًا للتقليد المجيد المتمثل في الخلاصة السنوية لمشاريع الكمبيوتر الأكثر جنونًا ، أقدم إليكم المقالة الثالثة والأخيرة حول مشروع الكمبيوتر BrainfuckPC relay.

في السلسلة الماضية:


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

تحت القاطع ، يتم رنين كتل الترحيل ، وأسرع حسابات الترحيل في العالم ، والالتفافات ، ومؤشرات الفراغ ، وأكثر من ذلك بكثير.

لغة البرمجة Brainfuck


لغة برمجة brainfuck هي ربما لغة البرمجة الباطنية الأكثر شعبية في العالم. وفي الوقت نفسه فإن تورينج الحقيقي هو مستنقع كامل . 8 تعليمات فقط يمكنك من خلالها كتابة أي شيء ، ولكن لفترة طويلة جدًا.
على سبيل المثال ، استغرق الأمر ثلاثة أيام لكتابة وتصحيح برنامج تقسيم 355/113 ، الذي يطبع 6 منازل عشرية إلى المحطة.

الشكل 2: تعليمات لغة brainfuck

تم بناء جملة اللغة بالكامل حول ذاكرة الوصول العشوائي لـ 30 ألف خلية ذاكرة ، بسعة 8 بت.

  • باستخدام إثنين من الإرشادات + ، - نقوم بتغيير القيمة في خلية البيانات الحالية بمقدار واحد لأعلى أو لأسفل.
  • مع إرشادات اثنين < و > نقوم بتغيير المؤشر إلى خلية البيانات الحالية بواحد ، وبالتالي نتحرك إلى اليسار أو اليمين عبر الذاكرة.
  • تعلمتان أخريان [ و ] - تسمحان لنا بتنظيم الحلقات. كل شيء داخل الأقواس هو جسم الحلقة. حلقات المتداخلة المسموح بها. منطق التعليمة بسيط - إذا كانت قيمة خلية البيانات الحالية غير مساوية للصفر - سنقوم بإجراء تكرار واحد للحلقة ، إذا كانت متساوية ، فإننا نخرج من الحلقة.
  • التعليمات الأخيرة اثنين . و - - تتيح لك عرض قيمة الخلية الحالية في وحدة التحكم ، أو إدخال ذاكرة الوصول العشوائي الخاصة بها. وبالتالي يتم تحقيق التفاعل.

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

brainfuck ++


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


الشكل 3: تعليمات لغة brainfuck ++

من النظرية إلى الممارسة


كما فهمت ، لا يمكن للمرء أن يأخذ ويكتب بلغة brainfuck العملية Rb = Ra + Rb ، حيث Ra و Rb هما خلايا ذاكرة. كل ما يمكننا فعله هو تغيير محتويات الخلية إلى ثابت والتحقق مما إذا كانت صفرية. نتيجة لذلك ، لإضافة الرقمين ، كل ما تبقى لنا هو إجراء +1 لخلية Rb و -1 لخلية Ra ، حتى تصبح محتويات خلية Ra صفراً. نكتب هذا في شكل رمز في C:

/*(mem+RbPos) += *mem */ void addMov(Memory &mem, uint16_t RbPos) { while (*mem) { mem += RbPos; (*mem)++; mem -= RbPos; (*mem)--; } } 

نتيجة لذلك ، ستظهر القيمة القديمة في خلية RbPos بالإضافة إلى ما كانت عليه في عنوان المصدر. فئة الذاكرة - حاوية مع خلايا عدد صحيح 65 كيلو. الخاصية الرئيسية الخاصة به هي أن تجاوز قيمة المؤشر سيعيده إلى بداية الصفيف. كما هو الحال في أجهزتي الحقيقية.

عيب الوظيفة الموصوفة هو فقدان القيمة الأصلية - سيتم إعادة تعيينها إلى صفر. أضف متغير Rc آخر لحفظه:

 /* *(mem+RcPos) = *mem *(mem+RbPos) += *mem */ void addCpy(Memory &mem, uint16_t RbPos, uint16_t RcPos) { while (*mem) { mem += RbPos; (*mem)++; mem -= RbPos; (*mem)--; mem += RcPos; (*mem)++; mem -= RcPos; } } 

نتيجة لذلك ، يكمن المصطلح المنسوخ في خلية RcPos. حسنًا ، في حال كان هناك صفر.

نظرًا لأن التدوين الذي استخدمته يشبه إلى حد بعيد brainfuck ++ - نحن نعيد كتابة وظيفتنا بأحرف bfpp ، مع أخذ RbPos لـ 4 و RcPos لمدة 5 كمثال:

[
>>>>
+
<<<<
-
>>>>>
+
<<<<<
]

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

برنامج النقطة العائمة
 class Memory { public: Memory() { memset(m_mem, 0, sizeof(m_mem)); memPtr = 0; } Memory& operator += (uint16_t ptr) { memPtr += ptr; return *this; } Memory& operator -= (uint16_t ptr) { memPtr -= ptr; return *this; } uint16_t& operator [] (uint16_t ptr) { return this->m_mem[ptr]; } Memory& operator = (uint16_t ptr) { memPtr = ptr; return *this; } uint16_t & operator * () { return m_mem[memPtr]; } Memory& operator ++ () { memPtr++; return *this; } Memory& operator -- () { memPtr--; return *this; } private: uint16_t memPtr; uint16_t m_mem[65536]; }; void calcPi() { Memory mem; *mem = 22; mem += 1; *mem = 7; while (*mem) { mem += 1; (*mem)++; mem -= 1; (*mem)--; mem += 2; (*mem)++; mem -= 2; }//correct -909 while (*mem) { (*mem)--; } mem -= 1; while (*mem) { mem += 2; while (*mem) { mem += 4; (*mem)++; mem -= 4; (*mem)--; } mem += 4; while (*mem) { (*mem)--; mem -= 4; (*mem)++; mem -= 2; (*mem)--; if (!*mem) { //JZ out goto out; } mem += 6; } mem -= 6; out: mem += 6; if (*mem) { while (*mem) { mem -= 6; (*mem)++; mem += 6; (*mem)--; } mem -= 6; if (*mem) goto out1; } mem -= 5; (*mem)++; mem -= 1; } out1: mem += 10; *mem += 0x50;//P putc(*mem, stderr); *mem += 0x19;//i putc(*mem, stderr); *mem -= 0x2C;//= putc(*mem, stderr); mem -= 9; *mem += 0x30; putc(*mem, stderr); mem += 9; *mem -= 0xf; putc(*mem, stderr); mem -= 10; *mem += 6; while (*mem) { (*mem)--; mem += 1;//mem == 1 //nullCell(mem); while (*mem) { (*mem)--; } mem += 1; //mulConst(mem, 1, 10); while (*mem) { (*mem)--; mem -= 1; (*mem) += 10; mem += 1; } mem += 1; //addCpy(mem, 1, 2); while (*mem) { mem += 1; (*mem)++; mem -= 1; (*mem)--; mem += 2; (*mem)++; mem -= 2; } mem += 3; //nullCell(mem); while (*mem) { (*mem)--; } mem -= 5; while (*mem) { mem += 4; while (*mem) { mem += 6; (*mem)++; mem -= 6; (*mem)--; } mem += 6; while (*mem) { (*mem)--; mem -= 6; (*mem)++; mem -= 4; (*mem)--; if (!*mem)//,  ,      { goto out2; } mem += 10; } mem -= 10; out2: mem += 10; if (*mem) { //addMov(mem, -(6+ 4)); while (*mem) { mem -= 10; (*mem)++; mem += 10; (*mem)--; } mem -= 10; if (*mem) goto out3; } mem -= 5; (*mem)++; mem -= 5; } out3: mem += 4; while (*mem) { mem -= 3; (*mem)++; mem += 3; (*mem)--; } mem += 1;//mem == 6 *mem += 0x30; putc(*mem, stderr); mem += 1;//mem == 7 while (*mem) { (*mem)--; } mem -= 3; while (*mem) { mem -= 1; (*mem)++; mem += 1; (*mem)--; } mem -= 4;// mem == 0 } *mem += 0x0a; putc(*mem, stderr); *mem += 3; putc(*mem, stderr); } 


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


العنصر المركزي في معالج الترحيل هو أفعى كاملة 16 بت مع تحمل موازية. ترتبط اثنين من السجلات لذلك في المدخلات. TMP هو السجل المؤقت الذي يتم فيه وضع القيمة القديمة ، و CMD هو سجل الأوامر الذي يتم فيه تخزين التعليمات والثابت الذي سيتم به تغيير القيمة القديمة.

لذلك ، يمكنني إجراء عمليات ++ الأمثل ل brainfuck ، وفي نفس الوقت الحصول على القفزات الشرطية الكاملة - Jump If Zero و Jump If Not Zero إلى أي جانب من جوانب البرنامج.

يمكن تحميل نتيجة عملية الجمع إما إلى أحد سجلات السياق - AP - برقم خلية البيانات الحالية ، أو IP - برقم التعليمات الحالية. بالإضافة إلى ذلك ، يمكن تحميل النتيجة إلى خلية RAM الحالية ، إذا كان الأمر يتعلق بالتعليمات + و -


الشكل 4: ترحيل بنية الكمبيوتر قيد التشغيل. يتم استبدال مرحلة تحميل التعليمات الجديدة بمرحلة تنفيذها.

بادئ ذي بدء ، نحتاج إلى حساب عدد التعليمات التالية - أي إجراء عملية IP ++. للقيام بذلك ، تتم إضافة واحد إلى القيمة القديمة لسجل IP ، وتتم إعادة النتيجة إلى سجل IP ، ويتم تحميل التعليمة التالية على هذا العنوان الجديد ، في سجل CMD.

الخطوة الثانية هي تنفيذ التعليمات المحملة حديثا. إذا كان يعمل مع الأفعى ، فإن عملية تنفيذه تبدو مشابهة لعملية تحميل تعليمة جديدة - القيمة القديمة في السجل المؤقت ، نضيف الكذب الثابت في البتات السفلية من سجل CMD ، ونعيد كتابة النتيجة مرة أخرى إلى السجل أو إلى خلية البيانات الحالية.
وبالتالي ، يتم تنفيذ التعليمات في علامة واحدة من مولد الساعة. على واجهة الهبوط ، نقوم بتحميل التعليمة التالية ، على نحو متزايد - ننفذها.

ليس خطأ ، ولكن ميزة
وهنا تم الكشف عن ميزة واحدة. بعد تشغيل الكمبيوتر ، ستزداد الواجهة الأولى لمولد الساعة ، وبالتالي - سيتعين علينا تنفيذ التعليمات الحالية ، والتي لم يقم أي شخص بتحميلها في سجل CMD حتى الآن - هناك أصفار.

اتبع الإرشادات الفارغة و ... افعل IP ++!

نتيجة لذلك ، تحتوي خلية الذاكرة الصفرية للبرنامج على صفر ولن يتم تنفيذها أبدًا. التعليمة الأولى التي يتم تحميلها من الذاكرة هي التعليمات الموجودة على 0x0001.

مجموعة التعليمات



الشكل 5: مجموعة تعليمات الكمبيوتر الترحيل

تكون الإرشادات 16 بت ، حيث تكون البتات الأربعة ذات الترتيب العالي مسؤولة عن نوع التعليمات وتكون البتات ذات الترتيب المنخفض 12 بت هي الحمولة النافعة. في معظم الحالات ، هذا ثابت.

  • تعليمات NOP - تجاهلها.
  • تعليمة CTRLIO هي تعليمة خاصة يتم ترميز سلوكها بواسطة قناع البيانات النقطية للحمولة الفعلية. بادئ ذي بدء ، فإنه ينفذ أوامر الكتابة إلى وحدة التحكم والقراءة من وحدة التحكم (في أوضاع متزامن أو غير متزامن). ثانياً ، يسمح لك بتعيين وضع تشغيل 16 بت أو 8 بت للجهاز. وثالثا ، باستخدام تعليمات CTRLIO.HALT ، يمكنك إيقاف الجهاز. والشيء المضحك هو أن قناع البتات
    غير مانع. يمكنك ضبطها على الأقل مرة واحدة ، لكن سلوك الجهاز لن يكون محددًا.
  • تعليمات ADD هي عملية خلية بيانات. يغير القيمة في الخلية حسب قيمة الثابت. في هذه الحالة ، تكون البت 12 عبارة عن بت موقعة ويتم نسخها إلى البتات 13-15. لذلك ، تتحول التعليمات 0x2ffe إلى العملية * AP + = 0x0ffe ، ويتحول الأمر 0x3ffe إلى * AP + = 0xfffe. يتم استبدال عملية الطرح بإضافة بالإضافة إلى رقم سالب.
  • تعليمات ADA - تنفذ العملية AP + = const وتتيح لك التنقل خلال الذاكرة.
  • تعليمات JZ و JNZ مشروطة. اعتمادًا على علامة Z ، يمكنك إما القفز ببعض الإرشادات إلى الأمام أو الخلف أو البقاء في مكانك. اعتمادًا على وضع التشغيل الخاص بالجهاز - 16 أو 8 بت ، يتم تحديد حالة العلم Z إما من خلال بايت البيانات الأقل أهمية أو بالكلمة بأكملها.

المواصفات الفنية


BrainfuckPC هو كمبيوتر 16 بت مع معالج ترحيل القصب ، بنية Von Neumann ، ومجموعة تعليمات Brainfuck ++

  • إجمالي عدد التبديلات: 578 قطعة
  • إجمالي عدد عناصر المنطق: 157 قطعة
  • عنوان حافلة العرض: 16 بت
  • عنونة: كلمة كلمة
  • ذاكرة الوصول العشوائي: 128 كيلو بايت (64 كيلوف)
  • عرض ناقل البيانات: 16bit / 8bit
  • تردد الساعة (الحالي / الحد الأقصى): 25 هرتز / 40 هرتز
  • استهلاك الطاقة: 70W
  • الأبعاد الكلية: 110kh650kh140mm
  • الوزن: 15 كجم


في البداية ، كان من المفترض أن الكمبيوتر سوف يعمل على ترددات تصل إلى 100 هرتز ... وهذا - لمدة دقيقة - 4 أوكتافات البيانو. لسوء الحظ ، أظهرت الاختبارات الأولى أن 40 هرتز هو السقف ، ولكن هناك الكثير من هذا لدائرة الترحيل. لا سيما عندما يكون التوقيت الخارجي ضروريًا لتطبيق نبضتين في كل دورة - نظرًا لخصائص دائرة التزامن مع إشارة خارجية. 80Hz للموسيقى هو بالفعل شيء.

تكوين الكمبيوتر



الشكل 6: المكونات الرئيسية لجهاز الكمبيوتر المرحل.

دعنا نلقي نظرة فاحصة على الكمبيوتر. تقريبا يشغل كامل حجم الجهاز من قبل وحدات معالج الترحيل. في الوقت الحالي ، يتناسب كل شيء مع خمس كتل ، ولكن يوجد مساحة لستة - لذلك إذا كنت تريد ذلك حقًا ، فيمكن لاحقًا توسيع وظيفة المعالج.
تحتوي كل كتلة على 32 وحدة ، في كل وحدة يوجد 3 أو 4 مرحلات من القصب RES55 و RES64. امدادات الطاقة من كل وحدة هو 5V ، 3A.


الشكل 7: مجموعة من الكتل والوحدات النمطية لمعالج الترحيل ، جاهزة للتركيب على إطار.

كل وحدة موحدة. 60x44mm ، موصل ذو 16 سنًا. عند تجميع الكتل المنطقية ، قمت بإدخال الوحدة المطلوبة في فتحة مجانية وامضت الاتصالات.


الشكل 8: يتم فحص وحدات D-flip-flop بحثًا عن قابلية التشغيل.

الصف المركزي - كتل الأفعى وكتل التسجيل. يوجد فوقها وأسفلها المزالج ذات 16 بت استنادًا إلى RES43 ، والتي تحول تدفق البيانات بين الكتل. جميع البيانات تدور هنا.

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


الشكل 9: تم تجميع الإطار من لوح الألمنيوم 2 مم ، من تحت القطع بالليزر. في الصورة - إطار ملحوم بالفعل معبي ، جاهز للرسم.

الجزء العلوي هو مؤشر. على الجانب الأيسر توجد كتلة حالة الجهاز - تعرض المؤشرات المستندة إلى IV-6 عدد خلية الذاكرة الحالية وليل التعليمة الحالية ، والتعليم نفسه ، والعداد العام للتعليمات المنفذة. هذا الأخير مفيد للغاية ، لأنه إذا قال المحاكي ، على سبيل المثال ، إنه حتى أول حرف في وحدة التحكم تحتاج إلى تنفيذ 30 ألف تعليمات ، فإن العداد سيوضح بوضوح مكان الجهاز الآن ومتى سينتهي الحساب.


الشكل 10: العرض النهائي لمنطقة المؤشر. في عملية التصنيع.

على اليمين توجد بطاقة الذاكرة - العنصر الأكثر إثارة للجدل في الجهاز. على الرغم من أنني أعتقد أن الكمبيوتر لا يزال مرحلًا ، إلا أن المعالج هو بالتأكيد ترحيل بنسبة 100٪. المحيط أكثر حداثة. على وجه الخصوص ، RAM هي شريحة ذاكرة ثابتة. لكن كذلك يفعل كل المبدعين الجدد تقريبًا لأجهزة كمبيوتر الترحيل.


الشكل 11: مبرمج. 16 سطر عنوان ، 16 سطر بيانات ، قوة ، أرض ، وكتابة خطوط قراءة. مجموع 36 الاتصالات.

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

  1. قم بتنزيل البرنامج في ذاكرة الوصول العشوائي ، لأنه في كل مرة تقوم فيها بتشغيل الطاقة يدويًا باستخدام رموز تبديل التبديل ، يكون الكسل مبتذلًا ، على الرغم من وجود هذا الاحتمال.
  2. راقب حالة منطقة معينة من الذاكرة واعرضها على مصفوفة LED مقاس 32x16.

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


الشكل 12: مخطط كتلة للأجهزة الطرفية للمعالج.

لذلك في المستقبل القريب ستبدو الدوائر الطرفية للمعالج. ستبقى فقط رقائق الذاكرة ودارات مطابقة الإشارة مع دائرة الترحيل على لوحة الذاكرة.

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

نتيجة لذلك ، يوفر منطق الترحيل واجهة معينة ، ويمكن أن يكون محول الواجهة أي. بالمناسبة ، سيكون موصل الواجهة الموازية متوافقًا مع LPT ...

مظاهرة العمل والوضع الحالي


بادئ ذي بدء ، تم تنفيذ برنامج Hello World من مقالة wikipedia على الكمبيوتر.

شفرة المصدر هي كما يلي:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.

بفضل لوحة LED ، يمكنك أن ترى بوضوح كيف تتغير البيانات:


على الرغم من تردد 25 هرتز ، من الصعب تتبع ما يحدث في ذاكرة الوصول العشوائي.

تتمثل المهمة الأكثر فائدة والعملية في حساب علامات الرقم Pi بعد العلامة العشرية. من الواضح أن أجهزة الكمبيوتر الحديثة قد حلت هذه المشكلة حتى 31.4 تريليون حرف . ولكن حقيقة أن BrainfuckPC قادرة على إجراء هذه العملية تشير إلى أن جهاز الكمبيوتر المرحل ليس عديم الفائدة بنسبة 100 ٪ ، ولكن 99.9 فقط.

بادئ ذي بدء ، لقد وجدت خوارزمية حساب جاهزة مكتوبة في brainfuck .

> ++++ (4 digits)
[<+>>>>>>>>++++++++++<<<<<<<-]>+++++[<+++++++++>-]+>>>>>>+[<<+++[>>[-<]<[>]<-]>>
[>+>]<[<]>]>[[->>>>+<<<<]>>>+++>-]<[<<<<]<<<<<<<<+[->>>>>>>>>>>>[<+[->>>>+<<<<]>
>>>>]<<<<[>>>>>[<<<<+>>>>-]<<<<<-[<<++++++++++>>-]>>>[<<[<+<<+>>>-]<[>+<-]<++<<+
>>>>>>-]<<[-]<<-<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+<<<-[>>+<<-]<]<<<<+>>>>>>>
>[-]>[<<<+>>>-]<<++++++++++<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+>[<<+<+>>>-]<<<
<+<+>>[-[-[-[-[-[-[-[-[-<->[-<+<->>]]]]]]]]]]<[+++++[<<<++++++++<++++++++>>>>-]<
<<<+<->>>>[>+<<<+++++++++<->>>-]<<<<<[>>+<<-]+<[->-<]>[>>.<<<<[+.[-]]>>-]>[>>.<<
-]>[-]>[-]>>>[>>[<<<<<<<<+>>>>>>>>-]<<-]]>>[-]<<<[-]<<<<<<<<]++++++++++.

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


الشكل 13: الوقت المستغرق لإخراج أرقام N من Pi بعد العلامة العشرية.

4 منازل عشرية ستضطر إلى الانتظار لمدة ساعة ونصف تقريبًا ...


الشكل 14: - Pi = 3! - كم وقح!

ومع ذلك ، لم يكن باستطاعة شخصين فعليًا استنتاجهما ؛ وبدلاً من ذلك ، ذكر الكمبيوتر أن Pi كانت في الرابعة من عمرها وأنجزت المهمة.


الشكل 15: يعرف بوضوح النكتة التي بموجب الأحكام العرفية ، يمكن أن يصل pi إلى أربعة.

قررت الذهاب في الاتجاه الآخر وكتبت آلة حاسبة الكسر
 frac355113=3.141592.... دقة - 6 المنازل العشرية! هذه هي النتيجة الأكثر دقة للكسور مع أعداد من الحجم المناسب.

بعد ثلاث ليال بلا نوم ، كتبت برنامجًا على عقلك ، قادرًا على تقسيم رقمين إلى بعضهما البعض وإخراج النتيجة بنقطة عائمة إلى المحطة. حكم المحاكي على النحو التالي - سوف يستغرق 60 ألف تعليمات للتنفيذ. في الماضي ، 10 آلاف لكل علامة:


الشكل 16: الوقت المستغرق لإخراج المكان العشري التالي عند حساب الكسر.

كيف بسرعة سوف تظهر القيم التالية. يجب أن أقول بسرعة كبيرة مقارنة بالبرنامج السابق!

لكن السعادة لم تدم طويلًا - فقد بدأ الكمبيوتر يفشل في وضع 16 بت. أظهرت التشخيصات أن بطاقة الذاكرة تخدع - فهي تحدد باستمرار الرقم 13. سأقوم بإنشاء بطاقة ذاكرة جديدة وسوف يمر كل شيء ، لكن الآن سأقتصر على كسر بسيط  frac227=3.14...منزلين عشريين و 8 بت من وضع التشغيل. الأهم من ذلك ، أنه يتطلب فقط 1600 تعليمات ليتم اتباعها! بتردد 25 هرتز ، هذا ما يزيد قليلاً عن دقيقة واحدة.


مرارا وتكرارا مع صافرة ، الكمبيوتر يتواءم مع المهمة.

أن تستمر ...


الآن على الكمبيوتر ، يمكنك تشغيل البرامج التي لا تتطلب إدخال المستخدم. حتى الآن ، لم أقم بتعليمات CTRLIO.CIN بشكل تافه :) ولن أفعل ذلك في أي وقت قريب. الكمبيوتر حاليا 98 ٪ كاملة. وبعد عامين من العمل ، تراكمت العديد من المشاريع التي تنتظر اللحظة التي سأتعامل معها فيها.

لذلك ، أنا التحول إلى مشاريع أخرى


بادئ ذي بدء ، هذا هو جهاز كمبيوتر على أساس أنبوب ديكاترونات العاكس. لدي بالفعل كمة و ديكاترون أنفسهم (رغم أن معظمهم A101 - سوف يخرج الكمبيوتر أبطأ من التتابع عليهم - نحن بحاجة إلى A103). حتى 700 من أنابيب الفراغ متوفرة بالفعل وأكثر من ذلك بكثير ...



لقد أعددت ذاكرة له - 16 قطعة من مكعبات الذاكرة المدمجة لكل 128 كلمة 16 بت لكل منهما. داخل - لوحات الفريت متعددة الثقوب ، وهو نوع من فرع الذاكرة على حلقات الفريت.

أنا لا أنسى الالتهاب الرئوي أيضًا - صديقي أنتون متورط في الطبيعة. التجارب ، ولكن أكثر على ذلك في المرة القادمة.

... ترك العيوب التالية. سأحل جزءًا من مشكلة المهرجان في نهاية مايو ، جزء - لا:

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

الصورة

جميع الوثائق الموجودة على جهاز الكمبيوتر الخاص بالترحيل موجودة في المستودع على GitHub ، ويمكنك مراقبة حالتها على أي شبكة اجتماعية باستخدام الروابط في ملفي الشخصي.

محدث: لقد رفضت المشاركة في المهرجان.
ومع ذلك - في الفترة من 25 إلى 26 مايو ، في موسكو ، على أرض مصنع الخبز ، سيعقد أول مهرجان للمنتجات الحرفية وثقافة DIY Antifactory . سوف أكون حاضراً هناك مع جهاز كمبيوتر مرحل وسأحضر جهاز تحكم مرحلي للتلقين التلقائي أيضًا. الدخول إلى هذا الحدث مجاني ، لذلك ستكون في موسكو هذه الأيام - لا تفوت فرصة مشاهدة وحش الترحيل المباشر. إذا أحضرت له صوتًا آمنًا ، فسأثبت ذلك بالتأكيد في العمل.

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


All Articles