سؤال

أحاول فهم الفرق العملي أثناء تنفيذ البرنامج في فك تشفير وإرسال التفسير والتفسير الخيوط.

مثال على كلاهما سيساعد حقًا.

أنا أفهم كيف تعمل Java Bytecode وكيف تعمل لغة التجميع. ولكن أين تناسب DDI و TI؟

سياق: الأجهزة الافتراضية: منصات متعددة الاستخدامات للأنظمة والعمليات

هل كانت مفيدة؟

المحلول

(ملاحظة: سأفترض أنه من خلال "فك الشفرة وإرسال" تقصد مترجمًا قائمًا على التبديل.)

الفرق بين المترجم المترجم والمترجم المترابط في وقت التشغيل هو ، في الأساس ، عدد القفزات التي يتم تنفيذها.

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

typedef enum {
  add, /* ... */
} instruction_t;

void interpret() {
  static instruction_t program[] = { add /* ... */ };
  instruction_t* pc = program;
  int* sp = ...; /* stack pointer */
  for (;;) {
    switch (*pc++) {
      case add:
        sp[1] += sp[0];
        sp++;
        break;
        /* ... other instructions */
    }
  }
}

في المترجم المترجمة الخيوط ، لا يكون رمز فك التشفير مركزيًا ، بل يتم تكراره في نهاية كل قطعة من الكود التي تتعامل مع التعليمات. هذا يعني أنه بمجرد تفسير التعليمات ، بدلاً من القفز مرة أخرى إلى رمز فك التشفير المركزي ، يقوم المترجم بفك تشفير التعليمات التالية ويقفز إليها على الفور. إن تنفيذ التعليمات البرمجية الخيطية بكفاءة في ANSI-C غير ممكن حقًا ، ولكن تمديد "GOTO" المحسوب من GCC يعمل بشكل جيد للغاية. فيما يلي نسخة ملولبة من المترجم السابق:

void interpret() {
  void* program[] = { &&l_add, /* ... */ };
  int* sp = ...;
  void** pc = program;
  goto **pc; /* jump to first instruction */
 l_add:
  sp[1] += sp[0];
  ++sp;
  goto **(++pc); /* jump to next instruction */
  /* ... other instructions */
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top