تفاوت کامپایلر و مفسر چیست؟ | Compiler در مقابل Interpreter
تفاوت کامپایلر و مفسر چیست؟ شاید شما نیز بارها اسم Compiler و Interpreter در برنامه نویسی را شنیده باشید اما با تفاوت بین زبانهای برنامه نویسی کامپایلری و مفسری آشنا نباشید. در این مقاله نقش کامپایلر و مفسر در برنامه نویسی را بررسی میکنیم و به مزایا و معایب زبانهای برنامه نویسی کامپایلری و مفسری میپردازیم.
در این مقاله به موضوعات زیر خواهیم پرداخت:
- زبان برنامه نویسی چیست؟
- کامپایلر چیست؟
- زبانهای برنامه نویسی کامپایلری
- مفسر چیست؟
- زبانهای برنامه نویسی مفسری
- شباهت کامپایلر و مفسر چیست؟
- تفاوت کامپایلر و مفسر چیست؟
- سرعت اجرای برنامه در زبانهای کامپایلری بیشتر است یا زبانهای مفسری؟
- خطایابی (Debug) در زبانهای کامپایلری آسانتر است یا زبانهای مفسری؟
- زبانهای کامپایلری به سیستم عامل وابسته اند یا زبانهای مفسری؟
زبان برنامه نویسی چیست؟
قبل از اینکه به تفاوت کامپایلر و مفسر در برنامه نویسی بپردازیم، ابتدا به یک تعریف ساده از زبانهای برنامه نویسی بپردازیم تا پاسخ به سوال «تفاوت کامپایلر و مفسر چیست؟» برای شما آسانتر و قابل فهمتر باشد.
فرض کنید شما در کشور ایران و در شهر تهران به دنیا آمدهاید. زبان تعامل شما و دوستانتان در تهران چیست؟ قطعا «زبان فارسی» زبان تعامل شما در تهران است. اگر شما در شهر لندن (انگلستان) زندگی کنید زبان تعاملتان چگونه خواهد بود؟ «زبان انگلیسی» زبان تعامل شما در شهر لندن است.
اگر شما به لندن سفر کنید و بخواهید با زبان فارسی با یک شهورند لندنی صحبت کنید آیا زبان شما را خواهد فهمید؟ قطعا پاسخ شما «نه» خواهد بود. برای این کار یا باید خودتان زبان انگلیسی بلد باشید یا باید یک مترجم زبان انگلیسی در کنار شما باشد. تا صحبتهای شما را برای آن شخص ترجمه کنید.
اگر یک انسان بخواهد با کامپیوتر صحبت کند و تعامل برقرار کند چه زبانی نیاز است؟ زبان مادری کامپیوتر، «زبان ماشین» است. وقتی در زبان برنامه نویسی سطح بالا کد مینویسیم، این کدها، برای کامپیوترها قابل فهم نیست و برای اینکه قابل فهم باشید، باید یک مترجم واسط باشد تا این کدها را به «زبان ماشین» تبدیل کند که برای کامپیوترها قابل پردازش و فهم باشد و خروجی آن تبدیل به یک «برنامه» شود.
نام این مترجم بین انسان و کامپیوتر، «کامپایلر» و «مفسر» است. کامپایلر و مفسر یک نرمافزاری هستند که کدهای برنامه نویسی را به «زبان ماشین» که برای کامپیوتر قابل فهم باشد تبدیل میکند. در زبانهای برنامه نویسی سطح پایین مانند «زبان ماشین»، ترجمه نیازی نیست چون مستقیم با زبان کامپیوتر کد مینویسیم. پس در زبانهای برنامه نویسی سطح بالا نیاز به ترجمه است ولی در زبان برنامه نویسی سطح پایین یا «زبان ماشین» ترجمه نیازی نیست.
اما تفاوت کامپایلر و مفسر چیست؟ در ادامه این مقاله از دولوپرشو به تعریف کامپایلر و مفسر میپردازیم.
کامپایلر چیست؟
کامپایلر در برنامه نویسی چیست؟ در قسمت بالا گفتبم، برای این که کدهای برنامه نویسی به کامپیوتر قابل فهم باشد، باید تبدیل به «زبان ماشین» شود تا کامپیوترها بتوانند آن را پردازش کنند. کامپایلر به انگلیسی Compiler، یک نرمافزاری است که کدهای برنامه نویسی را به «زبان ماشین» تبدیل میکند.
در کامپایلر باید قبل از اجرای برنامه، کدها یکبار به زبان ماشین کامپایل شوند تا برنامه به درستی اجرا شود. هر تغییر کوچکی در کدها اعمال شود، باید یکبار کدها از اول کامپایل شوند. بعد از کامپایل شدن کدها، یک فایل خروجی از برنامه (برای مثال exe) برای اجرا ساخته میشود.
اگر خطایی در کدها وجود داشته باشد، کدها کامپایل نمیشوند و خروجی فایل تحویل داده نمیشود و با خطای Compile error مواجه میشویم. وقتی یکبار کد کامپایل شود، خروجی آن فایل، «زبان ماشین» است. برای اجرای این فایل در دفعات بعدی نیاز به کامپایل دوباره نیست چون یکبار این کدها به زبان ماشین ترجمه شدهاند اما اگر یک تغییر کوچک در کد ایجاد شود، باید دوباره از اول همهی کدها کامپایل شوند تا فایل جدید ساخته شود.
زبانهای برنامه نویسی کامپایلری
چه زبانهایی کامپایلری هستند؟ در زیر نمونهای از زبانهای برنامه نویسی کامپایلری را برای شما نام بردهایم:
- C
- ++C
- #C
- Java
- Go
مفسر چیست؟
مفسر در برنامه نویسی چیست؟ مفسر به انگلیسی Interpreter نیز مانند کامپایلر، نرمافزاری است که کدهای برنامه نویسی را از زبان سطح بالای قابل فهم برای انسان به زبان قابل فهم برای کامپیوتر یا «زبان ماشین» تبدیل میکند. پس تفاوت کامپایلر با مفسر چیست؟
در کامپایلر، پیش از اجرای برنامه باید کدها به «زبان ماشین» ترجمه شوند اما در مفسر موقع اجرای برنامه بهصورت خط به خط به «زبان ماشین» ترجمه میشوند. در کامپایلرها قبل از اجرای برنامه وقتی کدها کامپایل میشوند یک فایل خروجی (مانند exe) به ما تحویل داده میشود اما در مفسر، فایل خروجی به ما تحویل داده نمیشود بنابراین برای هر بار اجرا، باید خط به خط کدها به زبان ماشین ترجمه شوند. در صورتی که در کامپایلر یک فایل نهایی ایجاد میشود که در اجرای بعدی نیازی به ترجمه کد نیست.
زبانهای برنامه نویسی مفسری
چه زبانهایی مفسری هستند؟ در زیر نمونهای از زبانهای برنامه نویسی مفسری را برای شما نام بردهایم:
- JavaScript
- PHP
- Python
- Ruby
شباهت کامپایلر و مفسر چیست؟
با تعریفی که از کامپایلر و مفسر در قسمت بالا کردیم، متوجه شدیم که شباهت کامپایلر و مفسر در این است که هر دو یک نرمافزاری هستند که کدهای زبان برنامه نویسی سطح بالا را که برای انسان قابل فهم است، به کدهای زبان برنامه نویسی سطح پایین یعنی «زبان ماشین» تبدیل میکنند تا برای کامپیوتر قابل فهم باشند. پس تفاوت زبانهای برنامه نویسی کامپایلری با زبانهای برنامه نویسی مفسری چیست؟ در ادامه مقاله به تفاوت زبان کامپایلری با مفسری خواهیم پرداخت.
تفاوت کامپایلر و مفسر چیست؟
از تعریفی که در قسمت بالا از کامپایلر و مفسر کردیم، اینگونه استنباط میشود که:
- در زبانهای کامپایلری قبل از اجرای برنامه، همهی کدها به یکباره به «زبان ماشین» تبدیل میشوند. اما در زبانهای مفسری موقع اجرای برنامه، کدها بهصورت خط به خط به زبان ماشین ترجمه میشوند.
- در زبانهای کامپایلری بعد از کامپایل شدن یک فایل خروجی (مانند exe) ساخته میشود که به زبان ماشین ترجمه شده است و در دفعات بعدی نیازی به کامپایل و ترجمه دوباره کدها نیست. اما در زبانهای مفسری هیچ فایل خروجی ساخته نمیشود و همیشه موقع اجرا، این کدها بهصورت خط به خط به «زبان ماشین» ترجمه میشوند.
- اگر خطایی در کد زبانهای برنامه نویسی کامپایلری رخ بدهد، کامپایلر با خطای Compile error مواجه میشود و فایل خروجی ساخته نمیشود و نمیتوان آن را اجرا کرد. اگر در کد زبانهای برنامه نویسی مفسری خطایی رخ دهد، چون بهصورت خط به خط این ترجمه انجام میشود، برنامه تا زمانی که خطایی در کد وجود نداشته باشد اجرا شده و موقع رسیدن به آن خط از کد که خطا وجود دارد، برنامه متوقف میشود.
- سرعت اجرای برنامه در زبانهای کامپایلری به دلیل اینکه خروجی کامپایل شده برای دفعات بعدی نیاز به ترجمه نیس، بالاتر از سرعت اجرای برنامه در زبانهای مفسری است چون که همیشه موقع اجرا این ترجمه باید انجام شود و مقداری زمانبر است.
- پیدا کردن باگ (Bug) در زبانهای برنامه نویسی مفسری آسانتر از زبانهای برنامه نویسی کامپایلری است، چون در زبانهای مفسری بهصورت خط به خط ترجمه انجام میشود و در هر خط از کد، خطا (Bug) وجود داشته باشد، برنامه متوقف شده و خطا در آن خط قابل مشاهده است اما در زبانهای کامپایلری چون کل کدها کامپایل میشوند، موقع خطا، متوجه نمیشویم که در کدام یک از خطها باگ وجود دارد.
- زبان مفسری وابسته به سیستمعامل نیست اما زبان کامپایلری به سیستمعامل وابسته است. در زبان مفسری کدها چون در هر اجرای برنامه ترجمه میشوند، در هر سیستمعاملی قابل اجرا هستند. اما خروجی زبان کامپایلری، در همان سیستمعاملی قابل اجرا است که در همانجا کامپایل شده است. اگر بخواهیم در سیستمعامل دیگری استفاده کنیم، باید در همان سیستمعامل، کدها دوباره کامپایل شوند.
سرعت اجرای برنامه در زبانهای کامپایلری بیشتر است یا زبانهای مفسری؟
همانطور که در قسمت تفاوت کامپایلر و مفسر اشاره کردیم، سرعت اجرای برنامه در زبانهای برنامه نویسی کامپایلری بیشتر از سرعت اجرای برنامه در زبانهای برنامه نویسی مفسری است. چون در زبانهای کامپایلری بعد از ترجمه یک فایل نهایی (معمولا بهصورت exe) ساخته میشود که در دفعات بعدی اگر تغییری در کد نباشد، آن فایل را بدون ترجمه میتوان اجرا کرد. اما در زبانهای مفسری موقع اجرای برنامه همیشه خط به خط ترجمه میشود و چون خروجی فایل ساخته نمیشود، در اجرای دفعات بعدی نیز نیاز به ترجمه است.
خطایابی (Debug) در زبانهای کامپایلری آسانتر است یا زبانهای مفسری؟
در تفاوت زبانهای کامپایلری و مفسری اشاره کردیم که اشکالزدایی (Debug) در زبانهای مفسری آسانتر از زبانهای کامپایلری است. چون در زبانهای مفسری، کدها خط به خط ترجمه میشوند و در هر خط از اشکالی (Bug) وجود داشته باشد، برنامه در آن خط کد متوقف میشود و خط مورد نظر نمایان میشود. اما در زبانهای کامپایلری، ترجمه کب کدها بهصورت همزمان انجام میشود و اگر خطایی در یک خط از کد وجود داشته باشد، آن خط نمایان نمیشود پس عملیات دیباگ با سختی مواجه میشود.
زبانهای کامپایلری به سیستم عامل وابسته اند یا زبانهای مفسری؟
منظور از وابسته بودن به سیستمعامل این است که آن برنامه در چه پلتفرمی قابل اجرا است؟ ویندوز، لینوکس، اندروید، ios یا وب؟ همانطور که در تفاوت زبانهای کامپایلری و مفسری اشاره شد، زبانهای برنامه نویسی مفسری وابسته به سیستمعامل نیستند و در هر سیستمعاملی قابل اجرا هستند اما زبانهای برنامه نویسی کامپایلری وابسته به سیستمعامل هستند و در همان سیستمعاملی اجرا میشوند که در آن کامپایل شدهاند. اما دلیل این کار چیست؟
زبانهای مفسری چون همیشه در هنگام اجرا، ترجمه میشوند، در هر سیستمعاملی که نرمافزار مفسر وجود داشته باشد، قابل اجرا هستند. اما زبانهای کامپایلری به دلیل اینکه فایل خروجی آنها در آن سیستمعامل ترجمه شده است (برای مثال ویندوز) در سیستمعامل دیگر (مانند لینوکس) قابل اجرا نیستند و برای این کار نیاز است که کدها در سیستمعامل لینوکس نیز کامپایل شوند.
سخن پایانی:
در این مقاله به سوال «تفاوت کامپایلر و مفسر چیست؟» پرداختیم و همچنین «ویژگی زبانهای کامپایلری و مفسری» را بیان کردیم. به طور کلی تفاوت زبانهای کامپایلری و مفسری در این است که در زبانهای کامپایلری قبل از اجرای برنامه، همهی کدها به یکباره به زبان ماشین ترجمه میشوند تا برای کامپیوتر قابل فهم باشند و یک فایل خروجی مانند (exe) ساخته میشود اما در زبانهای مفسری، ترجمه در هنگام اجرای برنامه بهصورت خط به خط اجرا میشود و فایل خروجی ساحته نمیشود.
در زبانهای کامپایلری خروجی فایل همیشه قابل استفاده است و اگر تغییری در کدها اعمال نشود، دیگر نیازی به ترجمه دوباره نیست اما در مفسری در هر بار اجرا، باید ترحمه بهصورت خط به خط صورت بگیرد بنابراین سرعت اجرا در زبانهای کامپایلری بالاتر است. همچنین به دلیل ترجمه خط به خط در زبانهای مفسری، هنگامی که در یک خط از کد باگ وجود داشته باشد، خط دارای مشکل آسانتر پیدا میشود. اما در زبانهای کامپیلری به دلیل ترجمه یکباره آن و خط به خط نبودن ترجمه، پیدا کردن خط دارای باگ، مشکل است.
اگر با خواندن این مقاله همچنان تفاوت کامپایلر و مفسر، ابهام دارید، لطفا در قسمت نظرات سوال خود را بیان کنید. به نظر شما چه تفاوتهایی بین زبانهای کامپایلری و مفسری وجود دارد؟