پردازنده های زبان | Language Processors

   · ☕ 6 دقیقه بخوانید · 😎 victor

کامپایلر (compiler)

به زبان ساده کامپایلر برنامه ای هست که می تونه یک برنامه که به یک زبان نوشته شده رو بخونه (زبان مبدا یا source language) و به یک برنامه معادل به زبان دیگه (زبان هدف یا target language) ترجمه کنه
به شکل زیر دقت کنید یک نقش مهم کامپایلر این هست که هر اروری که در زبان مبدا، طی فرایند ترجمه شناسایی می شود را گزارش کند


اگر برنامه مقصد (target program) یک برنامه زبان ماشین (machine-language) با قابلیت اجرایی (executable) باشه در این صورت می تواند توسط کاربر برای پردازش ورودی ها و تولید خروجی مورد نظر فراخوانی بشه به دیاگرام زیر که اجرای یک target program را نشان می دهد توجه کنید

مفسر (interpreter)

یکی دیگه از انواع رایج پردازنده های زبان ( Language Processors ) مفسرها هستند.
مفسر به جای تولید target program به عنوان یک برنامه ترجمه شده، بر اساس source program و ورودی های کاربر (input) مستقیما عملیات های مشخص شده رو اجرا می کنه شکل زیر یک مفسر را نشان می دهد

معایب و مزایای compiler و interpreter

معمولا کد زبان ماشینی که از برنامه هدف (target program) توسط کامپایلر تولید شده است از مفسری که ورودی ها رو به خروجی نگاشت میکنه سریع تر هست در حالی که یک مفسر در تشخیص دادن ارور ها بهتر عمل میکنه چون source program رو خط به خط تفسیر، و دستور به دستور اجرا می کنه

کامپایلر های هیبریدی (hybrid compiler)

برای مثال زبان جاوا با ادغام دو نوع پردازنده زبان مفسری و کامپایلری از یک ماشین مجازی بهره می برد یک برنامه مبدا (source program) جاوا ممکن است اول به یک زبان میانی به نام بایت کد (byte code) کامپایل شود سپس توسط ماشین مجازی (virtual machine) که همان مفسر جاوا هست خط به خط تفسیر می شود
فایده این روش این هست که بایت کد هایی که در یک ماشین کامپایل می شوند می توانند در یک ماشین دیگر تفسیر شوند یا شاید در سرار یک شبکه
البته برای دستیابی به پردازش سریع تر ورودی ها به خروجی، بعضی از انواع کامپایلر های جاوا به نام just-in-time compilers هستند که قبل از این که برنامه های میانی برای پردازش ورودی ها اجرا بشوند بایت کد را بلافاصله به زبان ماشین (صفر و یک) ترجمه می کنند

پیش پردازشگر preprocessor

برای تولید یک target program علاوه بر کامپایلر ممکن است چندین برنامه دیگر نیاز شوند همچنین یک source program ممکن هست به ماژول هایی تقسیم بشه که در فایل های جداگانه ذخیره شده اند.
برای تولید برنامه مبدا برنامه مستقل دیگری به نام پیش پردازنده یا preprocessor همه ی ماژول ها رو گرد آوری می کند و یک برنامه مبدا به عنوان خروجی تولید می کند
علاوه بر گردآوری فایل ها پیش پردازش گر فایل های کتابخانه ای و یا ماکرو ها (macros) رو شناسایی می کند واونا رو به برنامه مبدا اضافه میکند مثلا در کد زبان سی زیر شاید برنامه ما 10 خط باشد ولی بعد از اضافه شدن کتابخانه ها توسط پیش پردازنده ممکن است برنامه مبدا تولید شده حدود 200 خط بشود

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI*r*r)
int main() {
    float radius, area;
    printf("Enter the radius: ");
    scanf("%f", &radius);
    area = circleArea(radius);
    printf("Area = %.2f", area);
    return 0;
}

اسمبلر assembler

بعد از اون source program اصلاح شده (modified) که خروجی پیش پردازنده بود به کامپایلر سپرده میشه کامپایلر ممکن هست یک برنامه با زبان اسمبلی assembly به عنوان خروجی تولید کند چون برای کامپایلر تولید کردن کد اسمبلی به عنوان خروجی و دیباگ کردن آن آسان تر است و بعد از آن زبان اسمبلی توسط برنامه ای به نام اسمبلر assembler پردازش می شود. اسمبلر برنامه ای است که کد اسمبلی را به کد زبان ماشین یا همان صفر ویک با قابلیت جابجایی یا relocatable (کدی که میتواند در هر کجای حافظه بارگزاری شود) تبدیل میکند

منظور از relocateble چیست؟

همینطور که خواندیم اسمبلر زبان اسمبلی رو به زبان ماشین قابل حمل تبدیل میکند برای مثال فرض کنید در ویندوز اسمبلر برای ما یک فایل exe. به عنوان خروجی تولید کند این فایل که در حافظه جانبی(هارد دیسک) قرار داره و میتواند توسط سیستم عامل اجرا بشه هر فایل به صورت بلوک هایی در حافظه جانبی ذخیره شده و آدرس دهی می شوند و آدرس شروع هر فایل از 0 هست هر بلوک که نشان گر یک فایل مثلا exe هست رو فایل زبان ماشین قابل حمل گویند.

اما برای اینکه این فایل زبان ماشین اجرا بشه باید به حافظه اصلی یا (ram) منتقل بشه چرا؟ برای اینکه اولا سرعت رم بیشتر هست و ثانیا فاز اجرا و ذخیره سازی باید از هم دیگر جدا باشند تا مقلا در صورت مشکل در فاز اجرا به برنامه اصلی آسیبی وارد نشه

بار کننده loader

اجرای برنامه ی زبان ماشین توسط سیستم عامل وظیفه لینکر و لودر هست. loader دو وظیفه دارد:

1- تخصیص حافظه: از آنجایی که بخشی از حافظه توسط سیستم عامل و برنامه های دیگه پر شده لودر باید حافظه اصلی رو بررسی کنه و مکانی از حافظه که فضای کافی برای اجرای برنامه زبان ماشین ما داره رو پیدا کنه

2- نگاشت آدرس: وقتی برنامه در ram لود شد باید آدرس نسبی که از صفر شروع شده بود به آدرس واقعی (فیزیکی) در حافظه اصلی نگاشت بشه برای مثال در تصویر زیر فرض کنید برنامه از خانه 2000 به بعد در حافظه اصلی لود می شود پس خانه صفر بلوک کد ماشین به جای آدرس صفر به آدرس 2001 نگاشت می شود

منظور از کد ماشین قابل حمل این هست که می تواند در هر مکانی از حافظه اصلی لود بشود ( در هر بار اجرا ممکن است آدرس های فیزیکی نگاشت شده آن متفاوت باشد مثلا دفعه بعد از خانه 3000 حافظه لود بشود)

فایل های غیر قابل حمل

فایل زبان ماشینی که آدرس نسبی ندارد و نمیتونه در هر مکان از حافظه لود بشه رو فایل غیر قابل حمل میگویند (در بلوک های آن به جای آدرس نسبی آدرس فیزیکی مشخص شده) برای مثال در ویندوز فایل های با پسوند com. از این دسته فایل ها هستند

linker

گاهی اوقات فایل های زبان ماشینی که اجرا می کنیم نیاز دارند که از فایل های دیگری که قبلا در حافظه لود شده اند استفاده کنند شبیه فایل ها وتوابع کتابخانه ای مثلا در ویندوز فایل های DLL یا (dynamic linked library) از این نوع هستند در صورتی که برنامه ما به این کتابخانه ها نیاز داشته باشد یک برنامه به نام linker یک لینک بین برنامه ما و فایل مورد نیاز برقرار می کند.

سوالات

  • تفاوت میان کامپایلر و مفسر چیست؟
  • مزایای یک کامپایلر نسبت به مفسر و مزایای یک مفسر نسبت به کامپایلر چیست؟
  • در سیستم پردازش زبان مزایای تولید کد اسمبلی به جای کد ماشین توسط کامپایلر چیست؟
  • به کامپایلری که یک زبان سطح بالا (نزدیک به زبان انسان) را به زبان های سطح بالای دیگر کامپایل می کند مترجم source-to-source گویند. مزایای این که از زبان C به عنوان زبان هدف برای کامپایلر استفاده کنیم چیست؟
  • وظایف اسمبلر را توضیح دهید؟
اشتراک گذاری این پست