(مبانی برنامه نویسی) کامپایلر ( Compiler ) چیست ؟؟ اصول (طراحی و ساخت و آشنایی)

پژوهشگر و نویسنده: (  افشین رشید )


نکته: کامپایلر ( Compiler ) برنامه ای است که یک برنامه نوشته شده در یک زبان به نام زبان منبع ( Language Source ) را به برنامه ای معادل به زبانی دیگر به نام زبان مقصد ( Language Target ) ترجمه می کند.

در کنار شش مرحله اصلی کامپایلر دو بخش دیگر بنام خطاپرداز ( Handler Error ) و جدول علائم ( Table Symbol ) نیز وجود دارد.

عملیات کامپایل در شش مرحله زیر صورت می گیرد :

تحلیل واژه ای (Analysis Lexical)

( Syntax Analysis )  تحلیل نحوی

(Semantic Analysis) تحلیل معنایی

(Intermediate Code Generation) تولید کد بینابینی 

بهینه سازی کد (OptimizationCode) 

تولید کد نهایی (Generation Code)

در مرحله اول کامپایل یعنی تحلیل واژه ای برنامه ورودی نویسه به نویسه خوانده شده و به دنباله ای از نشانه ها ( Tokens) تبدیل می گردد.انواع مختلف نشانه ها عبارتند از :کلمات کلیدی  (Keywords) , عملگرها ( Operators) ,  جداکننده ها ( Delimeters) ,  ثابت ها (Literals), شناسه ها (Identifiers) که به اسامی متغیرها و توابع و رویه ها و بطور کلی اسامی که کاربر انتخاب می کند گفته می شود .در اغلب زبان های برنامه سازی کلمات کلیدی رزرو شده اند بدین معنی که کاربر مجاز نیست از هیچیک از آنها به عنوان اسم یک متغیر ، تابع و یا رویه استفاده نماید .اما در برخی از زبانها مثل 1/PL این محدودیت وجود ندارد.در مرحله دوم برنامه از نظر خطاهای نحوی مورد بررسی قرار می گیرد و با  استفاده از  نشانه های تولید شده در مرحله تحلیل واژه ای یک درخت نحو (Tree Syntax)ایجاد می گردد.در مرحله سوم با استفاده از درخت نحو تولید شده در مرحله قبلی برنامه ورودی از نظر خطاهای مفهومی احتمالی بررسی می شود.در مرحله تولید کد بینابینی یک برنامه که معادل برنامه اصلی است با یک زبان بینابینی تولید می شود.با ایجاد این کد بینابینی عملیات بعدی که کامپایلر باید انجام دهد آسان میگردد.در انتخاب زبان بینابینی باید موارد زیردر نظر گرفته شوند :

1 .تولید و بهینه سازی کد بینابینی باید ساده باشد.

2 .ترجمه آن به برنامه مقصد نیزبه راحتی صورت پذیرد.

در مرحله بهینه سازی کوشش می شود تا کد بینابینی تولید شده در مرحله قبلی به نحوی بهبود داده شود بطوریکه این کار مسبب تولید کدی می شود که از لحاظ اجرایی سریعتر می باشد. سرانجام در بخش تولید کد نهایی کد مورد نظر بصورت برنامه مقصد تولید می شود.به عبارت دیگر هر کدام از کد های بینابینی بهبود یافته به مجموعه ای از دستورات ماشین که کار مشابهی انجام می دهند تبدیل می گردند.

خطاپرداز

هر بار که خطایی در یکی از مرحله ها پیش بیاید رویه ای بنام خطا پرداز فراخوانده می شود. این بخش سعی می کند خطا را به نحوی برطرف کند که در نتیجه کامپایلر بتواند خطا های بیشتری را در برنامه تشخیص دهد و با اولین خطای موجود در برنامه عمل کامپایل متوقف نگردد.معمولا پارسر و اسکنر بیشتر خطاهایی را که در یک برنامه ممکن است وجود داشته باشد تشخیص می دهند.یکی از کارهای مهم و اساسی یک کامپایلر ثبت شناسه های استفاده شده در برنامه ورودی ( منبع ) و جمع آوری اطلاعات درباره مشخصات هر شناسه است .این مشخصات می توانند شامل : آدرس حافظه اختصاص داده شده به شناسه , نوع  آن , محلی از برنامه که این شناسه در آن تعریف شده است (Scope) و در رابطه با رویه ها اسم آنها ,تعداد و نوع آرگومانهای آنها , روشی که به آن طریق آرگومانها به رویه ها فرستاده می شوند.مثلا Reference by Call یا Value by Call و نوع نتیجه ای که رویه ها باز می گردانند باشد.در جدول نشانه ها به ازای هر شناسه یک رکورد وجود دارد که این رکورد ها شامل مشخصات شناسه ها میباشند .این جدول امکان دستیابی سریع به شناسه ها و مشخصات آنها را به ما می دهد .در کامپایلر و در مرحله تحلیل لغوی کلیه شناسه های موجود در برنامه اصلی وارد جدول نشانه ها می شوند .در مرحله های دیگر کامپایل این اطلاعات به جدول اضافه خواهند شد و سپس از آنها در موارد مختلف استفاده خواهد شد.

کامپایلرها ( Back-End ) انتهای و(Front-End ) 

به چهار مرحـله اول کامپــایل و بخشی از مرحله بهــینه سازی که بستـــگی به زبــان منــبع(Program source ) دارد و مستقل از ماشین است End-Front کامپایلر گویند. به بخشی از مرحله بهینه سازی و مرحله آخر کامپایل که وابسته به ماشین مقصد است End-Back کامپایلر می گویند .معمولا این بخش از کامپایلر وابسته به زبان منبع نیست.شکل بعد ترجمه دستور 60*r+i:=p و تاثیر هر مرحله از کامپایلر بر روی این دستور را نشان می دهد.( r , p , i همگی از نوع real هستند)

نویسنده: دکتر (افشین رشید )