برنامه نویسی | کامپایلر چیست و چرا ما باید از آن استفاده کنیم - جدید
کامپایلر چیست و چرا ما باید از آن استفاده کنیم - جدید
  • Amir
  • ۱۳۹۸-۰۳-۱۳
  • ۴۲۴

کامپایلر چیست و چرا ما باید از آن استفاده کنیم - جدید


کامپایلر چیست

همگردان يا كامپايلر برنامه يا مجموعه اي از برنامه هاي كامپيوتري است كه متني از زبان برنامه نويسي سطح بالا (زبان مبدا) را به زباني سطح پايين (زبان مقصد)، مثل اسمبلي يا زبان سطح ماشين، تبديل مي كند. خروجي اين برنامه ممكن است براي پردازش شدن توسط برنامه ديگري مثل پيوند دهنده مناسب باشد يا فايل متني باشد كه انسان نيز بتواند آنرا بخواند.

مهم ترين علت استفاده از ترجمه كد مبدا، ايجاد برنامه اجرايي مي باشد. برعكس برنامه اي كه زبان سطح پايين را به بالاتر تبديل مي كند 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 گوييم.


شاید بپسندید


كامپايلرهاي تك فاز و چند فاز

فاز بندي كامپايلر ها كه در پشت زمينه به محدوديت هاي منابع سخت افزاري وابسته است. در نتيجه كامپايلر ها به مجموعه برنامه هاي كوچكتر تقسيم مي شوند هر يك بخشي از عمل ترجمه يا آناليز را برعهده مي گيرند. كامپايل تك فازي به نظر مفيد مي آيد، چرا كه سريعتر است. زبان پاسكال از اين امكان استفاده مي كند. اما مشكل اينجا است كه اگر اعلان جلوتر از دستور به كارگيري باشد، چه كار بايد كرد؟ براي حل اين مشكل مي توان در فاز اول اعلان ها را مشخص كرد و در فاز بعد عمل ترجمه را انجام داد. عيب ديگر كامپايلر تك فازي دشواري بهينه سازي كدهاي زبان سطح بالا مي باشد. همگردان يک گذره (One-Pass Compiler) کامپايلري است که براي توليد کد ماشين، تنها يک مرتبه متن برنامه را مي خواند. دستور برخي زبان ها به گونه اي است که توليد همگردان يک گذره براي آن ها غير ممکن است. مجموعه همگردان هاي گنو يا Gnu complier colection يا به صورت مخفف GCC مجموعه اي از همگردان هاي آزاد براي زبان هاي برنامه نويسي است. تقسم بندي كامپايلر ها به برنامه هاي كوچكتر تكنيكي است كه همچنان مورد بحث محققان است. در اين نوع دسته بندي كامپايلر ها، انواع ديگري نيز وجود دارد:

كامپايلر مبدا به مبدا كه كدي با زبان سطح بالا را دريافت مي كند و خروجي آن نيز زبان سطح بالا مي باشد. مثلاً موازي سازي خودكار كامپايلر در مواردي كه به طور تكراري در برنامه ورودي وجود دارد و سپس تغيير شكل دادن كد و نوشتن كد يا ساختار زباني موازي (برابر) با آن. (همچون دستور DOALL در فورترن) .

كامپايلر Stage كه به زبان اسمبلي براي ماشين نظري ترجمه مي كند. مثلاً در Prolog

ماشين پرولوگ معمولاً ماشين انتزائي (WAM)خوانده مي شود. بايت كدهاي جاوا و Python زير مجموعه اي از اين دسته اند.

كامپايلر زمان اجرا، براي سيستم هايSmalltalk ، Javaو زبان هاي ميانه(CIL) در محصولات .NET استفاده مي شود.

زبان هاي تفسيري و كامپايلي

بسياري از افراد زبان هاي سطح بالا را به دو دسته تفسيري و كامپايلي تقسيم مي كنند. كامپايلر ها و مفسر ها روي زبان ها عمل مي كنند نه زبان ها روي آن ها! مثلاً اين تصور وجود دارد كه الزاما BASIC تفسير مي شود و C كامپايل. اما ممكن است نمونه هايي از BASIC يا C ارائه شود كه به ترتيب كامپايلري و تفسيري باشد. البته استثناهايي نيز وجود دارد، مثلاً برخي زبان ها در خصوصيات خود اين تقسيم بندي را مشخص كرده اند(C كامپايلري است يا SNOBOL4 و اكثر زبان هاي اسكريپتي كه كد منبع زمان اجرا دارند تفسيري مي باشد).

طراحي كامپايلر ها

تقسيم بندي پروسه هاي كامپايل به مجموعه اي از فاز ها مورد حمايت پروژه كامپايلري ( توليد كامپايلرهاي باكيفيت) (PQCC) از دانشگاه Carnegie Mellon قرار گرفت. در اين پروژه اصطلاحات جلو بندي، ميان بندي (امروزه به ندرت به كار مي رود) و عقب بندي معرفي شد. اكثر كامپايلرهاي امروزي بيش از دو فاز دارند. جلوبندي معمولاً با پردازش املايي و معنايي شرح داده مي شود. عقب بندي شامل تبديل نوع و بهينه سازي هاي مختلف مي باشد. سپس كد براي آن كامپيوتر خاص توليد مي شود. استفاده از جلوبندي و عقب بندي اين را ممكن مي كند كه جلوبندي هاي مختلفي براي زبان هاي مختلف وجود داشته باشد و عقب بندي هاي مختلفي نيز براي CPU هاي مختلف.

 

Amir

Web disigner and software developer Manager of PySoft Programming team

نظر شما در مورد این پست چیه؟!