ترجمة ثنائية

في الحوسبة، الترجمة الثنائية (أو إعادة التجميع (الثنائية)) هي محاكاة تنفيذ مجموعة تعليمات ما باستخدام مجموعة تعليمات أخرى عبر ترجمة الكود الثنائي من مجموعة التعليمات الأولى إلى الثانية، حيث تتم ترجمة سلاسل التعليمات من مجموعة التعليمات المصدر (من اللغة الثنائية المصدرية) إلى مجموعة التعليمات الهدف.[1][2][3] في بعض الحالات، مثل محاكاة مجموعات التعليمات، يمكن أن تكون مجموعة التعليمات الهدف هي نفسها مجموعة التعليمات المصدرية، وذلك لتوفير مزايا تفيد في الاختبار والتنقيح مثل تتبع التعليمات، ونقاط التوقف الشرطية وأيضاً اكتشاف المناطق الساخنة (hot spots).

هناك نوعين أساسيين للترجمة الثنائية: الترجمة الثنائية الستاتيكية والترجمة الثنائية الديناميكية. يمكن تنفيذ الترجمة عبر عتاد خاص (عبر دارات خاصة في وحدة المعالجة المركزية على سبيل المثال) أو برمجياً (مثل بيئات التنفيذ، المحاكيات). 

الدوافع 

عدل

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

الترجمة الثنائية الستاتيكية

عدل

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

الترجمة الثنائية الديناميكية

عدل

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

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

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

طالع أيضا

عدل

مراجع

عدل
  1. ^ notaz (1 مارس 2014). "ia32rtools/". غيت هاب. مؤرشف من الأصل في 2018-06-11. اطلع عليه بتاريخ 2015-01-09.
  2. ^ Hughes، Rob (20 يناير 2000). "Transmeta's Crusoe Microprocessor". geek.com. مؤرشف من الأصل في 2007-09-27.
  3. ^ Kærlev، Mathias (14 أبريل 2014). "Practical and Portable X86 Recompilation". مؤرشف من الأصل في 2017-12-19. اطلع عليه بتاريخ 2014-08-08. but then the idea of somehow using the original x86 machine code presented itself. However, for our open server, we need to support x86-64 as well, and in that case, we absolutely need emulation or recompilation. [...] Static recompilation to assembler seemed like a much better option, but to keep it portable, we would need to write backends for x86, x86-64, and possibly ARM/PowerPC.