مترجم مبدأ به مبدأ
کامپایلر مبدا به مبدا یا مترجم مبدا به مبدا، مترجمی است که کد یک برنامه را به عنوان ورودی میگیرد و کد همان برنامه را به یک زبان برنامهنویسی دیگر به عنوان خروجی به ما برمیگرداند. تفاوت مترجمهای مبدا به مبدا با مترجمهای سنتی در این است که مترجمهای مبدا به مبدا عملیات ترجمه را بین دو زبان برنامهنویسی همسطح انجام میدهند، اما مترجمهای سنتی یک زبان سطح بالا را به یک زبان سطح پایین تبدیل میکنند. برای مثال، یک مترجم مبدا به مبدا برنامهای را از زبان پاسکال به سی تبدیل میکند. یک کامپایلر موازیساز خودکار به صورت مداوم یک برنامۀ سطح بالا را به عنوان ورودی میگیرد و در کنار تبدیل کد، آن را با یادداشتهای کد موازی (مثل OpenMP) یا ساختارهای زبان (مثل دستور forall در فورترن) حاشیهنویسی میکند.
هدف دیگر از ترجمۀ مبدا به مبدا، ترجمۀ کد به ارث رسیده برای استفاده از نسخۀ بعدی زبان برنامهنویسی زمینه یا یک API (رابط برنامهنویسی نرمافزار) که با نسخههای قبل سازگار نیست، میباشد. همینطور به صورت خودکار تغییرات داخلی را روی برنامهها اعمال میکند که مزیتی برای برنامههایی است که مفسر اصلی، کنترلی روی آنها ندارد (برای مثال تبدیل کد یک برنامه از پایتون 2 به پایتون 3 یا تبدیل یک برنامه از API قدیمی به API جدید) یا وقتی سایز برنامه، تغییر کد به صورت دستی را زمانبر و غیر عملی میکند.
کامپایلرهای مبدا به مبدا ممکن است کد تبدیل شده را بسیار شبیه کد اولیه حفظ کنند (به منظور راحتی توسعه و خطایابی کد اولیه)، یا ممکن است ساختار کد را به صورتی تغییر دهند که کد ترجمه شده هیچ شباهتی به کد اولیه نداشته باشد.
تاریخچه
یکی از اولین برنامهها از این دست، به تحقیقات دیجیتال XLT86 در سال 1981 برمیگردد. برنامهای که به وسیلۀ گری کیلدال نوشتهشدهبود و کد .ASM برای پردازندۀ اینتل 8080 را به کد .A86 برای اینتل 8086 تبدیل میکرد.
یک برنامۀ مشابه اما با پیچیدگی کمتر، TRANS.COM به عنوان قسمتی از 86-DOS نوشته شده توسط تیم پاترسون در سال 1980 است. این برنامه میتوانست کد Z80 اسمبلی را به کد .ASM برای برای 8086 ترجمه کند، اما فقط از قسمتی از شناسندهها، ثباتها و حالات را پشتیبانی میکرد و به اصلاحات دستی بعد از ترجمه نیاز داشت. همینطور بهینهسازی و ثبت را انجام نمیداد.