کامپایلر: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
برچسبها: نیازمند بازبینی ویرایش همراه ویرایش از وبگاه همراه |
|||
خط ۲:
'''مترجم''' یا '''همگردان''' یا '''کامپایلر''' {{به انگلیسی|compiler}} [[برنامه (رایانه)|برنامه]] یا مجموعهای از [[برنامه|برنامههای کامپیوتری]] است که متنی از زبان برنامه نویسی سطح بالا (زبان مبدا) را به [[زبان برنامهنویسی سطح پایین|زبانی سطح پایین]] (زبان مقصد)، مثل [[اسمبلی]] یا زبان سطح ماشین، تبدیل میکند. خروجی این برنامه ممکن است برای پردازش شدن توسط برنامه دیگری مثل [[پیونددهنده]] مناسب باشد یا [[فایل]] متنی باشد که انسان نیز بتواند آنرا بخواند.
مهمترین علت استفاده از ترجمه کد مبدا، ایجاد برنامه اجرایی میباشد. برعکس برنامهای که [[زبان برنامهنویسی سطح پایین]] را به بالاتر تبدیل میکند را [[مترجموارون]] گوییم.
ترجمه کامل کد منبع برنامهای از یک زبان سطح بالا به کد شیء، پیش از اجرای برنامه را همگردانی یا کامپایل میگویند.
خط ۱۹:
== تاریخچه ==
در اواخر دهه ۱۹۵۰ میلادی ماشینهای دارای زبانهای برنامه نویسی رواج یافتند و کامپایلرهای آزمایشی ایجاد شدند. زبان [[فرترن]] به سرپرستی [[جان باکوس]] در شرکت [[آیبیام]] به عنوان اولین کامپایلر کامل در سال ۱۹۵۷ تولید شد. [[کوبول]] اولین زبان کامپایلی با معماری چندگانه در سال ۱۹۶۰ تولید شد. در طی دهه ۶۰ کامپایلرهای زیادی تولید شد اما بر روی کیفیت کامپایلرها کمتر فکر میشد.
همزمان با تکامل زبانهای برنامه سازی و افزایش قدرت کامپیوترها، کامپایلرها هرچه بیشتر پیچیده میشدند.
یک کامپایلر خود برنامهای است که توسط زبان
ساختار کامپایلرها و [[کامپایلر
* توسعه گام به گام برنامه
* به کار گیری پارسرهای بازگشتی
سطر ۳۶ ⟵ ۳۵:
از ۱۹۴۵تا۱۹۶۰:تولید کد
در این دوره، زبانها به تدریج به وجود آمدند و ماشینها چندان متعارف نبودند. مسئله این بود که چگونه باید کدی را برای یک ماشین تولید کرد. با توجه به اینکه برنامه نویسی به زبان اسمبلی رواج داشت، این مسئله وخیمتر شد. استفاده از کامپایلر، برنامه نویسی خودکار نامیده شد. طرفداران زبانهای سطح بالا میترسیدند که کد تولید شده نسبت به زبان اسمبلی کارایی چندان نداشته باشد. اولین کامپایلر فرترن (شریدان ۱۹۵۹) به خوبی
از ۱۹۶۰تا۱۹۷۵:تجزیه کردن
سطر ۴۲ ⟵ ۴۱:
در دهههای ۱۹۶۰و۱۹۷۰ زبانهای برنامهسازی جدید به وجود آمدند و طراحان زبان معتقد بودند که طراحی سریع کامپایلر برای زبان جدید، مهمتر از وجود کامپایلری با کد کارآمد است. بدین ترتیب، در ساخت کامپایلر به پردازشگر جلویی تاکید شدهاست. در همین زمان، مطالعه زبانهای رسمی، تکنیکهای قدرتمندی را برای ساخت پردازشگر جلوی، بخصوص تولید تجزیه کننده به وجود آورد.
از ۱۹۷۵ تاکنون:تولید کد و
از ۱۹۷۵ تاکنون، تعداد زبانهای جدید و انواع ماشین مختلف کاهش یافت در نتیجه نیاز به کامپایلرهای سریع و ساده یا سریع و ناقص برای زبانها یا ماشینهای جدید، کاهش یافت. بزرگترین آشفتگی در طراحی زبان و ماشین خاتمه یافت و افراد خواستار کامپایلرهای قابل اعتماد، کارآمد و با واسط کاربر مناسب شدند. بدین ترتیب، توجه کیفی به کد بیشتر شد زیرا با تغییر اندکی که در ساختار ماشینها ایجاد میشود، طول عمر کدها افزایش مییابد. در همین دوره، مدلهایی در برنامه نویسی به وجود آمدند که برنامه نویسی تابعی، منطقی و توزیعی نمونههای از این مدلها هستند، خواستههای زمان اجرای این زبانها نسبت به زبانهای دستور، افزایش یافت.
== انواع کامپایلرها ==
راههای مختلفی جهت
=== کامپایلرهای Native و cross ===**********
اکثر کامپایلرها به دو دسته Native و Cross تقسیم میشوند. کامپایلرهایی که به منظور اجرای [[برنامه|برنامهها]] کدهای باینری را تولید میکنند، کامپایلرهایی با کد محلی یا Native گوییم چرا که تنها در [[کامپیوتر|کامپیوترهای]] یک نوع با [[سیستمعامل|سیستمعاملهای]] یکسان قابل به کارگیری است. از طرف دیگر ممکن است کامپایلرها کدهای باینری را تولید کنند که در سیستمهای مختلف قابل اجرا باشد. به این دسته از کامپایلرها که وابستگی به سختافزار ندارند، کامپایلرهای عبوری یا Cross گوییم. برای این نوع کاپایلرها تنها کافی است برای بار اول [[سختافزار]] را به آن معرفی
این تقسیم بندی برای [[مفسر (رایانه)|مفسرها]] به کار نمیرود جونکه آنها از نمایش دودویی برای اجرای کد خود استفاده نمیکنند.
ماشینهای مجازی در
=== کامپایلرهای تک فاز و چند فاز ===
فاز بندی کامپایلرها که در پشت زمینه به محدودیتهای منابع سختافزاری وابستهاست. در نتیجه کامپایلرها به مجموعه برنامههای کوچکتر تقسیم میشوند هر یک بخشی از عمل ترجمه یا آنالیز را برعهده میگیرند.
کامپایل تک فازی به نظر مفید میآید، چراکه سریعتر است. [[زبان پاسکال]] از این امکان استفاده میکند. اما مشکل اینجا است که اگر اعلان جلوتر از دستور به کارگیری باشد، چه کار باید کرد؟ برای حل این مشکل میتوان در فاز اول اعلانها را مشخص کرد و در فاز بعد عمل ترجمه را انجام داد. عیب دیگر کامپایلر تک فازی دشواری
همگردان یکگذره (One-Pass Compiler) کامپایلری است که برای تولید [[کد]] ماشین، تنها یک مرتبه متن برنامه را میخواند. دستور برخی زبانها به گونهای است که تولید همگردان یکگذره برای آنها غیر ممکن است.
مجموعه همگردانهای گنو یا Gnu complier colection یا به صورت مخفف GCC مجموعهای از همگردانهای آزاد برای زبانهای برنامه نویسی است.
تقسم بندی کامپایلرها به برنامههای کوچکتر تکنیکی است که همچنان مورد بحث محققان است.
در این نوع
* '''کامپایلر مبدا به مبدا''' که کدی با زبان سطح بالا را دریافت میکند و خروجی آن نیز زبان سطح بالا میباشد. مثلاً موازی سازی خودکار کامپایلر در مواردی که به طور تکراری در برنامه ورودی وجود دارد و سپس تغییر شکل دادن کد و نوشتن کد یا ساختار زبانی موازی (برابر) با آن.(همچون دستور DOALL در [[فورترن]]).
* '''کامپایلر Stage''' که به [[زبان اسمبلی]] برای ماشین نظری ترجمه میکند. مثلاً در [[پرولوگ]]
** ماشین پرولوگ معمولاً ماشین انتزائی (WAM) خوانده میشود. بایت کدهای [[جاوا]] و Python زیر مجموعهای از این دستهاند.
* '''کامپایلر زمان اجرا'''، برای سیستمهای Smalltalk، Java و زبانهای میانه(CIL) در محصولات NET. استفاده میشود.
=== زبانهای تفسیری و کامپایلی ===
بسیاری از افراد زبانهای سطح بالا را به دو دسته تفسیری و کامپایلی تقسیم میکنند. کامپایلرها و مفسرها روی زبانها عمل میکنند نه زبانها روی آنها! مثلاً این تصور وجود دارد که الزاماً BASIC تفسیر میشود و C کامپایل. اما ممکن است نمونههایی از BASIC یا C ارائه شود که به ترتیب کامپایلری و تفسیری باشد.
البته استثناهایی نیز وجود دارد، مثلاً برخی زبانها در خصوصیات خود این تقسیم بندی را مشخص
== طراحی کامپایلرها ==
تقسیم بندی پروسههای کامپایل به مجموعهای از فازها مورد حمایت پروژه کامپایلری ((تولید کامپایلرهای باکیفیت))(PQCC) از دانشگاه Carnegie Mellon قرار گرفت. در این پروژه اصطلاحات جلو بندی، میان بندی (امروزه به ندرت به کار میرود) و عقب بندی معرفی شد.
اکثر کامپایلرهای امروزی بیش از دو فاز دارند. جلوبندی معمولاً با پردازش املایی و معنایی شرح داده میشود. عقب بندی شامل تبدیل نوع و
استفاده از جلوبندی و عقب بندی این را ممکن میکند که جلوبندیهای مختلفی برای زبانهای مختلف وجود داشته باشد و عقب بندیهای مختلفی نیز برای [[CPU|CPUهای]] مختلف.
خط ۷۶:
جلوبندی به منظور تولید ''کد میانی'' یا ''IR'' از کد مبدا استفاده میشود. جلوبندی معمولاً جدول نمادها را مدیریت نموده و یک نگاشتگر ساختمان دادهای، هر نماد را از درون کد مبدا به اطلاعات مربوط به آن مثل نوع و دامنه تعریف آن [[نگاشت]] میشود. این امر در چند فاز انجام میگردد:
# '''خط نوسازی'''. زبانهایی که اجازه تعیین فضای اختیاری برای شناسهها را میدهند قبل از عمل تجزیه نیاز به فاز اضافی دارند که کد ورودی را به صورت متعارفی برای تجزیه گر آماده کند. Algol، Coral۶۶، Atlas Autocode وImp نمونههایی از این زبانه هستند که به خط نوسازی (Line Reconstruction) نیازمند است.
# '''پیش پردازش'''. برخی زبانها همچون C احتیاج به فاز پیش پردازش برای جایگزینی شروط کامپایل و [[ماکرو|ماکروها]] دارند. در زبان C فاز پیش پردازش شامل مرحله [[تحلیل لغوی]] میشود.
# '''تحلیل لغوی''' کد متنی مبدا را به اجزای کوچکی که [[نشانه]](token) نامیده میشود میشکند. هر نشانه واحد سادهای از زبان است مثل [[کلمات کلیدی]] و نام نمادها. نحو نشانهها نوعاً یک [[زبان باقاعده]] است، بنابراین یک [[ماشین حالت متناهی]] که برپایه یک عبارت باقاعده بنا میشود میتواند جهت شناخت آن استفاده شود.
# '''تحلیل نحوی''' شامل تجزیه کردن نشانههای مرتب جهت شناخت ساختار نحوی زبان میباشد.
# '''تحلیل معنایی''' فازی است که معنای برنامه را جهت رعایت قوانین زبان بررسی میکند. یک مثال برای این فاز کنترل نوع است.
خط ۸۴:
گاهی مرحله عقب بندی با مرحله تولید کد اشتباه گرفته میشود. اما میتوان گفت که عقب بندی به مراحل چند گانه زیر تقسیم میشود:
# '''تحلیل کامپایلر''': این پروسه برای بدست آوردن اطلاعات بیشتر از نمایش میانی فایلهای ورودی میباشد. تحلیلگر نوعی تعاریف مختلفی دارد همچون تحلیلگر حلقوی، تحلیلگر وابسطه، تحلیلگر مستعار، تحلیلگر اشارهای یا غیره میباشد. تحلیل دقیق زیر بنای هر کامپایلرهای بهینهاست. [[گراف]] فراخوانی و نمودار جریان کنترل معمولاً در فاز تجزیه تولید میگردد.
# '''
# تولید کننده کد: زبان میانی تغییر کرده به زبان خروجی مثل [[زبان ماشین]] ترجمه میشود. این شامل تخصیص منابع و تصمیمات
«البته در ابتدای امر که در مورد زبانهای تفسیری و کامپایلری گفته بودند باید خاطر نشان کرد که زبانهای تفسیری خط به خط خوانده شده و اجرا میگردد در حالیکه در کامپایلری ابتدا تمام برنامه ترجمه شده و سپس اجرا میگردد پس در زمان اجرا سرعت اجرا شدن زبانهای کامپایلری بیشتر است. اما کشف و تصحیح خطا در تفسیری بهتر و راحت تر است.»
خط ۹۲:
=== مجموعه همگردان گنو ===
GCC از ابتدا مخفف Gnu C Compiler بود ولی از زمانی که توانست زبانهای دیگری غیر از C از قبیل C++،Ada،Java،Objective C و Fortran را کامپایل کند به Gnu Compiler Collection تغییر نام داد.
پدید آورنده اصلی GCC ریچارد استالمن است کسی که بنیانگذار پروژه Gnu محسوب میشود. نخستین نسخه GCC در سال ۱۹۸۷ انتشار یافت که یک پیشرفت مهم محسوب میشد زیرا محصول جدید اولین کامپایلر
در سال ۱۹۹۲ نسخه ۲٫۰ کامپایلر GCC عرضه شد. نسخه جدید قابلیت کامپایل کدهای ++C را نیز داشت.
در سال ۱۹۹۷ یک انشعاب آزمایشی در GCC به نام EGCC به منظور
چهارمین نسخه از کامپایلر GCC در سال ۲۰۰۵ عرضه شد.
|