تفاوت کامپایلر و مفسر چیست؟ — از کاربرد تا مزایا و معایب
«کامپایلر» (Compiler) و «مفسر» (Interpreted) هر دو «مترجمهایی» (Translator) برای تبدیل کدهای «سطح بالا» (High Level) یا همان «کدهای منبع» (Source Code) به «کدهای ماشین» (Machine Code) جهت درک برنامههای نوشته شده و پیادهسازی آنها توسط ماشین هستند. اما این دو فناوری تفاوتهایی نیز در رویکردشان با یکدیگر دارند و همین باعث شده است که انواع زبانهای برنامه نویسی مانند هم نباشند و برخی از کامپایلر و برخی دیگر از مفسر استفاده کنند. در این مطلب به طور جامع به بررسی تفاوت کامپایلر و مفسر پرداخته شده است.
تفاوت کامپایلر و مفسر چیست ؟
معمولا بیشتر برنامههای کامپیوتری با زبانهای سطح بالا از جمله «پرل» (Perl)، C، «جاوا» (Java) و سایر زبانهای مشابه نوشته میشوند. همانطور که زبانهای انسانی برقراری ارتباط بین افراد را سادهتر کردهاند، انسانها میتوانند با زبانهای کامپیوتری سطح بالاتر به شکل سادهتری با کامپیوترها ارتباط برقرار کنند. با این حال از آنجایی که کامپیوترها تنها قادر به تفسیر کدهای دودویی (اعداد صفر و یک) هستند، ارتباط برقرار کردن با کامپیوتر به وسیله زبانهای برنامه نویسی مانند صحبت کردن با کسی است که زبان انسانی متفاوتی دارد.
بنابراین در این حالت برای برقراری ارتباط صحیح به یک مترجم نیاز است و کامپایلر و مفسر این وظیفه را بر عهده میگیرند. زبانهای برنامه نویسی میتوانند تفسیری یا کامپایلری باشند و تفاوت مفسر و کامپایلر در درون رویکرد فرایند تفسیر یا کامپایل این زبانها نهفته است.
به طور خلاصهای از این تفاوت میتوان گفت که مفسر، نتیجه ترجمه خود را از برنامه اصلی تولید میکند، ولی این در حالی است که کامپایلر برنامه جدیدی را تولید خواهد کرد که با «زبان اسمبلی» (Assembly Language) نوشته شده است و سپس «اسمبلر» (Assembler) این کدها را به کدهای دودویی یا همان باینری قابل درک برای ماشین تبدیل میکند. زبان اسمبلی هر کامپیوتر بسته به معماری آن متفاوت است. در نتیجه، برنامههای کامپایل شده فقط روی کامپیوترهایی اجرا میشوند که معماری مشابه به کامپیوتری داشته باشند که کامپایل برنامه در آن انجام شده است. در ادامه به صورت خلاصه تعاریفی از کامپایلر و مفسر را یاد میگیریم.
کامپایلر در برنامه نویسی چیست؟
کامپایلر برنامهای نرم افزاری است که کدهای نوشته شده توسط برنامه نویس را به زبان پایه ماشین یعنی همان زبان قابل فهم توسط سخت افزار تبدیل میکند و به این ترتیب کدها برای کامپیوتر خوانا و قابل اجرا میشوند. به عبارت دیگر، منبع کد سطح بالا که توسط توسعه دهنده با استفاده از زبان برنامه نویسی سطح بالا نوشته شده است، توسط کامپایلر به کدهای سطح پایین یا همان «Object Code» تبدیل میشوند تا نتیجه برای پردازنده یا همان سختافزار قابل درک شود. یک برنامه کامپایل شده توسط انسان قابل خواندن نیست، بلکه فقط توسط معماری زبان ماشین خاص کامپیوتر درک میشود. ایجاد برنامهای کامپایل شده، چندین مرحله نیاز دارد.
در مرحله اول برنامه نویس با استفاده از یک ابزار توسعه یا حتی یک ویرایشگر متن ساده، کدهای منبع را با زبان برنامه نویسی مورد نظرش مینویسد. اگر برنامه پیچیده باشد، ممکن است بخشهای آن در فایلهای مختلفی نوشته شوند، سپس برنامه نویس، برنامه را کامپایل و ماژولها را مرتب میکند و همه آنها به کدهای قابل فهم برای ماشین تبدیل میشوند. به دلیل اینکه انواع مختلف کامپیوترها، زبانهای ماشین متفاوتی دارند، یک برنامه کامپایل شده فقط بر روی پلتفرمی کار میکند که برای آن طراحی شده است. برای مثال، برنامهای که برای پلتفرم «HP-UX» نوشته میشود، معمولاً روی کامپیوترها با سیستم عامل «MacOS» کار نمیکند.
با وجود این مسائل، میتوان گفت برنامههای کامپایلری از برنامههای مفسری سریعتر هستند. همچنین، معمولاً امکان کامپایل مجدد برنامه به گونهای وجود دارد که برنامه بر روی پلتفرمهای مختلف اجرا شود. به عنوان نمونههایی از زبانهای برنامه نویسی کامپایلری میتوان به زبان C، «کوبول» (COBOL)، ++C، «فرترن» (Fortran) و سایر موارد اشاره کرد. در ادامه مطلب «تفاوت مفسر و کامپایلر چیست» خلاصهای از تعریف مفسر ارائه شده است.
مفسر در برنامه نویسی چیست؟
مفسر نرم افزار کامپیوتری است که هر «عبارت» (گزاره | Statement) یا همان «خط کد» را در برنامههای نوشته شده به زبانهای سطح بالا را به «کدهای میانی» (Intermediate Code) تبدیل میکند. این کدها شامل کدهای منبع، کدهای از قبل کامپایل شده و اسکریپتها میشوند. همچنین این نرم افزار میتواند کدهای منبع سطح بالا را تجزیه کند و سپس دستورات را به طور مستقیم انجام دهد، در این حالت دستورات خط به خط اجرا میشوند. برنامههای مفسری که معمولاً به عنوان اسکریپت شناخته میشوند، به یک مفسر نیاز دارند که دستورات موجود در برنامه را تجزیه و سپس اجرا کنند.
برخی از مفسرها مانند «پوستههای یونیکس» (Unix Shell) از جمله sh و csh و ksh و سایر موارد، هر دستوری را که میخوانند، بلافاصله اجرا میکنند. در حالی که برخی دیگر از مفسرها، مانند Perl، تمام اسکریپت را قبل از ارسال دستورالعملهای مربوط به زبان ماشین تجزیه و تحلیل خواهند کرد. مزیت اصلی این اسکریپتها «قابل حمل» (Portable) بودن آنها است. هر کامپیوتری که مفسر مناسب را نصب کرده باشد، ممکن است بتواند برنامه را تقریباً بدون تغییر، اجرا کند.
با این حال این موضوع از معایب مفسر به حساب میآید، زیرا اگر مفسر در دسترس نباشد، برنامه اجرا نخواهد شد. به طور کلی، برنامههای تفسیر شده کندتر از برنامههای کامپایل شده هستند، اما «اشکالزدایی» (Debug) و اصلاح آنها سادهتر است. برخی از نمونههای زبانهای مفسری، شامل زبانهای «جاوا اسکریپت» (JavaScript) و «پایتون» (Python) میشوند. در بخش بعدی از این مطلب، به شرح تفاوتهای مفسر و کامپایلر میپردازیم.
شرح تفاوت های مفسر و کامپایلر در برنامه نویسی
نرم افزار مفسر و کامپایلر هر کدام با روش خاصی کدهای نوشته شده را به کدهای قابل درک برای ماشین تبدیل میکنند. در این بخش قرار است از همه زوایا تفاوت کامپایلر و مفسر مورد بررسی قرار بگیرد. تفاوت اصلی و واضح مفسر و کامپایلر در این است که کامپایلرها کدهای سطح بالا را قبل از پیادهسازی به کدهای ماشین تبدیل میکنند و یک فایل اجرایی ( .exe
) برای آنها میسازند. اما مفسر کدهای سطح بالا را هنگام پیادهسازی خط به خط برنامه به کدهای قابل فهم برای ماشین تبدیل میکند. در بخشهای بعدی به صورت جزئیتری هر یک از تفاوتهای مفسر و کامپایلر مورد بررسی قرار میگیرند.
تفاوت کامپایلر و مفسر بر اساس رویکرد آن ها
در روند کار کامپایلرها، ابتدا برنامه نویس یک برنامه را مینویسد، سپس کامپایلر همه کدهای برنامه نوشته شده را برای بررسی صحت آن تجزیه و تحلیل میکند و اگر بخشی از کدها نادرست باشند، خطا ایجاد میشود. اما اگر خطایی وجود نداشته باشد یا خطا برطرف شود، کامپایلر کدهای منبع را به کدهای ماشین تبدیل میکند.
در روش استفاده از کامپایلر، فایل کدهای ایجاد شده برای کامپایل به برنامه قابل اجرایی با پسوند .exe
تبدیل میشوند و در نهایت در مرحله آخر برنامه پیادهسازی خواهد شد. از سویی دیگر در رویکرد مفسرها، بعد از نوشتن برنامه توسط برنامه نویس، هیچ فایل اتصال یا کدهای دیگری تولید نمیشوند و عبارتهای منبع به صورت خط به خط در حین پیادهسازی اجرا خواهند شد.
تفاوت مفسر و کامپایلر در کدهای ماشین
در رویکرد مفسرها هیچ کد ماشینی وجود ندارد؛ زیرا این برنامهها به صورت خط به خط ترجمه و تفسیر میشوند. اما در روش استفاده از کامپایلر، کدهای ماشین با زبان ماشین روی حافظه دیسک ذخیره خواهند شد.
تفاوت مفسر و کامپایلر در زمان اجرای آن ها
همانطور که پیش از این نیز مورد بررسی قرار گرفت، برنامههایی که با استفاده از کامپایلر پیادهسازی میشوند، به دلیل اینکه کدها را به صورت یکجا پیادهسازی میکنند، دارای سرعت بیشتری هستند. اما از آنجایی که مفسر ترجمه کدها را به صورت خط به خط انجام میدهد، سرعت پیادهسازی پایینتری نسبت به کامپایلر دارد.
تفاوت مفسر و کامپایلر بر اساس مدل آن ها
کامپایلر بر اساس روشهای «بارگذاری و اتصال» (Linking and Loading) ترجمه برنامه نوشته شده را انجام میدهد. بارگذاری و اتصال در برنامهها، نقش مهمی را برای پیادهسازی برنامه انجام میدهند. روش اتصال، کدهای شی تولید شده توسط اسمبلر را دریافت و آنها را برای تولید ماژول پیادهسازی ترکیب میکند. در سمتی دیگر، روش بارگذاری، ماژول اجرایی را برای پیادهسازی در حافظه اصلی بارگذاری کرده است. اما مفسر بر اساس «متُد» (Method) تفسیر را انجام میدهد و با استفاده از آن هر زبان برنامه نویسی با متد مخصوص به خود خطهای برنامه را تفسیر خواهد کرد.
تفاوت مفسر و کامپایلر در پیاده سازی برنامه چیست؟
پیادهسازی برنامه در زبانهای کامپایلری، به صورت جدا از کامپایل آن انجام میشود. همچنین، پیادهسازی فقط پس از کامپایل شدن کل برنامه باید انجام شود. در برنامههای مفسری، پیادهسازی برنامه بخشی از تفسیر برنامه به حساب میآید، بنابراین به صورت خط به خط انجام میشود.
تفاوت کامپایلر و مفسر در نیاز به حافظه
برنامههای کامپایلری به طور مستقیم و یکجا پیادهسازی میشوند و در رویکرد آنها نیازی به ذخیره برنامه نوشته شده کامپایلر در حافظه سیستم وجود ندارد. اما، در برنامهای که با مفسر ترجمه میشود، هنگام تفسیر آن به صورت خط به خط، از حافظه سیستم استفاده خواهد شد.
تفاوت مفسر و کامپایلر در میزان محبوبیتشان برای برنامه نویسی
کدهای فایل کامپایلر فقط در ماشین هدف خاص خود استفاده میشوند و قابل انتقال نیستند. زبانهای برنامه نویسی C و ++C محبوبترین و پرکاربردترین زبانهایی هستند که از کامپایلر استفاده میکنند. اما، مفسر برای محیطهای تحت وب و جایی مناسب است که زمان بارگذاری در آنها اهمیت دارد. به طور کلی میتوان گفت که کامپایلرها زمان نسبتاً بیشتری برای کامپایل کردن کدهای کوچک صرف میکنند که ممکن است چندین بار اجرا شوند. به همین دلیل برای پیادهسازی کدهای کوچک و کوتاه استفاده از برنامههای مفسری بهتر است.
تفاوت کامپایلر و مفسر در روش های بهینه سازی
نرم افزار کامپایلر همه کدها را قبل از پیادهسازی برنامه میبیند. به همین دلیل، میتوان بهینهسازیهای زیادی را در برنامههای کامپایلری انجام داد که باعث سریعتر اجرا شدن کدها شوند. اما، از آنجایی که مفسرها کدهای برنامه را به صورت خط به خط یا همان عبارت به عبارت تفسیر میکنند، بهینهسازیهای آنها به اندازه کامپایلرها قدرتمند نیستند.
تفاوت مفسر و کامپایلر در قابلیت های خاص
برنامه نویسی با رویکرد «تعیین نوع به صورت پویا» یا «نوعدهی پویا» (Dynamic Typing) برای زبانهای برنامه نویسی کامپایلری دشوار است، زیرا آنها نمیتوانند پیشبینی کنند که در هر بخش از پیادهسازی چه اتفاقی رخ خواهد داد. اما زبانهای مفسری از قابلیت تعیین نوع به صورت پویا به طور کامل پشتیبانی میکنند.
تفاوت کامپایلر و مفسر در کاربردشان
کامپایلر به دلیل اینکه سرعت بالاتری دارد، برای محیط تولید محصول مناسبتر است. مفسرها برای برنامهها و محیطهای توسعه مناسب هستند؛ زیرا در این محیطها بررسی خط به خط کدها اهمیت دارد و به سرعت پیادهسازی کمتر توجه میشود. همچنین میتوان از مفسر در پروژههایی استفاده کرد که در آنها زمان بارگذاری کدها مهم است، برای مثال میتوان به محیطهای توسعه وب اشاره کرد.
تفاوت مفسر و کامپایلر در خطاهای پیاده سازی
کامپایلر همه خطاها و هشدارها را در زمان کامپایل برنامه نمایش میدهد. بنابراین، نمیتوان برنامه را بدون برطرف کردن خطاهای آن اجرا کرد. اما، مفسر یک عبارت یا خط کد را میخواند و در صورت وجود خطا، آن را نشان میدهد. برای تفسیر شدن خط بعدی، ابتدا باید آن خطا برطرف شود. به عبارت دیگر، کامپایلر همه خطاهای برنامه را در یک زمان و در کنار یکدیگر نشان میدهد و مفسر خطاهای هر خط را پس از آن نشان خواهد داد. در زبانهای کامپایلری امکان پیادهسازی کدها به صورت بخش بخش وجود ندارد، اما در زبانهای مفسری تا هر بخشی از کدها را که نیاز باشد میتوان پیادهسازی کرد.
تفاوت کامپایلر و مفسر در ورودی و خروجی
کامپایلر کل یک برنامه را به عنوان ورودی دریافت و مفسر، یک خط یا عبارتی از کدها را به عنوان ورودی دریافت میکند. در کامپایلر به عنوان خروجی، کدهای شی ایجاد میشوند، اما مفسر کدهای ماشین میانی تولید میکند. در جدول زیر همه موارد فوق به طور خلاصه ارائه شدهاند.
- برای مشاهده جدول مقایسه مفسر و کامپایلر + اینجا کلیک کنید.
- برای مقایسه کامپایلر و مفسر جدولی نیز تهیه شده که در آن تمام مواردی که تا اینجا در این بخش ذکر شدهاند به طور خلاصه آمده است.
معرفی فیلم های آموزش مهندسی و علوم کامپیوتر تم آف
دورههای آموزشی در پلتفرم تم آف بر اساس موضوع در قالب مجموعههای آموزشی مختلفی دستهبندی شدهاند. یکی از این مجموعهها مربوط به آموزش مهندسی و علوم کامپیوتر است که جهت آشنایی علاقهمندان و دانشجویان با این مجموعه آموزشی در این بخش معرفی میشود. دورههای متفاوتی پیرامون آموزش دروس علوم و مهندسی کامپیوتر در این مجموعه در دسترس قرار دارند. در زمان تدوین این مطلب، مجموعه آموزشهای مهندسی و علوم کامپیوتر تم آف دارای ۴۴ عنوان آموزشی و ۵۰۵ ساعت محتوای ویدیویی است. در ادامه، برخی از دورههای این مجموعه به طور مختصر معرفی شدهاند:
- فیلم آموزش طراحی الگوریتم (طول مدت: ۱۵ ساعت و ۱۲ دقیقه، مدرس: دکتر فرشید شیرافکن): در این دوره آموزشی درس طراحی الگوریتم به دانشجویان و علاقهمندان آموزش داده میشود. درس طراحی الگوریتم، یکی از دروس مهم رشته مهندسی کامپیوتر در مقطع کارشناسی به حساب میآید که یادگیری آن نسبتا سخت است. برای مشاهده فیلم آموزش طراحی الگوریتم + کلیک کنید.
- فیلم آموزش ساختمان داده ها (طول مدت: ۱۰ ساعت و ۲۸ دقیقه، مدرس دکتر فرشید شیرافکن): ساختمان دادهها، یکی از دروس مهم و پایهای دانشگاهی است و به عنوان مبحثی که نکات فراوانی دارد، در کنکور کارشناسی ارشد کامپیوتر و دکتری هوش مصنوعی و نرم افزار از دروس با ضریب بالا به شمار میرود. در این تم آف ساختمان دادهها به طور جامع آموزش داده شده است. برای مشاهده فیلم آموزش ساختمان داده ها + کلیک کنید.
- فیلم آموزش نظریه زبان ها و ماشین ها (طول مدت: ۸ ساعت و ۴۸ دقیقه، مدرس: دکتر فرشید شیرافکن): در این تم آف دانشجویان با سه موضوع «زبان»، «گرامر» و «ماشین» آشنا میشوند. این درس پیشنیاز درس طراحی کامپایلر است. با یادگیری زبانها و گرامرها میتوان نحوه کار کامپایلر و همچنین طراحی زبانهای برنامهسازی را متوجه شد. برای مشاهده فیلم آموزش نظریه زبانها و ماشینها + کلیک کنید.
- فیلم آموزش نظریه زبان ها و ماشین – مرور و تست کنکور ارشد (طول مدت: ۸ ساعت و ۲۰ دقیقه، مدرس: دکتر فرشید شیرافکن): در این دوره آموزشی ابتدا مفاهیم عبارت منظم، زبان منظم، گرامر و ماشین متناهی تدریس شده است و سپس تستهای مربوط به این مفاهیم بررسی شدهاند. برای مشاهده فیلم آموزش نظریه زبانها و ماشین – مرور و تست کنکور ارشد + کلیک کنید.
- فیلم آموزش طراحی و پیاده سازی زبان های برنامه سازی (طول مدت: ۱۰ ساعت و ۳۱ دقیقه، مدرس: دکتر فرشید شیرافکن): در این تم آف نحوه طراحی و پیادهسازی انواع دادهها، دستورات و ساختمان دادهها در چند زبان برنامه نویسی بررسی شدهاند و امتیازها و معایب آنها مقایسه شده است. برای مشاهده فیلم آموزش طراحی و پیادهسازی زبانهای برنامهسازی + کلیک کنید.
- آموزش طراحی کامپایلر (طول مدت: ۱۴ ساعت و ۵۴ دقیقه، مدرس: منوچهر بابایی): این دوره آموزشی برای دانشجویان و علاقهمندان به طراحی کامپایلر مناسب است. همچنین این درس یکی از دروس مهم رشته کامپیوتر در مقطع کارشناسی به حساب میآید. برای مشاهده فیلم آموزش طراحی کامپایلر + کلیک کنید.
نقش کامپایلر در برنامه نویسی چیست ؟
در این بخش به طور خلاصه و مرحله به مرحله نقش کامپایلر در یک برنامه کامپیوتری ارائه شده است:
- کامپایلرها کدهای منبع را میخوانند و کدهای قابل اجرا را در خروجی نشان میدهند.
- کامپایلر کدهای نرم افزار نوشته شده با زبان برنامه نویسی سطح بالا را به دستورالعملهایی قابل درک برای کامپیوتر تبدیل میکنند. به عبارت دیگر، متنی را که یک برنامه نویس مینویسد به فرمتی تبدیل میکند که CPU بتواند آن را درک کند.
- فرایند کامپایل نسبتاً پیچیده به حساب میآید و زمان زیادی را صرف تجزیه و تحلیل و پردازش برنامه میکند.
- نتیجه قابل اجرا پس از کامپایل کدها، نوعی از کدهای باینری مخصوص ماشین هستند.
در ادامه این مطلب، به صورت خلاصه روش عملکرد کامپایلر برای ترجمه یک برنامه توضیح داده شده است.
روش عملکرد کامپایلر در برنامه نویسی چگونه است؟
همانطور که در بخشهای پیشین نیز به آن اشاره شد، هدف اصلی کامپایلرها، ترجمه برنامه به کدهای ماشین است و در صورت بروز هر گونه خطا، محدودیت و سایر موارد در برنامه به برنامه نویس اطلاع میدهد. به خصوص کامپایلر خطاهای «نحوی» (Syntactical) برنامه را با دقت بالایی بررسی و خطاهای مربوط به سینتکس را اعلام میکند. کامپایلر کل برنامه را تجزیه و تحلیل و به کدهای ماشین تبدیل خواهد کرد. روش عملکرد یک کامپایلر را میتوان به گروههای زیر تقسیمبندی کرد:
- اسکن کردن (Scanning): اسکنر، کاراکترها یا همان حروف را در زمانی مشخص در کد منبع میخواند و ردیابی میکند که کدام کاراکتر در کدام خط و موقعیت قرار دارد.
- تحلیل واژهای یا لغوی (Lexical Analysis): کامپایلر دنبالهای از کاراکترهای کد منبع را به رشتهای (String) از کاراکترها تبدیل میکند که به عنوان توکن (Token) شناخته میشوند. سپس این توکنها توسط قانونی مشخص با برنامهای به نام «تحلیل لغوی» به یکدیگر مرتبط شدهاند. این برنامه از یک جدول سمبلها برای ذخیره حروف در کد منبع استفاده میکند تا تطابق آنها را با توکنهای ارسالی بررسی کند.
- تحلیل نحوی (Syntactic Analysis): در این مرحله، تحلیل نحوی یا همان سینتکسی انجام میشود. این مرحله شامل پیشپردازش توکنهای ایجاد شده در مرحله تحلیل لغوی برای بررسی مناسب بودن ترتیب توکنها جهت استفاده در کامپایلر است. ترتیب صحیح مجموعه کلمات کلیدی که باعث ایجاد نتیجه دلخواه خواهد شد، سینتکس نامیده میشود. نیاز است که کامپایلر کد منبع را برای اطمینان از صحت سینتکس بررسی کند. این مرحله میتواند به وسیله ایجاد درخت انجام شود.
- تحلیل معنایی (Semantic Analysis): این مرحله شامل چندین بخش میشود (تجزیه درخت ایجاد شده در مرحله قبل) که در ادامه ارائه شدهاند:
- ابتدا ساختمان (Structure) توکن و ترتیب آنها با توجه به دستور زبان مورد نظر بررسی میشود.
- معنای ساختمان توکن توسط تجزیه کننده (Parser) و تحلیلگر تفسیر میشود.
- در نهایت، یک کد میانی (Intermediate Code) به نام کد شی تولید خواهد شد.
- بهینهسازی کدها: فرایند کامپایل دارای مراحل متعددی است که از طریق آنها میتوان در هر مرحله کار را بهبود بخشید.
نقش مفسر در برنامه نویسی چیست ؟
نقش مفسر در برنامه نویسی به صورت خلاصه در این بخش بررسی میشود:
- مفسرها کدهای برنامه را در زمان اجرا به صورت خط به خط پیادهسازی میکنند.
- مفسر برنامههای نوشته شده با زبانهای سطح بالا را به طور کامل به زبان سطح ماشین ترجمه میکنند.
- در روشهای استفاده از مفسر، امکان ارزیابی و اصلاح برنامه در حین اجرا وجود دارد.
- مفسر زمان نسبتاً کمتری برای تجزیه و تحلیل و پردازش برنامه صرف میکند.
- اجرای برنامه با روشهای تفسیری در مقایسه با روشهای کامپایلری نسبتاً کند است.
در بخش بعدی از مطلب «تفاوت کامپایلر و مفسر چیست»، روش عملکرد مفسر در برنامه نویسی را یاد میگیریم.
روش عملکرد مفسر در برنامه نویسی چگونه است؟
دستورات برنامه که شامل کدهای منبع، کدهای از پیش کامپایل شده و اسکریپتها هستند با استفاده از مفسر به کدهای ماشین تبدیل میشوند. برخلاف کامپایلر، مفسر مراحل انجام کار بسیار کمتری دارد و زمان کمتری برای تفسیر کدها صرف میکند. از آنجایی که فرایند کار با زبانهای برنامه نویسی مفسری سادهتر است، این زبانها برای مبتدیان در یادگیری برنامه نویسی مفید خواهند بود. در ادامه به صورت کوتاه به این موضوع پرداخته میشود که کد ماشین چیست.
کد ماشین چیست؟
زبان ماشین بسیار نزدیک به سخت افزار سیستم است. هر کامپیوتری، زبان ماشین مخصوص به خود را دارد. برنامههای زبان ماشین با استفاده از یک سری برنامه با الگو دودویی برای مثال مانند «110110» ایجاد میشوند و این الگو نشاندهنده عملیات سادهای است که باید توسط کامپیوتر انجام شود. برنامههای زبان ماشین به صورت مستقیم قابل اجرا هستند و کدهای ماشین همین برنامهها را نشان میدهند. در ادامه مطلب «تفاوت کامپایلر و مفسر چیست» به بررسی و تعریف اصطلاح کد شی میپردازیم.
زبان ماشین چیست ؟ — هر آنچه باید بدانید به زبان ساده
کد شی چیست؟
در فرایند کامپایل کدهای منبع، کدهای ماشین تولید شده برای پردازندههای مختلف از جمله Intel ،AMD و ARM متفاوت هستند. برای قابل انتقال شدن کدها، ابتدا کدهای منبع به کد شی تبدیل میشوند. این کدها، کدهای میانی و مشابه کدهای ماشین هستند. در زمان اجرا، کد شی به کد ماشین پلتفرم مورد نظر تبدیل میشود. در بخش بعدی این مطلب به معرفی چند نمونه از مزایای کامپایلر پرداخته شده است.
مزایای کامپایلر در برنامه نویسی چیست؟
در این بخش فهرستی از مزایای کامپایلرها در برنامه نویسی کامپیوتر ارائه شده است:
- کامپایلر کدهای برنامه مورد نظر را برای اجرا، تنها به یک تک اجرا (Single Run) تبدیل میکند.
- در کامپایل کردن کدها توسط کامپایلرها زمان کمی صرف میشود.
- کامپایلرها بیشتر از پردازنده CPU استفاده میکنند.
- خطاهای مرتبط به تحلیل معنایی و تحلیل نحوی در کامپایلرها میتوانند به صورت همزمان بررسی شوند.
- به راحتی در زبانهای برنامه نویسی سطح بالا مانند C ،JAVA و ++C از کامپایلرها پشتیبانی میشود.
معایب کامپایلر در برنامه نویسی چیست؟
کامپایلر در کنار مزایا و ویژگیهای بسیار خوبی که دارد، دارای معایبی نیز است که در این بخش آنها را بررسی میکنیم و یاد میگیریم:
- کامپایلر انعطافپذیر نیست.
- در کامپایلرها بومیسازی (Localization) خطا دشوار است.
- کد منبع پس از هر تغییری نیاز به کامپایل شدن دارد.
- کامپایلر برای اجرای سریع، نیاز دارد که کدهای ماشین صحیحی را ایجاد کند.
- ابزار کامپایلر قابل حمل و انتقال نیست.
- کامپایلر نیاز است که پیامهای تشخیصی و خطا را اعلام کند.
- ابزار کامپایلر باید بهینهسازی ثابتی داشته باشد.
مزایای مفسر در برنامه نویسی چیست؟
- استفاده از مفسرها بسیار ساده است و به همین دلیل این نوع از نرم افزارها برای استفاده افراد تازهکار مناسب هستند.
- به دلیل اجرا و تفسیر خط به خط کدها در مفسر، اشکالزدایی آن ساده میشود.
- مفسر معمولاً کد میانی ایجاد نمیکند، به همین دلیل، با استفاده از آن، مصرف حافظه بهینهتر است.
- با استفاده از مفسر میتوان خطاهای برنامه را قبل از اتمام برنامه تشخیص داد و اشکالات آن را برطرف کرد.
- برنامه را میتوان به صورت خط به خط و قبل از تکمیل، اجرا کرد تا بلافاصله نتایج جزئی هر خط را در آن دید.
- به وسیله مفسر میتوان روی بخشهای کوچک برنامه کار کرد و بعداً آنها را به کل برنامه پیوند داد.
معایب مفسر در برنامه نویسی چیست؟
معایب مفسر در برنامه نویسی را میتوان در فهرست زیر خلاصه کرد:
- برنامههای تفسیر شده روی کامپیوترهایی اجرا میشوند که مفسر مربوط به برنامه را داشته باشند.
- زمان پیادهسازی کدها در مفسر بالا است و کمی نسبت به ابزارهای مشابه خود، کند عمل میکند.
- احتمال وجود خطاهای سینتکسی در اسکریپتهای تایید نشده وجود دارد.
- برنامه در روشهای استفاده از مفسر بهبود نمییابد و احتمال بروز خطاهای دادهای برای آن وجود دارد.
در بخش بعدی شرحی از زبانهای برنامه نویسی کامپایلری ارائه شده است.
زبان های برنامه نویسی کامپایلری
زبانهای کامپایلری در برنامههای خود فقط از کامپایلر استفاده میکنند. کامپایلرهای استاندارد به جای ترجمه سریع کدهای برنامه، همه کارهای خود را قبل از زمان اجرا انجام میدهند. بهترین مثال برای زبان برنامه نویسی کامپایلری، ++C است. در زبان ++C کدهای منبع به کدهای ماشین کامپایل میشوند. به طور کلی فرایند کامپایل در این زبان مراحل پیشپردازش، کامپایل و پیوند را دارد. اما نتیجه نهایی یک کتابخانه یا فایل اجرایی است که میتواند مستقیماً توسط پردازنده CPU اجرا شود و برنامه برای آن کامپایل شده است. مزیت اصلی زبانهای کامپایلری سرعت اجرای آنها به حساب میآید؛ زیرا فایل اجرایی حاوی کدهای ماشین میتواند مستقیماً بدون هیچ مرحله اضافی بر روی سیستم مورد نظر اجرا شود.
از معایب اصلی این زبانها میتوان به قابلیت حمل و انتقال ضعیف آنها اشاره کرد، زیرا برنامههای کامپایلری برای معماریهای خاص CPU کامپایل میشوند و زمان طولانی برای هر کامپایل واقعی نیاز است. به عنوان برخی دیگر از زبانهای کامپایلری محبوب میتوان به زبان C، «هسکل» (Haskell)، Rust ،Go و سایر موارد اشاره کرد. در بخش بعدی از مطلب «تفاوت کامپایلر و مفسر چیست»، زبانهای برنامه نویسی تفسیری یا همان مفسری را یاد میگیریم.
زبان های برنامه نویسی تفسیری
زبانهای برنامه نویسی تفسیری برای پیادهسازی برنامههای خود از مفسر استفاده میکنند و کدهای منبع را قبل از اجرا به کدهای ماشین تبدیل نمیکنند. میتوان گفت در این زبانها مترجم بهجای ترجمه یکجای کل برنامه، به صورت خط به خط و در زمان اجرا برنامه را ترجمه میکند. با این حال، مفسرهای امروزی، بیشتر از یک نمایش میانی استفاده میکنند که در اکثر زبانهای تفسیری «بایتکد» (Bytecode) نامیده میشود. این موضوع به این دلیل است که تفسیر مستقیم کدهای منبع بسیار کند انجام میشود و در بیشتر مواقع زبانهای تفسیری ابتدا از کامپایل برنامه به بایتکد استفاده میکنند که میتواند کدها را برای تفسیر بهتر به کدهای ماشین آماده و بهینه کند.
به طور کلی، امروزه زبانهای کاملاً تفسیری زیادی باقی نماندهاند. یک مثال قابل توجه زبان جاوا اسکریپت است که بسته به نوع پیادهسازی میتواند برنامه را به طور کامل تفسیر کند. این ویژگی در جاوا اسکریپت بسیار مفید است؛ زیرا کدها به راحتی از طریق شبکه ارسال میشوند و در مرورگر کاربر اجرا خواهند شد. اگرچه یافتن زبان محبوب در دسته زبانهای کاملاً تفسیری بسیار سخت شده است، اما به راحتی میتوان تعداد زیادی از آنها را معرفی کرد که از روش ایجاد بایتکد و تفسیر آن استفاده میکنند.
برای مثال میتوان به زبانهای جاوا، #C، پایتون، «روبی» (Ruby) و سایر موارد اشاره کرد. یکی از مزیتهای اصلی استفاده از زبانهای تفسیری، قابل حمل و انتقال بودن آنها است؛ زیرا این برنامهها نیازی به کامپایل شدن برای یک معماری خاص پردازنده CPU و فرایند کامپایل سریعتر ندارند. یکی از معایب اصلی زبانهای تفسیری معمولاً سرعت اجرای آهسته آنها نسب به زبانهای کامپایلری است و همچنین امن نبودن این کدها هنگام ارسال آنها به کلاینت نیز از اشکالات زبانهای تفسیری به حساب میآید. برخی از زبانهای برنامه نویسی هم مفسری و هم کامپایلری هستند و در ادامه به بررسی این نوع از زبانها پرداخته شده است.
زبان برنامه نویسی مفسری و کامپایلری
برای بهرهمندی از مزایای نسبی کامپایلر و مفسر، برخی از زبانهای برنامه نویسی مانند جاوا هم کامپایل و هم تفسیر میشوند. کدهای جاوا با استفاده از کد شی کامپایل میشوند. سپس در زمان اجرا، «ماشین مجازی جاوا» (Java Virtual Machine | JVM)، کد شی را به کد ماشین کامپیوتر مورد نظر تفسیر میکند.
جمعبندی
همانطور که در این مطلب بررسی شد، مفسر و کامپایلر هر دو هدف یکسانی دارند، اما در رسیدن به هدف خود از مسیر و رویکرد متفاوتی استفاده میکنند. به طور خلاصه میتوان گفت که مفسر خط به خط کدها را برای ماشین ترجمه میکند و کامپایلر این کار را به صورت یکجا و با ایجاد کدهایی از ترجمه برنامه اصلی انجام میدهد. در این مطلب سعی شد به طور جامع به این سوال پاسخ داد که تفاوت کامپایلر و مفسر چیست. همچنین با استفاده از بررسی روش عملکرد، مزایا و معایب این ابزارهای نرم افزاری، تفاوت آنها به خواننده منتقل میشود. برخی از دورههای آموزشی نیز برای یادگیری بیشتر علاقهمندان و دانشجویان در این مطلب معرفی شدهاند.