زبان های برنامه نویسی: کامپایلر در مقابل مفسر (مزایا و معایب)
نوآموزان برنامه نویسی و مهندسی نرم افزار ممکن است بارها کلمه کامپایلر یا مفسر را در حیطه زبان های برنامه نویسی شنیده باشند، اما اطلاعات دقیق از آن ها ندارند. مثلاً اینکه شنیده می شود که زبان پایتون یک زبان مفسری است و کامپایلری نیست، آیا یک مزیت است یا یک عیب؟ همانطور که می دانید و مطابق شکل زیر، کامپایلر (یا مفسر) یک برنامه سطح پایین سیستمی است (منظور از برنامه سطح پایین یعنی برنامه ای که درگیر با پردازنده و منابع سخت افزاری است) که برنامه ای که شما نوشته اید (معروف به Source code یا کد منبع) را گرفته و پس از بررسی و خطایابی تبدیل به دستورالعمل های پردازنده می کند تا برنامه بتواند روی CPU اجرا شود. خیلی ها نمی دانند که زبان های برنامه نویسی در سطح بالا هستند یعنی برای راحتی کارِ برنامه نویسان، شبیه به زبان محاوره ای انگلیسی طراحی شده اند. حال آنکه پردازنده ی کامپیوتر فقط کدها یا دستورالعمل های ماشین ( به شکل صفر و یک) را می شناسد و بنابراین جهت اجرای برنامه های نوشته شده توسط برنامه نویس، این برنامه ها باید توسط کامپایلر یا مفسر به شکل دستورالعمل های قابل اجرا روی پردازنده تبدیل شوند.
1- کامپایلر (Compiler):
همانگونه از دیاگرام سمت چپ در شکل پیداست. در زبان های برنامه نویسی که از کامپایلر استفاده می کنند مانند زبان C و C++، برنامه ابتدا توسط کامپایلر بطور کامل خوانده شده و خطایابی شده و در صورت عدم وجود خطا به یک فایل میانی با پسوند .obj تبدیل می شود. در ادامه، در صورتی که برنامه نویس از توابع و پکیج های خارجیِ کتابخانه زبان استفاده کرده باشد، کدهای لازم توسط Linker به فایل obj اضافه شده و فایل اجرایی نهایی با پسوند .exe ساخته می شود. از این پس با هر بار اجرا، فقط این فایل exe ی اجرایی است که اجرا شده و برنامه نیاز به کامپایل مجدد ندارد (مگر آنکه بخواهید برنامه را تغییر دهید). این امر سرعت اجرای برنامه را افزایش می دهد.
شایان ذکر است که این فرآیند اکنون برای سیستم عامل (سکو | پلتفرم) ویندوز به تصویر کشیده است یعنی فایل اجرایی نهایی که تولید می شود در ویندوز با پسوند exe می باشد و در صورتی که این فایل را روی موبایل یا سایر پلتفرم ها ببرید، قابل اجرا نخواهد بود! و به همین علت است که می گویند برنامه های تولید شده به زبان های کامپایلری، قابلیت حمل یا جابجایی پایینی دارند که در دنیای چندسکویی امروزی یک عیب بزرگ محسوب می شود.
2- مفسر (Interpreter):
مطابق دیاگرام سمت راست در شکل، در زبان هایی که از مفسر به جای کامپایلر استفاده می شود (مانند زبان های جاوا-اسکریپت، بیسیک و پایتون)، با هر بار اجرای برنامه (چه تغییر کرده باشد یا نکرده باشد!)، آن برنامه خط به خط خوانده شده، خطایابی شده، تبدیل به دستورالعملِ قابل اجرا توسط پردازنده شده و در نهایت اجرا می شود. این سیاست باعث می شود که در صورتی که برنامه را تغییر نداده باشید، باز هم برنامه مجدداً تفسیر گردد که سرعت اجرای برنامه را کاهش می دهد. در مقابلِ این عیب، استفاده از مفسر به جای کامپایلر مزیت های زیر را داراست:
• قابلیت حمل: از آنجایی که مفسر، برنامه نوشته شده را هر بار مجدداً کامپایل (خطایابی | ترجمه) و اجرا می کند، لذا می تواند برنامه را به هر نوع دستورالعمل پردازنده ای که اکنون روی سیستم است ترجمه کرده و بدین ترتیب می توانید برنامه ی نوشته شده را روی سکوهای مختلف (Platform) منتقل کرده و اجرا کنید (فقط لازم است که مفسر در آنجا نیز وجود داشته باشد).
• مدیریت خطا و استثنائات: از آنجایی که برنامه، خط به خط اجرا می شود. ممکن است علیرغم وجود خطا در بخش هایی از برنامه ی نوشته شده، در مسیر اجرایی که اکنون طی می کند خطایی وجود نداشته باشد و برنامه بتواند اجرا شود. همچنین ممکن است خودِ مفسر بتواند به صورت هوشمند برخی خطاها ها را اصلاح کند یا برنامه نویس بخواهد برای رخداد خطا، کدی بنویسد که خطا را اصلاح کرده یا نادیده بگیرد. بدین ترتیب توسعه برنامه های پیچیده و چالشی، بسیار ساده تر است.
• مدیریت داده ها و حافظه: از آنجایی که مفسر، برنامه را خط به خط اجرا می کند، سابقه داده ها در حافظه را در اختیار دارد و بدین ترتیب به صورت هوشمند و در زمان اجرا می تواند نوع داده ها را به همدیگر تبدیل یا اصلاح کند (مثلاً اعداد اعشاری را به صحیح تبدیل کند یا بالعکس). همچنین در صورت کمبود حافظه اصلی سیستم می تواند به صورت هوشمند تنها بخشی از داده ها که اکنون مورد نیاز است را بارگزاری کند که این مساله برای برنامه های بزرگ و برنامه های هوش مصنوعی در عصر داده های حجیم (Big data) بسیار مهم است.
نتیجه گیری و سخن آخر
با مدنظر قرار دادن موارد مطرح شده در این مقاله، هر کدام از زبان های برنامه نویسی کامپایلری و مفسری مزایا و معایب خواص خود را دارند. استفاده از کامپایلر، اجرای برنامه را سریعتر کرده اما بسیار سخت گیرانه بوده و در صورت وجود کوچکترین خطا، برنامه اجرا نخواهد شد! همچنین با توجه به آنکه فایل نهایی بسته به سکو (Platform) فعلی ساخته می شود، اینگونه برنامه ها، قابل حمل روی سکوهای دیگر نیستند؛ مثلاً فایل exe که در سیستم عامل ویندوز قابل اجراست، در وب یا موبایل یا سیستم عامل لینوکس و مک قابل اجرا نیست. در مقابل برنامه های مفسری، سرعت اجرای پایین تری دارند اما مزایایی از جمله قابلیت حمل بالا، مدیریت قوی خطاها و استثنائات و همچنین مدیریت قوی داده ها و حافظه باعث شده که مورد توجه ویژه قرار گیرند.
در همین میان، زبان های برنامه نویسی ترکیبی مانند C# و Java وجود دارند که از هر دو تکنیک استفاده می کنند تا از مزایای هر دو تکنیک بهره ببرند. مثلاً در زبان جاوا، برنامه ی نوشته شده توسط برنامه نویس با پسوند .java ابتدا کامپایل شده به فایل میانی با پسوند .class تبدیل می شود. سپس این فایل میانی روی هر کامپیوتری با هر سیستم عاملی که ماشین مجازی جاوا (JVM | JRE) به عنوان مفسر نصب شده باشد، قابل اجراست.
این مقاله، بخش کوچکی از مباحث تشریح شده در دوره صفر تا صد مبانی کامپیوتر و اصول برنامه نویسی از آکادمی هوش تجاری جنوب است که توسط آقای دکتر بویری (مدرس و استادیار دانشگاه) تدریس شده است.