هدف یک کامپایلر در کامپیوتر این است که یک برنامه را از زبان مبدا به زبان مقصد تبدیل کند. کامپایلر تبدیل یک برنامه از زبان مبدا به زبان مقصد را به سادگی انجام می دهد و معنای برنامه مبدا در حین این تبدیل، تغییر نمی کند. در واقع پس از آن که یک برنامه از زبان مبدا به زبان مقصد تغییر پیدا کرد، باز هم دو برنامه مبدا و مقصد معادل هم هستند. در واقع اگر بخواهیم با زبان ساده توضیح دهیم که کامپایلر چیست و انواع آن را نیز بیان کنیم، باید بگوییم که یک کامپایلر برای تبدیل یک برنامه در یک زبان سطح بالا به یک برنامه در یک زبان سطح پایین استفاده می شود. البته کامپایلر علاوه بر تبدیل یک برنامه از زبان سطح بالا به زبان سطح پایین، وظایف دیگری نیز دارد. یک کامپایلر در کامپیوتر می تواند خطاهای موجود در برنامه منبع که معمولا با زبان سطح بالا نوشته شده است را نیز مشخص کند.
با این وجود، تنوع گسترده ای از زبان های مبدأ و زبان های مقصد وجود دارد. زبان مبدأ از زبانهای برنامه نویسی سنتی مانند جاوا، سی شارپ، پرل، ویژوال بیسیک تا برخی از زبانهای تخصصی که تقریباً در هر زمینهای از برنامههای رایانهای مانند روبی، پایتون تکامل یافتهاند، متغیر است.
نکته ای که در زمینه زبان مقصد باید به آن دقت کنید این است که زبان مقصد حتما لازم نیست که یک زبان برنامه نویسی باشد. در واقع، زبان مقصد می تواند یک زبان ماشین یک کامپیوتر خاص باشد که بین ریزپردازنده و یک ابر کامپیوتر قرار گرفته است.
اگر بخواهیم بهتر توضیح دهیم که کامپایلر چیست و انواع آن را نیز بیان کنیم، باید بگوییم که کامپایلر متناسب با هدف و ساختارش، از انواع مختلفی از جمله تک گذر، دو پاس و چند پاس تشکیل شده است. در ادامه مقاله سعی می کنیم به این مسئله بپردازیم که کامپایلر چیست و انواع آن را توضیح دهیم.
انواع کامپایلر
در بخش قبل توضیح دادیم که کامپایلر چیست و انواع آن را نیز بیان کردیم. در این بخش قصد داریم تا انواع کامپایلر به صورت دقیق تری بررسی کنیم تا بهتر متوجه شوید که کامپایلر چیست و انواع آن چه می باشد.
-
کامپایلر تک گذر
تمامی کامپایلرها از شش فاز تشکیل شده اند. شش فازی که تشکیل دهنده کامپایلرها هستند شامل فاز تحلیل واژگانی، فاز تحلیل نحوی، فاز تحلیل معنایی، فاز تولید کد میانی، فاز بهینه سازی کد و فاز تولید کد است. در نتیجه، اگر همه این فازها در یک ماژول واحد قرار بگیرند و کامپایلری با ساختاری شکل گرفته از این شش فاز داشته باشیم، با یک کامپایلر تک گذر رو به رو هستیم.
از آن جا که کامپایلر تک گذر یا تک پاس تمام مراحل را در یک ماژول واحد پیاده سازی می کند و می گذراند، فضای بیشتری را در حافظه اصلی اشغال می کند. از طرف دیگر یکی از مزیت های کامپایلر تک گذر یا تک پاس این است که نسبت به دیگر کامپایلر ها سریع تر کامپایل می شود زیرا برای کامپایل کردن نیازی ندارد کدهای میانی را تولید کند. دلیل این مسئله هم این است که تمام فازها در یک ماژول پیاده سازی می شوند. اگر بخواهیم مثالی از کامپایل تک گذر بیان کنیم می توانیم به کامپایلر پاسکال بپردازیم.
-
کامپایلر دو پاس
در کامپایلر دو پاس، شش فازی که کامپایلر ها را تشکیل داده اند در دو ماژول پیاده سازی شده اند. البته تنها یک ماژول از کامپایلر دو پاس در حافظه اصلی قرار می گیرد و برنامه منبع از طریق ماژول اول پردازش می شود. سپس کد میانی که به وسیله ماژول اول ایجاد شده، ذخیره می شود و ماژول اول با ماژول دوم کامپایلر در حافظه اصلی جایگزین می شود.
در نتیجه، در این زمان کد میانی که به وسیله ماژول اول تولید شده به عنوان ورودی به ماژول دوم ارائه می شود که به نوبه خود برنامه هدف را تولید می کند. بنابراین، به این ترتیب کد هدف در دو پاس تولید می شود، به همین دلیل به آن کامپایلر دو پاسی می گویند.
اگر روش کار کامپایلر دو پاس را با کامپایلر تک گذر مقایسه کنیم، متوجه می شویم که کامپایلر دو پاس حجم کمتری در حافظه کامپیوتر اشغال می کند اما از طرفی کامپایلر تک گذر سرعت عمل بیشتری در کامپایل کردن دارد زیرا نیازی به تولید کدهای میانی ندارد.
-
کامپایلر چند گذری
در یک کامپایلر چند گذری، مراحل کامپایلر با چندین ماژول پیاده سازی می شود. روش کار کامپایلر چند گذری به این صورت است که فقط یک ماژول در حافظه اصلی قرار می گیرد و کد میانی تولید شده به وسیله آن ذخیره می شود و سپس ماژول با ماژول بعدی جایگزین می شود.
همچنین در ادامه، کد میانی تولید شده به وسیله ماژول قبلی به عنوان ورودی به ماژول بعدی ارائه می شود. این فرآیند تا زمانی که برنامه هدف تولید شود ادامه می یابد. کامپایلر چند گذری در مقایسه با تک گذر کندتر است اما فضای کمتری را در حافظه اصلی مصرف می کند زیرا هر بار فقط یک ماژول از آن در حافظه اصلی قرار می گیرد. اگر بخواهیم با مثالی، کامپایلر چند گذری را به شما معرفی کنیم، می توانیم به کامپایلر جاوا اشاره کنیم.