همگردان یا کامپایلر برنامه یا مجموعهای از برنامههای کامپیوتری است که متنی از زبان برنامه نویسی سطح بالا (زبان مبدا) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین، تبدیل میکند. خروجی این برنامه ممکن است برای پردازش شدن توسط برنامه دیگری مثل پیوند دهنده مناسب باشد یا فایل متنی باشد که انسان نیز بتواند آن را بخواند.
مهمترین علت استفاده از ترجمه کد مبدا، ایجاد برنامه اجرایی می باشد. برعکس برنامهای که زبان سطح پایین را به بالاتر تبدیل می کند را decompiler گوییم.
کامپیوترهای اولیه از کامپایلر استفاده نمی کردند، چرا که این کامپیوتر ها حافظه کوچکی و برنامههای کوتاهی داشتند. کاربران مجبور بودند کد باینری یا دسیمال برنامهها را به طور مستقیم و با کمک نوار های مغناطیسی به سیستم وارد کنند.
اما برنامه نویس ها زیاد این وضعیت را تحمل نکردند و به فکر تولید برنامهای افتادند که نویسه های الفبایی (واژه های اختصاری) را به تعدادی دستور که قابل اجرا توسط ماشین باشد تبدیل کند. در این وضعیت بود که زبان های اسمبلی و کامپایلر های اولیه با نام اسمبلر به وجود آمد.
به طور کلی کامپایلر برنامهای است که متن برنامهای را که به یک زبان برنامهسازی نوشته شده است به عنوان ورودی میپذیرد و خروجی آن متن برنامهای به یک زبان دیگر است به طوری که معنای آن متن تغییر نمیکند. این فرآیند در زبان طبیعی ترجمه نام دارد. مترجم ها جملات یک زبان طبیعی را به زبان طبیعی دیگر ترجمه میکنند. تقریبا تمام کامپایلرها برنامهای به یک زبان منبع را گرفته به برنامهای به زبان مقصد تبدیل میکنند . به عنوان مثال زبان منبع میتواند c و زبان مقصد میتواند زبان ماشین برای کامپیوتر پنتیوم باشد. زبانی که خود کامپایلر با آن نوشته میشود زبان پیاده ساز نام دارد.
علت انجام ترجمه این است که عملیاتی را انجام میدهد که توسط معنای برنامه توصیف میشود . به طور کلی سخت افزار تنها منبع واقعی انجام محاسبات است. اجرای برنامه ترجمه شده شامل خواندن دادههای آن بار فرمت خاص و چاپ نتایج با فرمت دیگری است . دادههای ورودی میتواند از منابع متعددی خوانده شود مثل ها و پکیجهای شبکهبه همین ترتیب خروجی نیز میتواند در فایلها و چاپگر قرار گیرد.
برای ترجمه برنامهاز کامپایلر استفاده میکنیم . کامپایلر برنامهای است که ورودی آن، فایلی با فرمت متن برنامه و خرجی آن، فایلی با فرمت کد اجرایی است.
2- کامپایلر چگونه کار می کند؟
برای تهیه یک کامپایلر کامپایلر دیگری رااجرا میکنیم که ورودی آن متن منبع این کامپایلر و خروجی آن کد اجرایی برای این کامپایلر است . این فرآیند کامپایل است . اگر زبان منبع همان زبان پیاده ساز باشد و متن منبعی که کامپایل میشود نسخه جدید خود کامپایلر باشد این فرآیند خودرانی نام دارد.
کامپایل کردن یک برنامه با تبدیل فرمت یک فایل به فرمت دیگر مثل EBCDIC به اسکی تفاوت عمدهای ندارد . در کامپایل کردن برنامه معنای برنامه باید حفظ شود . به دو دلیل زیر کامپایلر میتواند کار کند:
ورودی به یک زبان برنامه سازی است و در نتیجه دارای ساختاری است که در مراجع آن زبان مشخص شده است.
معنای ورودی بر اساس این ساختار توصیف میشود و به آن ساختار مربوط است.
این عوامل موجب میشوند تا کامپایلر برنامه را "درک کند " و معنای آن را در یک نمایش معنایی جمع آوری کند .هریک از دو عامل فوق در زبان مقصد نیز وجود دارد . بدین ترتیب کامپایلر میتواند معنای جمع آوری شده را بر حسب ساختار زبان مقصد ارائه کند.
بخشی از کامپایلر که متن زبان منبع را تحلیل میکند پردازشگر جلویی و بخشی از کامپایلر که زبان مقصد را ترکیب میکند پردازشگر نهایی نام دارد اگر کامپایلر به خوبی طراحی شده باشد پردازشگر نهایی کاملا از زبان مبدا و پردازشگر جلویی از زبان منبع بی خبر است . هر یک از این دو بخش از نمایش معنایی برنامه خبر دارند .این تفکیک دقیق دلایل فنی دارد و منجر به کامپایلرهای ساخت یافته میشود.
حالت دیگری از عملیات برای کامپایلر پیشنهاد میشود: اگر تمام دادههای ورودی مورد نیاز فراهم باشند کامپایلر میتواند مفهوم مشخص شده توسط معنای برنامه را بدون تبدیل به شکل دیگر اجرا نماید . در این صورت به جای مولد کد پردازشگر نهایی مفسر پردازشگر نهایی قرار میگیرد و این برنامه مفسر نامیده میشود . چند دلیل برای این کار وجود دارد . یکی از دلایل مهم این است که مفسر معمولا در ماشین خاصی اجرا میگردد. به عبارت دیگر استفاده از مفسر منجر به افزایش قابلیت حمل میگردد. دلیل دیگر این است که نوشتن مفسر آسانتر از پردازشگر نهاییت کامپایلر است .دلیل سوم برای استفاده از مفسر به جای کامپایلر این است که اجرای مستقیم برنامه عیب یابی و گزارش خطا را آسانتر میکند . دلیل چهارم این است که امنیت از طریق مفسرها افزایش مییابد . این کار در جاوا اهمیت فراوانی دارد.
مهمترین علت استفاده از ترجمه کد مبدا، ایجاد برنامه اجرایی می باشد. برعکس برنامهای که زبان سطح پایین را به بالاتر تبدیل می کند را decompiler گوییم.
کامپیوترهای اولیه از کامپایلر استفاده نمی کردند، چرا که این کامپیوتر ها حافظه کوچکی و برنامههای کوتاهی داشتند. کاربران مجبور بودند کد باینری یا دسیمال برنامهها را به طور مستقیم و با کمک نوار های مغناطیسی به سیستم وارد کنند.
اما برنامه نویس ها زیاد این وضعیت را تحمل نکردند و به فکر تولید برنامهای افتادند که نویسه های الفبایی (واژه های اختصاری) را به تعدادی دستور که قابل اجرا توسط ماشین باشد تبدیل کند. در این وضعیت بود که زبان های اسمبلی و کامپایلر های اولیه با نام اسمبلر به وجود آمد.
به طور کلی کامپایلر برنامهای است که متن برنامهای را که به یک زبان برنامهسازی نوشته شده است به عنوان ورودی میپذیرد و خروجی آن متن برنامهای به یک زبان دیگر است به طوری که معنای آن متن تغییر نمیکند. این فرآیند در زبان طبیعی ترجمه نام دارد. مترجم ها جملات یک زبان طبیعی را به زبان طبیعی دیگر ترجمه میکنند. تقریبا تمام کامپایلرها برنامهای به یک زبان منبع را گرفته به برنامهای به زبان مقصد تبدیل میکنند . به عنوان مثال زبان منبع میتواند c و زبان مقصد میتواند زبان ماشین برای کامپیوتر پنتیوم باشد. زبانی که خود کامپایلر با آن نوشته میشود زبان پیاده ساز نام دارد.
علت انجام ترجمه این است که عملیاتی را انجام میدهد که توسط معنای برنامه توصیف میشود . به طور کلی سخت افزار تنها منبع واقعی انجام محاسبات است. اجرای برنامه ترجمه شده شامل خواندن دادههای آن بار فرمت خاص و چاپ نتایج با فرمت دیگری است . دادههای ورودی میتواند از منابع متعددی خوانده شود مثل ها و پکیجهای شبکهبه همین ترتیب خروجی نیز میتواند در فایلها و چاپگر قرار گیرد.
برای ترجمه برنامهاز کامپایلر استفاده میکنیم . کامپایلر برنامهای است که ورودی آن، فایلی با فرمت متن برنامه و خرجی آن، فایلی با فرمت کد اجرایی است.
2- کامپایلر چگونه کار می کند؟
برای تهیه یک کامپایلر کامپایلر دیگری رااجرا میکنیم که ورودی آن متن منبع این کامپایلر و خروجی آن کد اجرایی برای این کامپایلر است . این فرآیند کامپایل است . اگر زبان منبع همان زبان پیاده ساز باشد و متن منبعی که کامپایل میشود نسخه جدید خود کامپایلر باشد این فرآیند خودرانی نام دارد.
کامپایل کردن یک برنامه با تبدیل فرمت یک فایل به فرمت دیگر مثل EBCDIC به اسکی تفاوت عمدهای ندارد . در کامپایل کردن برنامه معنای برنامه باید حفظ شود . به دو دلیل زیر کامپایلر میتواند کار کند:
ورودی به یک زبان برنامه سازی است و در نتیجه دارای ساختاری است که در مراجع آن زبان مشخص شده است.
معنای ورودی بر اساس این ساختار توصیف میشود و به آن ساختار مربوط است.
این عوامل موجب میشوند تا کامپایلر برنامه را "درک کند " و معنای آن را در یک نمایش معنایی جمع آوری کند .هریک از دو عامل فوق در زبان مقصد نیز وجود دارد . بدین ترتیب کامپایلر میتواند معنای جمع آوری شده را بر حسب ساختار زبان مقصد ارائه کند.
بخشی از کامپایلر که متن زبان منبع را تحلیل میکند پردازشگر جلویی و بخشی از کامپایلر که زبان مقصد را ترکیب میکند پردازشگر نهایی نام دارد اگر کامپایلر به خوبی طراحی شده باشد پردازشگر نهایی کاملا از زبان مبدا و پردازشگر جلویی از زبان منبع بی خبر است . هر یک از این دو بخش از نمایش معنایی برنامه خبر دارند .این تفکیک دقیق دلایل فنی دارد و منجر به کامپایلرهای ساخت یافته میشود.
حالت دیگری از عملیات برای کامپایلر پیشنهاد میشود: اگر تمام دادههای ورودی مورد نیاز فراهم باشند کامپایلر میتواند مفهوم مشخص شده توسط معنای برنامه را بدون تبدیل به شکل دیگر اجرا نماید . در این صورت به جای مولد کد پردازشگر نهایی مفسر پردازشگر نهایی قرار میگیرد و این برنامه مفسر نامیده میشود . چند دلیل برای این کار وجود دارد . یکی از دلایل مهم این است که مفسر معمولا در ماشین خاصی اجرا میگردد. به عبارت دیگر استفاده از مفسر منجر به افزایش قابلیت حمل میگردد. دلیل دیگر این است که نوشتن مفسر آسانتر از پردازشگر نهاییت کامپایلر است .دلیل سوم برای استفاده از مفسر به جای کامپایلر این است که اجرای مستقیم برنامه عیب یابی و گزارش خطا را آسانتر میکند . دلیل چهارم این است که امنیت از طریق مفسرها افزایش مییابد . این کار در جاوا اهمیت فراوانی دارد.