tarhebartar
سه شنبه 24 آذر 1388, 21:09 عصر
همگردان یا كامپایلر برنامه یا مجموعهای از برنامههای كامپیوتری است كه متنی از زبان برنامه نویسی سطح بالا (زبان مبدا) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین، تبدیل میكند. خروجی این برنامه ممكن است برای پردازش شدن توسط برنامه دیگری مثل پیوند دهنده مناسب باشد یا فایل متنی باشد كه انسان نیز بتواند آنرا بخواند.
مهمترین علت استفاده از ترجمه كد مبدا، ایجاد برنامه اجرایی می باشد. برعكس برنامهای كه زبان سطح پایین را به بالاتر تبدیل می كند را decompiler گوییم.
كامپیوترهای اولیه از كامپایلر استفاده نمی كردند، چرا كه این كامپیوتر ها حافظه كوچكی و برنامههای كوتاهی داشتند. كاربران مجبور بودند كد باینری یا دسیمال برنامهها را به طور مستقیم و با كمك نوار های مغناطیسی به سیستم وارد كنند. اما برنامه نویس ها زیاد این وضعیت را تحمل نكردند و به فكر تولید برنامهای افتادند كه نویسه های الفبایی (واژه های اختصاری) را به تعدادی دستور كه قابل اجرا توسط ماشین باشد تبدیل كند. در این وضعیت بود كه زبان های اسمبلی و كامپایلر های اولیه با نام اسمبلر به وجود آمد.
در اواخر دهه ۱۹۵۰ میلادی ماشین های دارای زبانهای برنامه نویسی رواج یافتند و كامپایلرهای آزمایشی ایجاد شدند. زبان فرترن به سرپرستی جان باکوس در شركت آيبیام به عنوان اولین كامپایلر كامل در سال ۱۹۵۷ تولید شد. كوبول اولین زبان كامپایلی با معماری چندگانه در سال ۱۹۶۰ تولید شد. در طی دهه ۶۰ كامپایلر های زیادی تولید شد اما بر روی كیفیت كامپایلر ها كمتر فكر می شد. همزمان با تكامل زبان های برنامه سازی و افزایش قدرت كامپیوتر ها، كامپایلرها هرچه بیشتر پیچیده می شدند.
یك كامپایلر خود برنامه ای است كه توسط زبان پیاده ساز تولید شده است. اولین كامپایلر خود محور كه می توانست كد خود را كامپایل كند برای زبان Lisp و توسط Hart و Levin در سال 1962 و در دانشگاه MIT ایجاد شد. در دهه 70 از زبانهای سطح بالایی مثل پاسکال و سی جهت نوشتن كامپایلر ها استفاده شد. ساخت كامپایلر های خود محور دارای مشكل راه اندازی است، چونكه هر كامپایلری باید توسط كامپایلر نوشته شده ای به زبان دیگر كامپایل شود یا برای این مشكل دست به دامن مفسری بشود.
ساختار كامپایلر ها و كامپایلر بهینه ساز امروزه بخشی از برنامه درسی دانشجویان كامپیوتر است. برخی كامپایلر ها به منظور آموزشی برای زبان های برنامه نویسی تولید می گردد. مثلاً كامپایلر PL/0 توسط Niklaus Wirth برای آموزش در دهه 1970 به كار رفت. به علت سادگی و دلایل زیر هنوز برای آموزش مورد استفاده قرار می گیرد:
* توسعه گام به گام برنامه
* به كار گیری پارسر های بازگشتی
* استفاده از EBNF جهت تعریف نحو زبان
* استفاده از P-Code در جریان تولید كد خروجی قابل حمل
* نمایش T-diagram جهت تعارف رسمی
در تاریخچه کامپایلر سه دوره میتوان در نظر گرفت:
از 1945تا1960:تولید کد
در این دوره ,زبانها به تدریج به وجود آمدند و ماشینها چندان متعارف نبودند . مسئله این بود که چگونه باید کدی را برای یک ماشین تولید کرد . با توجه به اینکه برنامه نویسی به زبان اسمبلی رواج داشت , این مسئله وخیمتر شد. استفاده از کامپایلر , برنامه نویسی خودکار نامیده شد . طرفداران زبانهای سطح بالا میترسیدند که کد تولید شده نسبت به زبان اسمبلی کارایی چندان نداشته باشد. اولین کامپایلر فرترن(شریدان 1959) به خوبی بهینه سازی شد
از 1960تا1975 :تجزیه کردن
در دهههای 1960و1970 زبانهای برنامهسازی جدید به وجود آمدند و طراحان زبان معتقد بودند که طراحی سریع کامپایلر برای زبان جدید , مهمتر از وجود کامپایلری با کد کارآمد است .بدین ترتیب , در ساخت کامپایلر به پردازشگر جلویی تاکید شده است . در همین زمان , مطالعه زبانهای رسمی , تکنیکهای قدرتمندی را برای ساخت پردازشگر جلوی , بخصوص تولید تجزیه کننده به وجود آورد
از 1975 تاکنون :تولید کد و بهینه سازی کد
از 1975 تاکنون , تعداد زبانهای جدید و انواع ماشین مختلف کاهش یافت در نتیجه نیاز به کامپایلرهای سریع و ساده یا سریع و ناقص برای زبانها یا ماشینهای جدید , کاهش یافت . بزرگترین آشفتگی در طراحی زبان و ماشین خاتمه یافت و افراد خواستار کامپایلرهای قابل اعتماد , کارآمد و با واسط کاربر مناسب شدند . بدین ترتیب , توجه کیفی به کد بیشتر شد زیرا با تغیر اندکی که در ساختار ماشینها ایجاد میشود , طول عمر کدها افزایش مییابد.در همین دوره , مدلهایی در برنامه نویسی به وجود آمدند که برنامه نویسی تابعی , منطقی و توزیعی نمونههای از این مدلها هستند, خواستههای زمان اجرای این زبانها نسبت به زبانهای دستور, افزایش یافت .
انواع كامپایلر ها
راه های مختلفی جهت دسته بندی كامپایلر ها وجود دارد مثلاً می توان آنها را با توجه به ورودی، خروجی، ساختار داخلی و یا رفتار زمان اجرای آن تقسیم بندی كرد.
كامپایلرهای Native و cross
اكثر كامپایلرها به دو دسته Native و Cross تقسیم می شوند. كامپایلرهایی كه به منظور اجرای برنامه ها كدهای باینری را تولید می كنند، كامپایلر هایی با كد محلی یا Native گوییم چرا كه تنها در كامپیوترهای یك نوع با سیستم عامل های یكسان قابل به كارگیری است. از طرف دیگر ممكن است كامپایلرها كدهای باینری را تولید كنند كه در سیستم های مختلف قابل اجرا باشد. به این دسته از كامپایلر ها كه وابستگی به سخت افزار ندارند، كامپایلر های عبوری یا Cross گوییم. برای این نوع كاپایلر ها تنها كافی است برای بار اول سخت افزار را به آن معرفی نمود. بنابراین می توان نتیجه گرفت كه كامپایلرهای عبوری مفیدتر هستند. این تقسیم بندی برای مفسرها به كار نمی رود جونكه آنها از نمایش دودویی برای اجرای كد خود استفاده نمی كنند. ماشین های مجازی در هیچ یك از این دسته بندی ها نمی گنجد. هر گاه در ماشین های مجازی یكسان قابل اجرا باشد می توان آنرا Native و هرگاه كامپایلر قادر به تولید خروجی برای پلت فورم های مختلف باشد آنرا Cross گوییم.
منبع :
http://www.eca.ir/forum2/index.php?topic=22179.0;wap2
مهمترین علت استفاده از ترجمه كد مبدا، ایجاد برنامه اجرایی می باشد. برعكس برنامهای كه زبان سطح پایین را به بالاتر تبدیل می كند را decompiler گوییم.
كامپیوترهای اولیه از كامپایلر استفاده نمی كردند، چرا كه این كامپیوتر ها حافظه كوچكی و برنامههای كوتاهی داشتند. كاربران مجبور بودند كد باینری یا دسیمال برنامهها را به طور مستقیم و با كمك نوار های مغناطیسی به سیستم وارد كنند. اما برنامه نویس ها زیاد این وضعیت را تحمل نكردند و به فكر تولید برنامهای افتادند كه نویسه های الفبایی (واژه های اختصاری) را به تعدادی دستور كه قابل اجرا توسط ماشین باشد تبدیل كند. در این وضعیت بود كه زبان های اسمبلی و كامپایلر های اولیه با نام اسمبلر به وجود آمد.
در اواخر دهه ۱۹۵۰ میلادی ماشین های دارای زبانهای برنامه نویسی رواج یافتند و كامپایلرهای آزمایشی ایجاد شدند. زبان فرترن به سرپرستی جان باکوس در شركت آيبیام به عنوان اولین كامپایلر كامل در سال ۱۹۵۷ تولید شد. كوبول اولین زبان كامپایلی با معماری چندگانه در سال ۱۹۶۰ تولید شد. در طی دهه ۶۰ كامپایلر های زیادی تولید شد اما بر روی كیفیت كامپایلر ها كمتر فكر می شد. همزمان با تكامل زبان های برنامه سازی و افزایش قدرت كامپیوتر ها، كامپایلرها هرچه بیشتر پیچیده می شدند.
یك كامپایلر خود برنامه ای است كه توسط زبان پیاده ساز تولید شده است. اولین كامپایلر خود محور كه می توانست كد خود را كامپایل كند برای زبان Lisp و توسط Hart و Levin در سال 1962 و در دانشگاه MIT ایجاد شد. در دهه 70 از زبانهای سطح بالایی مثل پاسکال و سی جهت نوشتن كامپایلر ها استفاده شد. ساخت كامپایلر های خود محور دارای مشكل راه اندازی است، چونكه هر كامپایلری باید توسط كامپایلر نوشته شده ای به زبان دیگر كامپایل شود یا برای این مشكل دست به دامن مفسری بشود.
ساختار كامپایلر ها و كامپایلر بهینه ساز امروزه بخشی از برنامه درسی دانشجویان كامپیوتر است. برخی كامپایلر ها به منظور آموزشی برای زبان های برنامه نویسی تولید می گردد. مثلاً كامپایلر PL/0 توسط Niklaus Wirth برای آموزش در دهه 1970 به كار رفت. به علت سادگی و دلایل زیر هنوز برای آموزش مورد استفاده قرار می گیرد:
* توسعه گام به گام برنامه
* به كار گیری پارسر های بازگشتی
* استفاده از EBNF جهت تعریف نحو زبان
* استفاده از P-Code در جریان تولید كد خروجی قابل حمل
* نمایش T-diagram جهت تعارف رسمی
در تاریخچه کامپایلر سه دوره میتوان در نظر گرفت:
از 1945تا1960:تولید کد
در این دوره ,زبانها به تدریج به وجود آمدند و ماشینها چندان متعارف نبودند . مسئله این بود که چگونه باید کدی را برای یک ماشین تولید کرد . با توجه به اینکه برنامه نویسی به زبان اسمبلی رواج داشت , این مسئله وخیمتر شد. استفاده از کامپایلر , برنامه نویسی خودکار نامیده شد . طرفداران زبانهای سطح بالا میترسیدند که کد تولید شده نسبت به زبان اسمبلی کارایی چندان نداشته باشد. اولین کامپایلر فرترن(شریدان 1959) به خوبی بهینه سازی شد
از 1960تا1975 :تجزیه کردن
در دهههای 1960و1970 زبانهای برنامهسازی جدید به وجود آمدند و طراحان زبان معتقد بودند که طراحی سریع کامپایلر برای زبان جدید , مهمتر از وجود کامپایلری با کد کارآمد است .بدین ترتیب , در ساخت کامپایلر به پردازشگر جلویی تاکید شده است . در همین زمان , مطالعه زبانهای رسمی , تکنیکهای قدرتمندی را برای ساخت پردازشگر جلوی , بخصوص تولید تجزیه کننده به وجود آورد
از 1975 تاکنون :تولید کد و بهینه سازی کد
از 1975 تاکنون , تعداد زبانهای جدید و انواع ماشین مختلف کاهش یافت در نتیجه نیاز به کامپایلرهای سریع و ساده یا سریع و ناقص برای زبانها یا ماشینهای جدید , کاهش یافت . بزرگترین آشفتگی در طراحی زبان و ماشین خاتمه یافت و افراد خواستار کامپایلرهای قابل اعتماد , کارآمد و با واسط کاربر مناسب شدند . بدین ترتیب , توجه کیفی به کد بیشتر شد زیرا با تغیر اندکی که در ساختار ماشینها ایجاد میشود , طول عمر کدها افزایش مییابد.در همین دوره , مدلهایی در برنامه نویسی به وجود آمدند که برنامه نویسی تابعی , منطقی و توزیعی نمونههای از این مدلها هستند, خواستههای زمان اجرای این زبانها نسبت به زبانهای دستور, افزایش یافت .
انواع كامپایلر ها
راه های مختلفی جهت دسته بندی كامپایلر ها وجود دارد مثلاً می توان آنها را با توجه به ورودی، خروجی، ساختار داخلی و یا رفتار زمان اجرای آن تقسیم بندی كرد.
كامپایلرهای Native و cross
اكثر كامپایلرها به دو دسته Native و Cross تقسیم می شوند. كامپایلرهایی كه به منظور اجرای برنامه ها كدهای باینری را تولید می كنند، كامپایلر هایی با كد محلی یا Native گوییم چرا كه تنها در كامپیوترهای یك نوع با سیستم عامل های یكسان قابل به كارگیری است. از طرف دیگر ممكن است كامپایلرها كدهای باینری را تولید كنند كه در سیستم های مختلف قابل اجرا باشد. به این دسته از كامپایلر ها كه وابستگی به سخت افزار ندارند، كامپایلر های عبوری یا Cross گوییم. برای این نوع كاپایلر ها تنها كافی است برای بار اول سخت افزار را به آن معرفی نمود. بنابراین می توان نتیجه گرفت كه كامپایلرهای عبوری مفیدتر هستند. این تقسیم بندی برای مفسرها به كار نمی رود جونكه آنها از نمایش دودویی برای اجرای كد خود استفاده نمی كنند. ماشین های مجازی در هیچ یك از این دسته بندی ها نمی گنجد. هر گاه در ماشین های مجازی یكسان قابل اجرا باشد می توان آنرا Native و هرگاه كامپایلر قادر به تولید خروجی برای پلت فورم های مختلف باشد آنرا Cross گوییم.
منبع :
http://www.eca.ir/forum2/index.php?topic=22179.0;wap2