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