وقتی صحبت از زبانهای برنامهنویسی مختلف میشود، اساساً میتوان آنها را به دو دسته کلی تقسیم نمود: آنهایی که کامپایل میشوند و آنهایی که اینترپریت میگردند به طوری که از جمله زبانهایی که به دستهٔ اول تعلق دارند میتوان جاوا یا سیشارپ را مثال زد و از جمله زبانهایی که تفسیر میشوند هم میتوان به پیاچپی و جاوااسکریپت اشاره کرد. حال در همین راستا در ادامه قصد داریم تا تفاوتهای مابین فرایندهای Compiler با Interpreter را جویا شویم.
Compiler چیست؟
Compiler یک برنامه کامپیوتری است که کدهای یک زبان برنامهنویسی سطح بالا را به کدی خوانا برای ماشین تبدیل میکند. به عبارتی، برنامهای است که کدهای قابل خواندن توسط انسان را به زبانی که پردازندههای کامپیوتر قادر به درک آن باشند (یعنی کدهای باینری یا همان صفر و یک) تبدیل میکند.
یک کامپایلر باید با سینتکس زبان برنامهنویسی که کدهای برنامهٔ مذکور با آن نوشته میشوند آشنایی داشته باشد اما در عین حال باید در نظر داشت که کامپایلر نمیتواند ارورها و خطاهای موجود در برنامه را تصحیح کند و از همین روی اگر خطایی در کدتان وجود داشته باشد، باید تغییراتی را در سینتکس برنامه ایجاد کنید که در غیر این صورت کدتان کامپایل نخواهد شد.
فرآیند کامپایل فرآیندی نسبتاً پیچیده است که طی آن زمان بسیار زیادی صرف تجزیه و تحلیل و ترجمهٔ سورسکد به کدی قابل درک برای کامپیوتر میشود. به طور کلی، کامپایلرها سورسکد را میخوانند و یک کد قابلاجرا در خروجی تحویل میدهند. به عبارت دیگر، سورسکد نرمافزارهایی را که با یک زبان سطح بالا نوشته شدهاند به صفر و یکهایی تبدیل میکند که کامپیوتر قادر به درک آنها باشد. در واقع، کدی را که یک برنامهنویس مینویسد را به فرمتی خوانا برای CPU تبدیل میکند.
Interpreter چیست؟
Interpreter (مُفسِر) یک برنامهٔ کامپیوتری است که هر خط از دستورات یک زبان سطح بالا را به کد ماشین تبدیل میکند. Compiler و Interpreter هر دو کاری یکسان، یعنی تبدیل کدهای زبان سطح بالا به کد ماشین، انجام میدهند اما کامپایلر کد را پیش از اجرای برنامه به کد ماشین تبدیل میکند (یعنی یک فایل اجرایی همچون exe میسازد) در حالی که مفسر کد را حین اجرا به کد ماشین تبدیل میکند.
همانطور که پیش از این گفته شد، اینترپریتر سورسکد را خط به خط در حین اجرا ترجمه میکند به طوری که سورس یک برنامهٔ نوشته شده با زبانی سطح بالا را به طور کامل به زبان ماشین ترجمه میکند و این در حالی است که مفسر اجازه میدهد تا ارزیابی و اصلاح برنامه در حین اجرا (Run-time) صورت پذیرد.
نیاز به توضیح نیست که پروسهٔ اینترپریت زمان نسبتاً کمتری در مقایسه با کامپایل صرف تجزیه و تحلیل و پردازش برنامه میکند اما در عین حال سرعت اجرای برنامه در مقایسه با زبانهایی که کدشان کامپایل میشود، نسبتاً کندتر است.
درآمدی بر زبانهای سطح بالا
زبانهای سطح بالا مانند JAVA ،C++ ،C و غیره بسیار شبیه به زبان انگلیسی هستند که همین امر سبب آسان شدن فرآیند توسعهٔ نرمافزار میشود اما باید پیش از اجرا، به زبان ماشین (صفر و یک) ترجمه شوند و این ترجمه هم یا توسط کامپایلر انجام میگیرد یا اینترپریتر.
زبان ماشین بسیار شبیه به زبان سختافزار بوده و هر سیستم کامپیوتری زبان ماشین مخصوص به خود را دارا است. برنامههای نوشته شده به زبان ماشین از کدهایی مطابق الگوی باینری تشکیل شدهاند (مثلاً 110110) که نشاندهنده عملیات سادهای است که باید توسط کامپیوتر اجرا شود.
در فرآیند کامپایل سورسکد، کد ماشین تولید شده برای پردازندههای متفاوت (مانند AMD ،Intel و یا ARM) فرق میکند و برای اینکه کد تولید شده به اصطلاح پرتابل باشد، سورسکد ابتدا به Object Code تبدیل میشود (Object Code یک کد واسط شبیه به کد ماشین است که برای هیچ پردازندهای قابلخواندن نیست بلکه در زمان اجرا این کد به کد ماشین پلتفرم اصلی تبدیل میشود.)
تفاوتها | کامپایلر | اینترپریتر |
پروسهٔ توسعهٔ نرمافزار | برنامه را میسازد سپس همه دستورات زبان را از نظر درستی تجزیه و تحلیل میکند و اگر دستوری غلط باشد، ارور میدهد و اگر همهٔ دستورات درست باشند، سورسکد را به کد ماشین تبدیل میکند. فایلهای مختلفی را به برنامه اجرایی (همان فایل exe) اضافه میکند و در نهایت برنامه را اجرا میکند. | برنامه را میسازد. خبری از افزودن فایلی اجرایی به برنامه یا تولید کد ماشین نیست بلکه دستورات سورسکد خط به خط در حین اصطلاحاً Run-time اجرا میکند. |
مزایا | کد برنامه کاملاً به کد ماشین ترجمه شده است؛ بنابراین زمان اجرای آن کمتر است. | استفاده از مفسرها به خصوص برای دولوپرهای مبتدی آسانتر است. |
معایب | برای تغییر برنامه حتماً باید به سورسکد آن مراجعه شده و در صورت وجود باگ در برنامه، بایستی مجدد کامپایل گردد. | اپلیکیشنهای نوشته شده با زبانهای تفسیری تنها بر روی کامپیوترهایی اجرا میشوند که مفسر مربوطه روی آنها نصب باشد. |
سرعت اجرا | کدهای کامپایلشده سریعتر اجرا میشوند. | کدهای تفسیری کندتر اجرا میشوند. |
فایل خروجی | یک خروجی تولید میکند (با فرمت exe) که میتواند بدون نیاز به سورسکد اصلی اجرا شود. | هیچگونه فایلاجرایی تولید نمیکند. |
اجرا | اجرای برنامه از فرآیند کامپایل آن جدا است به طوری که اجرای برنامه تنها زمانی اتفاق میافتد که کل کدها کامپایل شده باشند. | اجرای برنامه بخشی از فرآیند تفسیر آن است؛ بنابراین برنامه خط به خط اجرا میشود. |
مناسب برای | محدود به یک دستگاه خاص است و نمیتوان آن را پورت کرد. | برای محیط وب که زمان لود اهمیت دارد مناسب است. به دلیل اینکه تجزیه و تحلیل باید کامل انجام شود، فرآیند کامپایل زمان نسبتاً زیادی را صرف میکند که در چنین مواردی، اینترپریترها انتخاب بهتری هستند. |
بهینهسازی کد | کامپایلر همهٔ کد را یکجا میبیند و از همین روی بهینهسازیهای زیادی را برای اجرای سریعتر کد انجام میدهد. | مفسرها کد را خط به خط میبینند و لذا بهینهسازیهایی که انجام میگیرد به اندازه کامپایلرها قوی نیستند. |
تایپ دینامیک | پیادهسازی آن در کامپایلرها دشوار است چون کامپایلرها نمیتوانند پیشبینی کنند که در حین اجرا چه اتفاقی میافتد. | زبانهای تفسیری به خوبی از تایپ دینامیک پشتیبانی میکنند. |
کاربرد | بیشتر مناسب Production Environment است و از سرعت اجرای به مراتب بیشتری برخوردار است | بیشتر مناسب Development Environment است و سرعت توسعهٔ نرمافزار را بالا میبرد چرا که در صورت وجود باگ در برنامه، دائم نیازی به کامپایل مجدد برنامه نیست. |
هندل کردن خطاها | کامپایلر همهٔ خطاها و اخطارها را در زمان کامپایل نشان میدهد و از همین روی بدون تصحیح کردن خطاها، اجرای برنامه غیرممکن است. | اینترپریتر یک خط از دستورات را میخواند و اگر خطایی وجود داشته باشد آن را نشان میدهد به طوری که برای تفسیر خط بعدی باید خطای قبلی برطرف شده باشد. |
ورودی | کل برنامه را به عنوان ورودی میگیرد. | یک خط از کد را به عنوان ورودی میگیرد. |
خروجی | کامپایلرها کد ماشین تولید میکنند. | مفسرها هیچ کد ماشینی تولید نمیکنند. |
خطاها | همه خطاها را همزمان پس از کامپایل نشان میدهد. | خطاهای یک خط از دستورات را یکییکی نمایش میدهد. |
زبانهای برنامهنویسی تحت پوشش | Scala ،C# ،C++ ،C و Java همه از کامپایلر استفاده میکنند. | Perl ،PHP و Ruby از اینترپریتر استفاده میکنند. |
نتیجهگیری
کامپایلر یک برنامهٔ کامپیوتری است که کد نوشته شده به یک زبان برنامهنویسی سطح بالا را به کد ماشین تبدیل میکند اما اینترپریتر یک برنامه کامپیوتری است که هر خط از دستورات یک زبان سطح بالا را در حین اجرا به کد ماشین تبدیل میکند.
کامپایلرها کدی واسط برای سیستم تولید میکنند که به عنوان یک فایل exe در کامپیوتر ذخیره میشود اما مفسرها هرگز چنین فایل اجرایی را تولید نمیکنند. همچنین بسته به حجم سورسکد، کامپایلر به زمان به نسبت زیادی برای تجزیه و تحلیل و ترجمهٔ سورسکد به زبان قابلفهم برای CPU نیاز دارد اما اینترپریتر سورسکد را خط به خط در حین اجرا ترجمه میکند و بالتبع زمان کمتری را صرف تجزیه و تحلیل برنامه میکند.