بعد از اینکه مقالاتی در زمینه کامپایلر و مفسر در سایت با عنوان کامپایلر در برنامه نویسی چیست و بررسی انواع کامپایلر و مفسر در برنامه نویسی چیست منتشر کردیم مفسر و کامپایلر در واقع یک زبان برنامه نویسی سطح بالا را به یک زبان قابل فهم برای ماشین تبدیل می کنند. حال باید اقدام به بررسی تفاوت کامپایلر و مفسر کنیم و ببینیم مفسر و کامپایلر چه تفاوت هایی با هم دارند.
قبل از اینکه شروع به بررسی تفاوت کامپایلر و مفسر کنیم باید بدونیم کامپایلر و مفسر چی هستند که یه دید کلی پیدا کنیم و بعدش تفاوت هاشون رو مورد بررسی قرار دهیم. در بخش زیر در مورد این دو توضیحات مختصری ارائه داده ایم.
کامپایلر چییست؟
اگر بخواهیم کامپایلر رو تعریف کنیم و بگیم واقعا کامپایلر چیست باید بگویم مجموعهای از برنامه یا برنامههای کامپیوتری است که متنی از زبان برنامهنویسی سطح بالا (زبان مبدا) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین، تبدیل میکند.
به بیان ساده، کامپایلر برنامهای است که یک برنامه نوشته شده در یک زبان خاص ساختیافته را خوانده و آن را به یک برنامه مقصد (Target Language) تبدیل مینماید. در یکی از مهمترین پروسههای این تبدیل، کامپایلر وجود خطا را در برنامه مبدأ اعلام مینماید.
تعریف یکی از دوستان از کامپایلر، کامپایلر برنامهای رایانهای میباشد که بهمنظور انتقال زبانهای برنامهنویسی سطح بالا به زبانهای سطح پایین مانند زبان اسمبلی و زبان ماشین، جهت اجرایی شدن، طراحی وارائهشدهاند، خروجی این نرمافزار برای ماشینهایی مانند رایانه قابل اجرا هست.
توجه: برای درک بهتر و دقیق تر پیشنهاد میکنم مقاله کامپایلر در برنامه نویسی چیست و بررسی انواع کامپایلر رو کامل مطالعه کنید.
مفسر چیست؟
اگر بخواهیم واضح بگویم مفسر در برنامه نویسی چیست؟ مفسر یک برنامه کامپیوتری است که دستورهای نوشته شده در یک زبان برنامه نویسی را اجرا میکند. مفسر در واقع یک زبان برنامه نویسی سطح بالا را به یک زبان قابل فهم برای ماشین تبدیل می کند.
نکته مهم: در زبان های مفسری کد ها به صورت خط به خط تفسیر و اجرا می شوند و در اجرا بعدی برنامه نیز به همین صورت ادامه می یابد.
همینطور که می دانید هر دستگاه کامپیوتری (کامپیوترهای رومیزی، نوت بوک ها، گوشی های هوشمند، تبلت ها و …) از سخت افزار خاصی ساخته شده است که دارای قسمت های مختلفی از جمله پردازنده (Processor) است. حال اگر بخواهید برای این پردازنده برنامه ای بنویسید که این پردازنده کاری را انجام دهد باید دستورات زبان ماشین خاص آن پردازنده را یکجا نوشته و در یک فایل ذخیره کنید و برای اجرا آن فایل را یکباره به پردازنده بدهید تا اجرا کند.
چون نوشتن به زبان ماشین بسیار نیاز به حوصله و وقت دارد و اشکال زدایی (دیباگ) آن نیز کار پر مشقت و وقت گیر است معمولا از سایر زبان ها استفاده می کنند و آن زبان ها را با “برنامه های خاصی” به زبان ماشین تبدیل می کنند.
اگر آن برنامه خاص تبدیل دستورات به زبان ماشین را به جای یکباره و کامل به صورت دستور به دستور انجام دهد و همان لحظه دستور تبدیل شده (فقط و فقط همان دستور را) برای اجرا به پردازنده تحویل دهد و پس از اجرا دوباره دستور بعد را به زبان ماشین تبدیل کند و به پردازنده تحویل دهد و … این ماجرا تا به انتهای دستورات به صورت خط به خط تکرار شود و دستورات زبان ماشین توسط پردازنده فقط اجرا شوند و در فایلی ذخیره نشوند به آن برنامه خاص اینترپرتر یا مفسر می گویند.
توجه: برای درک بهتر و دقیق تر پیشنهاد میکنم مقاله مفسر در برنامه نویسی چیست رو کامل مطالعه کنید.
تفاوت کامپایلر و مفسر
هردوی این گروه ها در واقع یک زبان برنامه نویسی سطح بالا را به یک زبان قابل فهم برای ماشین تبدیل می کنند، اما تفاوت آنها در این می باشد که در زبان های کامپایلری ابتدا یکبار کد ها به صورت کامل ترجمه می گردند و سپس برنامه برای اجرا از روی فایل کامپایل شده اجرا می گردد. اما در زبان های مفسری کد ها به صورت خط به خط تفسیر و اجرا می شوند و در اجرا بعدی برنامه نیز به همین صورت ادامه می یابد.
یکی از تفاوت های این زبان ها این می باشد که زبان مفسر برای اجرا نیاز به یک نرم افزار مفسر یا interpreter دارد اما زبان کامپایلر تنها یکبار کامپایل شده و از آن پس بر روی هر سیستمی قابل اجرا می باشد. اما همین نکته این تفاوت را ایجاد می کند که، زبان کامپایلر وابسته به سیستم عامل است، یعنی در صورتی اجرا خواهد شد که در آن سیستم عامل کامپایل شده باشد و در سیستم عامل های دیگر اجرا نخواهد شد. اما زبان مفسر در هر سیستم عاملی که نرم افزار مفسر آن وجود داشته باشد اجرا و تفسیر می گردد و در واقع وابسته به سیستم عامل نیست.
دیگر تفاوت این زبان ها سرعت اجرا و میزان استفاده از منابع می باشدو با توجه به این نکته که زبان های Interpreter کد ها را به صورت خط به خط تفسیر و اجرا می کنند، این امر باعث می شود تا مقدار زیادی از CPU و RAM کامپیوتر استفاده شود و قطعا مشخص است که سرعت پایین تری نیز خواهد داشت. اما امتیاز کامپایل شدن یکباره ی زبان های کامپایلر این است که در اجرا های متعدد سبک تر بوده و سرعت بهتری خواهند داشت.
همین مزیت یک مرتبه به صورت کامل کامپایل شدن زبان های کامپایلر در بخش ایراد سنجی و رفع مشکل نقص به حساب می آید. زیرا در زبان های مفسر هنگامی که برنامه خط به خط اجرا می شود، در هر بخشی از برنامه که مشکلی وجود داشته باشد قابل پیدا کردن و رفع می باشد اما در زبان های Compiler برای رفع یک مشکل در کد ها می بایست سورس خود برنامه را مجدد بازبانی کرد و خطا را پیدا کرده و تصحیح کرد، که بسیار دشوار تر از زبان های مفسری می باشد.
برای بررسی تفاوت کامپایلر و مفسر ابتدا به صورت کلی تفاوت کامپایلر و مفسر رو مورد بررسی قرار میدهیم و بعد در قالب ۱۴ مورد این تفاوتها رو بررسی می کنیم.
- زبان های مفسری بصورت خط به خط کدها را خوانده و اجرا می کنند
- زبان های کامپایلری به یکباره کد برنامه را خوانده و آن را هر زمان که نیاز باشد اجرا می کنند
- برنامه ها در زبان های مفسری وابستگی به سیستم عامل ندارند و در هر سیستم عاملی قابل اجرا هستند
- برنامه ها در زبان های کامپایلری برای هر سیستم عامل متفاوتی بایستی تغییر کد و مجددا کامپایل شوند
- برای اجرا یک برنامه مفسری باید مفسیر مورد نظر بر روی سیستم عامل حتما نصب شده باشد
- برای اجرا یک برنامه کامپایلری نیازی به وجود داشتن کامپایلر بر روی سیستم عامل نمی باشد
- سرعت اجرای برنامه های مفسری بسیار کند است
- سرعت اجرای برنامه های کامپایلری بسیار سریع است
- خطایابی کدهای اجرایی در برنامه های مفسری با توجه به اجرا خط به خط آسانتر است
- خطایابی کدهای اجرایی در برنامه های کامپایلری با توجه به اجرای کامل برنامه کمی دشوارتر است
۱- پروسه توسعه نرمافزار
کامپایلر: برنامه را میسازد سپس همه دستورات زبان را از نظر درستی تجزیه و تحلیل میکند و اگر دستوری غلط باشد، ارور میدهد و اگر همهٔ دستورات درست باشند، سورسکد را به کد ماشین تبدیل میکند. فایلهای مختلفی را به برنامه اجرایی (همان فایل exe) اضافه میکند و در نهایت برنامه را اجرا میکند.
مفسر: برنامه را میسازد. خبری از افزودن فایلی اجرایی به برنامه یا تولید کد ماشین نیست بلکه دستورات سورسکد خط به خط در حین اصطلاحاً Run-time اجرا میکند.
۲- مزایا
کامپایلر: کد برنامه کاملاً به کد ماشین ترجمه شده است؛ بنابراین زمان اجرای آن کمتر است.
مفسر: استفاده از مفسرها به خصوص برای دولوپرهای مبتدی آسانتر است.
۳- معایب
کامپایلر: برای تغییر برنامه حتماً باید به سورسکد آن مراجعه شده و در صورت وجود باگ در برنامه، بایستی مجدد کامپایل گردد.
مفسر: اپلیکیشنهای نوشته شده با زبانهای تفسیری تنها بر روی کامپیوترهایی اجرا میشوند که مفسر مربوطه روی آنها نصب باشد.
۴- سرعت اجرا
کامپایلر: کدهای کامپایلشده سریعتر اجرا میشوند.
مفسر: کدهای تفسیری کندتر اجرا میشوند.
۵- فایل خروجی
کامپایلر: یک خروجی تولید میکند (با فرمت exe) که میتواند بدون نیاز به سورسکد اصلی اجرا شود.
مفسر: هیچگونه فایلاجرایی تولید نمیکند.
۶- اجرا
کامپایلر: اجرای برنامه از فرآیند کامپایل آن جدا است به طوری که اجرای برنامه تنها زمانی اتفاق میافتد که کل کدها کامپایل شده باشند.
مفسر: اجرای برنامه بخشی از فرآیند تفسیر آن است؛ بنابراین برنامه خط به خط اجرا میشود.
۷- بهینهسازی کد
کامپایلر: کامپایلر همهٔ کد را یکجا میبیند و از همین روی بهینهسازیهای زیادی را برای اجرای سریعتر کد انجام میدهد.
مفسر: مفسرها کد را خط به خط میبینند و لذا بهینهسازیهایی که انجام میگیرد به اندازه کامپایلرها قوی نیستند.
۸- تایپ دینامیک
کامپایلر: پیادهسازی آن در کامپایلرها دشوار است چون کامپایلرها نمیتوانند پیشبینی کنند که در حین اجرا چه اتفاقی میافتد.
مفسر: زبانهای تفسیری به خوبی از تایپ دینامیک پشتیبانی میکنند.
۹- کاربرد
کامپایلر: بیشتر مناسب Production Environment است و از سرعت اجرای به مراتب بیشتری برخوردار است.
مفسر: بیشتر مناسب Development Environment است و سرعت توسعهٔ نرمافزار را بالا میبرد چرا که در صورت وجود باگ در برنامه، دائم نیازی به کامپایل مجدد برنامه نیست.
۱۰- مدیریت خطاها
کامپایلر: کامپایلر همهٔ خطاها و اخطارها را در زمان کامپایل نشان میدهد و از همین روی بدون تصحیح کردن خطاها، اجرای برنامه غیرممکن است.
مفسر: اینترپریتر یک خط از دستورات را میخواند و اگر خطایی وجود داشته باشد آن را نشان میدهد به طوری که برای تفسیر خط بعدی باید خطای قبلی برطرف شده باشد.
۱۱- ورودی
کامپایلر: کل برنامه را به عنوان ورودی میگیرد.
مفسر: یک خط از کد را به عنوان ورودی میگیرد.
۱۲- خروجی
کامپایلر: کامپایلرها کد ماشین تولید میکنند.
مفسر: مفسرها هیچ کد ماشینی تولید نمیکنند.
۱۳- خطاها
کامپایلر: همه خطاها را همزمان پس از کامپایل نشان میدهد.
مفسر: خطاهای یک خط از دستورات را یکییکی نمایش میدهد.
۱۴- زبانهای برنامهنویسی تحت پوشش
کامپایلر: Scala ،C# ،C++ ،C و Java همه از کامپایلر استفاده میکنند.
مفسر: Perl ،PHP و Ruby از اینترپریتر استفاده میکنند.
بعد از اینکه تفاوت کامپایلر و مفسر رو مورد بررسی قرار دادیم حال برای اینکه متوجه نحوه کار کامپایلر و مفسر شوید پیشنهاد می کنم تصویر زیر رو مشاهده کنید تا کامل درک درستی از نحوه کار این دو پیدا کنید.