الدرس 4 من 8
آلة صغيرة: فكّ الترميز
- 15 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
تعليمات بأطوال مختلفة
الشرح
من هنا تبني أدوات التحليل بنفسك على آلة صغيرة اخترعناها لهذه المنطقة. والآلة الافتراضية (virtual machine) برنامج ينفّذ أوامر مرمَّزة بايتات اسمها البايتكود (bytecode)، كما تفعل Python نفسها مع كودك. وفهم آلة مخترَعة صغيرة أقصر طريق إلى فهم الحقيقية.
لآلتنا خانة واحدة اسمها المُراكِم (accumulator) تبدأ بصفر، وستّة أوامر. كل أمر بايت واحد هو رقم الأمر (opcode)، وأربعة منها يتبعها بايت آخر هو المُعامَل (operand). في كل سطر رقم الأمر، ثم اسمه، ثم imm إن كان يأخذ مُعامَلًا، ثم أثره مكتوبًا بلغة Python:
0x00 HALT break 0x01 LOAD imm acc = imm 0x02 ADD imm acc = (acc+imm) & 0xFF 0x03 XOR imm acc = acc ^ imm 0x04 SUB imm acc = (acc-imm) & 0xFF 0x05 OUT out.append(acc)
فالبرنامج 01 48 05 00 يُقرأ هكذا: الأمر LOAD بمُعامَل 0x48، ثم OUT، ثم HALT. أي أن البايت 48 ليس أمرًا بل مُعامَل الأمر الذي قبله. وهذه أهمّ فكرة في فكّ الترميز (decoding): طول التعليمة يختلف، فلا تعرف أين تبدأ التعليمة التالية حتى تعرف طول الحالية.
لذلك تمشي على البايتات بفهرس i: تقرأ الأمر في program[i]، فإن كان له مُعامَل قرأته من program[i + 1] وتقدّمت بايتين، وإلا تقدّمت بايتًا واحدًا. وحين تصل إلى HALT تتوقّف، فما بعده ليس تعليمات.
المطلوب
اكتب الدالة decode(program) التي تُرجع قائمة صفوف، صفًّا لكل تعليمة بالشكل (opcode, operand)، ويكون المُعامَل None للأمر الذي لا مُعامَل له. وتوقّف بعد HALT.
الفحوص
6 فحوص- أوّل تعليمة LOAD بمُعامَلها
- الأمر OUT بلا مُعامَل
- القائمة كاملة بخمس تعليمات
- تتوقّف عند HALT ولا تقرأ ما بعده
- على برنامج آخر لم تره
- المُعامَل لا يُقرأ أمرًا ولو شابه رقمه