بررسی زبانهای برنامه نویسی و کامپایلرها

بررسی زبانهای برنامه نویسی و کامپایلرها

توسط admin | گروه مقاله های کامپیوتر | 1394/04/14

نظرات 0

زبان‌های برنامه‌نویسی
زبان‌های برنامه‌نویسی ساختارهای زبانی‌ دستورمداری در رایانه‌ها هستند که به‌وسیلهٔ آنها می‌توان یک الگوریتم را به‌وسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید نرم‌افزارهای جدید بوجود می‌آید. معمولاً هر زبان برنامه‌نویسی دارای یک محیط نرم‌افزاری برای وارد کردن متن برنامه، اجرا، همگردانی و رفع اشکال آن هستند.

تعداد زبانهای برنامه‌نویسی رایانه‌ای بسیار زیاد است، اما از میان معروفترین و اصلی‌ترین آنها می‌توان به این موارد اشاره کرد :
Visual Basic, C#, C++, Java, Python, Delphi, Turbo Pascal, Foxpro, Fortran, Cobol, PL1, Qbasic, Gwbasic,
 
زبانهاب برنامه نویسی
 
همگردان
كامپایلر در اصل برنامه یا مجموعه ای از برنامه های كامپیوتری است كه متن تایپ شده در زبان برنامه نویسی را (زبان مبدا) به زبان ماشین دیگری تبدیل می كند(زبان مقصد). معمولا ورودی اصلی را كد مبدا و خروجی را كد شی گوییم. خروجی این برنامه ممكن است برای پردازش شدن توسط برنامه دیگری مثل Linker مناسب باشد یا فایل متنی باشد كه انسان نیز بتواند آنرا بخواند. مهمترین علت استفاده از ترجمه كد مبدا، ایجاد برنامه اجرایی می باشد. اصطلاح همگردان (compiler) اصولا برای برنامه هایی به كار میرود كه كد مبدا را از یك زبان سطح بالا به زبانی سطح پایین تری مثل اسمبلی یا زبان سطح ماشین ترجمه می كند. برعكس برنامه ای كه زبان سطح پایین را به بالاتر تبدیل می كند را decompiler گوییم.
به طور خلاصه می توان گفت:
هر برنامه‌ای که با استفاده از قوانین دستوری و معنایی، مجموعه‌ای از نمادها را ترجمه می‌کند. 
برنامه‌ای که تمامی دستورات ترجمه نشدهٔ یک برنامهٔ نوشته شده با یک زبان سطح بالا را پیش از اجرا به زبان ماشین ترجمه می‌‌کند. 
 
تاریخچه
كامپیوتر های اولیه از كامپایلر ها استفاده نمی كردند، چرا كه این كامپیوتر ها حافظه كوچكی داشتند و با برنامه های كوتاه سر و كار داشتیم. كاربران مجبور بودند كد باینری یا دسیمال برنامه ها را به طور مستقیم و با كمك نوار های مغناطیسی به سیستم وارد كنند. اما برنامه نویس ها زیاد این وضعیت را تحمل نكردند و به فكر تولید برنامه ای افتادند كه كاراكتر های الفبایی(واژه های اختصاری) را به تعدادی دستور كه قابل اجرا توسط ماشین باشد تبدیل كند. در این وضعیت بود كه زبان های اسمبلی و كامپایلر های اولیه با نام اسمبلر به وجود آمد. در اواخر دهه 90 بود كه ماشین های وابسطه به زبانهای زبانهای برنامه نویسی رونق گرفتند. متعاقبا كامپایلرهای آزمایشی ایجاد شدند. FORTRAN به سرپرستی John Backus در شركت IBM به عنوان اولین كامپایلر كامل را در سال 1957 تولید شد. كوبول اولین زبان كامپایلی با معماری چندگانه در سال 1960 تولید شد. در طی دهه 60 كامپایلر های زیادی تولید شد اما بر روی كیفیت كامپایلر ها كمتر فكر می شد. همزمان با تكامل زبان های برنامه سازی و افزایش قدرت كامپیوتر ها، كامپایلرها هرچه بیشتر پیچیده می شدند. یك كامپایلر خود برنامه ای است كه توسط زبان پیاده ساز تولید شده است. اولین كامپایلر خود محور كه می توانست كد خود را كامپایل كند برای زبان Lisp و توسط Hart و Levin در سال 1962 و در دانشگاه MIT ایجاد شد. در دهه 70 از زبانهای سطح بالایی مثل Pascal و C جهت نوشتن كامپایلر ها استفاده شد. ساخت كامپایلر های خود محور دارای مشكل راه اندازی است، چونكه هر كامپایلری باید توسط كامپایلر نوشته شده ای به زبان دیگر كامپایل شود یا برای این مشكل دست به دامن مفسری بشود. ساختار كامپایلر ها و كامپایلر بهینه ساز امروزه بخشی از برنامه درسی دانشجویان كامپیوتر است. برخی كامپایلر ها به منظور آموزشی برای زبان های برنامه نویسی تولید می گردد. مثلا كامپایلر 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 
o ماشین پرولوگ معمولا ماشین انتزائی (WAM) خوانده می شود. بایت كدهای جاوا و Python زیر مجموعه ای از این دسته اند. 
كامپایلر زمان اجرا، برای سیستم های Smalltalk ، Java و زبان های میانه(CIL) در محصولات NET. استفاده می شود. 
 
زبانهای تفسیری و كامپایلی
بسیاری از افراد زبانهای سطح بالا را به دو دسته تفسیری و كامپایلی تقسیم می كنند. كامپایلر ها و مفسر ها روی زبان ها عمل می كنند نه زبانها روی آنها! مثلا این تصور وجود دارد كه الزاما BASIC تفسیر می شود و C كامپایل. اما ممكن است نمونه هایی از BASIC یا C ارائه شود كه به ترتیب كامپایلری و تفسیری باشد. البته استثنا هایی نیز وجود دارد، مثلا برخی زبانها در خصوصیات خود این تقسیم بندی را مشخص كرده اند(C كامپایلری است یا SNOBOL4 و اكثر زبانهای اسكریپتی كه كد منبع زمان اجرا دارند تفسیری می باشد).
 
طراحی كامپایلر ها
تقسیم بندی پروسه های كامپایل به مجموعه ای از فاز ها مورد حمایت پروژه كامپایلری (( تولید كامپایلرهای باكیفیت ))(PQCC) از دانشگاه Carnegie Mellon قرار گرفت. در این پروژه اصطلاحات جلو بندی، میان بندی(امروزه به ندرت به كار میرود) و عقب بندی معرفی شد. اكثر كامپایلرهای امروزی بیش از دو فاز دارند. جلوبندی معمولا با پردازش املایی و معنایی شرح داده می شود. عقب بندی شامل تبدیل نوع و بهینه سازی های مختلف می باشد. سپس كد برای آن كامپیوتر خاص تولید می شود. استفاده از جلوبندی و عقب بندی این را ممكن می كند كه جلوبندی های مختلفی برای زبانهای مختلف وجود داشته باشد و عقب بندی های مختلفی نیز برای CPU های مختلف.
 
جلو بندی
جلوبندی به منظور تولید كد میانی یا IR از كد مبدا استفاده می شود. جلوبندی معمولا جدول نماد ها را مدیریت نموده و یك نگاشتگر ساختمان داده ای، هر نماد را از درون كد مبدا به اطلاعات مربوط به آن مثل نوع و دامنه تعریف آن نگاشت می شود. این امر در چند فاز انجام میگردد:
1. خط نوسازی. زبانهایی كه اجازه تعیین فضای اختیاری برای شناسه ها را می دهند قبل از عمل تجزیه نیاز به فاز اضافی دارند كه كد ورودی را به صورت متعارفی برای تجزیه گر آماده كند. Algol، Coral66، Atlas Autocode وImp نمونه هایی از این زبانه هستند كه به خط نوسازی (Line Reconstruction) نیازمند است. 
2. پیش پردازش. برخی زبانها همچون C احتیاج به فاز پیش پردازش برای جایگزینی شروط كامپایل و ماكرو ها دارند.در زبان C فاز پیش پردازش شامل مرحله تحلیل لغوی می شود. 
3. تحلیل لغوی كد متنی مبدا را به اجزای كوچكی كه نشانه(token) نامیده می شود می شكند. هر نشانه واحد ساده ای از زبان است مثل كلمات كلیدی و نام نمادها. نحو نشانه ها نوعا یك زبان باقاعده است، بنابراین یك ماشین حالت متناهی كه برپایه یك عبارت باقاعده بنا می شود می تواند جهت شناخت آن استفاده شود. 
4. تحلیل نحوی شامل تجزیه كردن نشانه های مرتب جهت شناخت ساختار نحوی زبان می باشد. 
5. تحلیل معنایی فازی است كه معنای برنامه را جهت رعایت قوانین زبان بررسی می كند. یك مثال برای این فاز كنترل نوع است. 
 
عقب بندی
گاهی مرحله عقب بندی با مرحله تولید كد اشتباه گرفته می شود. اما می توان گفت كه عقب بندی به مراحل چند گانه زیر تقسیم می شود:
1. تحلیل كامپایلر: این پروسه برای بدست آوردن اطلاعات بیشتر از نمایش میانی فایل های ورودی می باشد. تحلیلگر نوعی تعاریف مختلفی دارد همچون تحلیلگر حلقوی، تحلیلگر وابسطه، تحلیلگر مستعار، تحلیلگر اشاره ای یا غیره می باشد. تحلیل دقیق زیر بنای هر كامپایلرهای بهینه است. گراف فراخوانی و نمودار جریان كنترل معمولا در فاز تجزیه تولید می گردد. 
2. بهینه سازی: نمایش میانی زبان به معادل های پر سرعت تر با شكل های كوتاه تری تبدیل می گردد. از بهینه ساز های محبوبتر می توان به موارد زیر اشاره نمود: توسعه درون خطی، حذف كد های مرده، انتشار ثوابت، تبدیل حلقه ها، تخصیص های ثباتی و موازی سازی خودكار. 
3. تولید كننده كد: زبان میانی تغییر كرده به زبان خروجی مثل زبان ماشین ترجمه می شود. این شامل تخصیص منابع و تصمیمات ذخیره سازی است، مثلا اینكه كدام متغیر به رجستر ها یا حافظه اختصاص یابد و گزینش و زمانبندی دستورات مناسب ماشین . 

" البته در ابتدای امر که در مورد زبانهای تفسیری و کامپایلری گفته بودند باید خاطر نشان کرد که زبانهای تفسیری خط به خط خوانده شده و اجرا میگردد در حالیکه در کامپایلری ابتدا تمام برنامه ترجمه شده و سپس اجرا میگردد پس در زمان اجرا سرعت اجرا شدن زبانهای کامپایلری بیشتر است. اما کشف و تصحیح خطا در تفسیری بهتر و راحت تر است ."
 
همگردان های نمونه
مجموعه همگردان گنو
gcc از ابتدا مخفف Gnu C Compiler بود ولی از زمانی که توانست زبانهای دیگری غیر از C از قبیل C++,Ada,Java,Objective C و Fortran را کامپایل کند بهGnu Compiler Colection تغییر نام داد. پدید آورنده اصلی GCC ریچارد استالمن است کسی که بنیانگذار پروژه Gnu محسوب می شود. نخستین نسخه GCC در سال 1987 انتشار یافت که یک پیشرفت مهم محسوب می شد زیرا محصول جدید اولین کامپایلر بهینه سازی شده قابل حمل ANSI C به عنوان یک نرم افزار آزاد محسوب می شد. در سال 1992 نسخه 2.0 کامپایلر GCC عرضه شد. نسخه جدید قابلیت کامپایل کدهای ++C را نیز داشت. در سال 1997 یک انشعاب آزمایشی در GCC به نام EGCC به منظور بهینه سازی کامپیایلر و پشتیبانی کامل تر از ++C ایجاد شد. در ادامه EGCC به عنوان نسل بعدی کامپایلر GCC پذیرفته شد و تکامل آن باعث انتشار نسخه سوم GCC در سال 2004 گردید. چهارمین نسخه از کامپایلر GCC در سال 2005 عرضه شد.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر