کدها و برنامه ها چگونه اجرا می‌شوند؟

آیا تا به حال فکر کرده‌اید که برنامه و نرم‌افزارها چگونه اجرا می‌شوند ؟ اگر برنامه‌نویسی کرده باشید یا در حال یادگیری آن باشید، مطمئناً برایتان سؤال می‌شود که کدها چگونه اجرا می‌شوند؟ در این آموزش روش‌های اجرای کد در کامپیوتر را با هم بررسی می‌کنیم. همچنین با مفهوم کامپایلر و مفسر در زبان‌ها آشنا خواهیم شد.

سخت‌افزارهای کامپیوتر قطعات الکترونیکی هستند که از جریان الکتریکی استفاده می‌کنند. جریان برق می‌تواند قطع یا وصل باشد. در کامپیوتر به قطع و وصل بودن جریان 0 و 1 گفته می‌شود.

برای اینکه کامپیوتر چیزی را متوجه شود، باید با او به زبان صفر و یک یا باینری (binary) صحبت کنیم. در حقیقت هر چیزی که در کامپیوتر اجرا یا ذخیره می‌شود به صورت 0 و 1 است.

همانطور که می‌دانید یکی از دسته‌بندی انواع زبان های برنامه نویسی تقسیم‌بندی بر اساس سطح اجرای زبان است. کد ماشین یا زبان ماشین رشته‌های 0 و 1 است. پس از آن زبان‌های سطح پایین و سپس سطح بالا وجود دارند.

برنامه‌نویسی با صفر و یک‌ها کاری بسیار سخت و برای اکثر کاربردهای امروزی غیرضروری است. بنابراین از کدهای سطح بالا برای دستور دادن به کامپیوتر استفاده می‌کنیم. اما این کدها باید در نهایت به زبان ماشین تبدیل شوند. در ادامه با روش‌های تبدیل کد سطح بالا به زبان ماشین آشنا می‌شویم.

فرآیند اجرای کد و برنامه‌ها

هر برنامه در کامپیوتر از تعدادی دستورالعمل تشکیل شده است. این دستورها به ترتیب در پردازنده کامپیوتر اجرا شده و نتیجه نهایی همان چیزی می‌شود که می‌بینیم.

اگر برنامه‌ای با زبان برنامه‌نویسی غیر از صفر و یک نوشته شده باشد، باید ابتدا به 0 و 1 تبدیل شده و سپس به پردازنده ارسال شود. به فرآیند تبدیل کدهای سطح بالا به کد 0 و 1 اصطلاحاً ترجمه کد گفته می‌شود.

برای ترجمه کدهای برنامه‌نویسی شده دو روش وجود دارد:

  1. کامپایل کردن کد (به کمک کامپایلر)
  2. تفسیر کردن کد (به کمک مفسر)

هر زبان برنامه‌نویسی به یکی از این دو روش کدهای خود را اجرا می‌کند. در نتیجه می‌توانیم زبان‌های برنامه‌نویسی را به دو دسته زبان‌های کامپایلری و زبان‌های مفسری تقسیم‌بندی کنیم.

در ادامه به طور دقیق‌تر در مورد روش کار و مزایا و معایب هر کدام بیشتر صحبت می‌کنم اما اگر بخواهم خیلی سریع و ساده این دو مفهوم را توضیح دهم به این صورت است که:

در زبان‌های کامپایلری کدهای نوشته شده به صورت یکجا ترجمه می‌شوند. پس از ترجمه، یک فایل حاوی کدهای سطح ماشین برای سیستم عامل و سخت‌افزار فعلی در اختیار خواهیم داشت. از این پس هر گاه بخواهیم برنامه را اجرا کنیم، فقط کافی است فایل نهایی (کامپایل شده) را اجرا کنیم.

هنگام اجرای کد در زبان‌های مفسری هر خط از برنامه در همان لحظه ترجمه شده و برای پردازش به پردازنده فرستاده می‌شود. در مدت زمانی که برنامه منتظر اجرای آن است، خط بعدی ترجمه می‌شود. در این حالت برای اجرای برنامه نیاز به مفسر آن زبان داریم اما کدهای ما وابسته به یک سیستم خاص نخواهد بود.

آموزش انواع دستورهای برنامه نویسی

آموزش انواع دستورهای برنامه نویسی

روش کار کامپایلر (compiler)

در زبان‌های کامپایلری ابتدا کد برنامه را می‌نویسیم. به این کدها، کد منبع گفته می‌شود. سپس آن را کامپایلر کرده و یک فایل تحویل می‌گیریم. به فایل نهایی فایل شئ (Object File) گفته می‌شود. این فایل همان ترجمه کد ما به زبان ماشین است. برای اجرای برنامه، کافی است فایل ترجمه‌شده را اجرا کنیم.

وقتی کامپایلر را اجرا می‌کنیم، کد ما در کامپایلر بررسی می‌شود و دستورهای معادل آن برای ماشین تولید خواهد شد. کد ماشین در یک فایل دیگر (غیر از سورس کد اصلی) ذخیره شده و بعد از آن برای اجرای برنامه باید فایل ترجمه شده را اجرا کنیم.

روند اجرای کد زبان کامپایلری
روند اجرای کد زبان کامپایلری

هر ریزپردازنده دارای دستورالعمل‌های خاص خودش است. همچنین نحوه دسترسی به منابع مختلف در سیستم عامل‌های مختلف با یکدیگر متفاوت است. در نتیجه کامپایلر مجبور است کدهای ماشین را مطابق با سیستمی که روی آن قرار دارد ایجاد کند.

با این توصیف، هر کدی که توسط کامپایلر ترجمه می‌شود روی یکسری از سیستم عامل‌ها و سخت‌افزارها کار می‌کنند. اگر بخواهیم کدمان را روی یک ماشین دیگر اجرا کنیم، مجبوریم عملیات کامپایل کردن (compile) را مجدد انجام دهیم.

خطای زمان کامپایل یکی از خطاهایی است که در برنامه‌نویسی رخ می‌دهد. معمولاً اگر کتابخانه‌های استفاده شده در دسترس نباشند، با این خطا مواجه می‌شویم. (در مورد خطاهای برنامه‌نویسی بیشتر بدانید!)

زبان‌های C و C++ و BASIC و SWIFT از جمله زبان‌های کامپایلری هستند.

ویژگی‌های اجرای کد با کامپایلر

در زبان‌های کامپایلری کد ما فقط یک بار به زبان ماشین ترجمه شده و پس از آن می‌تواند چندین بار اجرا شود. در نتیجه سرعت بیشتری در اجرای برنامه خواهیم داشت.

اگر نیاز به خطایابی کد داشته باشیم، چون مجبوریم پس از هر بار تغییر، یک بار فرآیند کامپایل کردن را انجام دهیم، معمولاً یک روند سخت‌تر در خطایابی نسبت به مفسری‌ها داریم.

مطمئناً می‌دانید که زمان کامپایل به حجم کدها و وابستگی‌هایی که در کدهایمان داریم بستگی دارد. بنابراین ممکن است در یک پروژه کوچک (چند خطی) مرحله کامپایل شدن کد به کمک IDEها زیاد احساس نشود!

با فرض اینکه ماشین و سیستم عامل ما مشابه باشد، برای اجرای برنامه فقط کافی است فایل کامپایل شده را استفاده کنیم. بنابراین در این حالت خاص، نیازمندی نرم‌افزاری نخواهیم داشت.

به دلیل اینکه فرآیند کامپایل کردن کد به زمان اجرای کد ربطی ندارد، بعضاً به آن ترجمه آفلاین کد نیز می‌گویند.

روش اجرای مفسر (interpreter)

زبان‌های مفسری که گاهی به آن‌ها اینترپرتری هم گفته می‌شود، کدها را همزمان با اجرای برنامه کامپایل می‌کنند. به این صورت که خط اول برنامه به کد ماشین تبدیل شده و برای پردازنده ارسال می‌شود، سپس مفسر به خط دوم رفته و همین کار را برای آن انجام می‌دهد.

منظور از تفسیر شدن (interpret) همان ترجمه کد سطح بالا به کد سطح ماشین (0 و 1) است. مشخص است که برای اجرای کد به این روش، باید مفسر آن زبان را در اختیار داشته باشیم.

روند اجرای کد برنامه زبان‌های مفسری
روند اجرای کد برنامه زبان‌های مفسری

بر خلاف کدهای کامپایلری که یک فایل حاوی کدهای ماشین به ما می‌داد، کدهای مفسری در لحظه تبدیل به کد ماشین شده و اجرا می‌شوند؛ در نتیجه به کد ماشین آن‌ها در حالت معمول دسترسی نداریم.

زبان‌های PHP ، پایتون، پرل، متلب، جاوا اسکریپت و روبی از جمله زبان‌های محبوب مفسری هستند.

ویژگی‌های اجرای کد در مفسر

اگر بخواهیم یک برنامه را ده بار اجرا کنیم، فرآیند تفسیر (ترجمه کدها) باید ده بار انجام شود! به دلیل اجرای خط به خط ترجمه در لحظه اجرا، زبان‌های مفسری سرعت کمتری نسبت به کامپایلری‌ها دارند. چون علاوه بر زمان اجرای کد ماشین، مجبوریم منتظر ترجمه هر دستور نیز بمانیم.

چون اجرای کدهای مفسری به صورت خط به خط اجرا می‌شوند، فرآیند خطایابی و تصحیح ایرادهای برنامه راحت‌تر است. نتیجه این کدها را به کمک IDEها می‌توانیم خط به خط ببینیم و راحت‌تر متوجه تغییرات آن بشویم.

چون اجرای این کدها نیاز به مفسر دارد، بنابراین هر جایی که بخواهیم برنامه را اجرا کنیم، باید ابتدا مفسر زبان را نصب کنیم. اما مزیت آن‌ها نسبت به کامپایلری‌ها این است که می‌توانیم کد نوشته شده را روی هر سیستم و ماشینی اجرا کنیم.

چون ترجمه کدهای این زبان‌ها همزمان با اجرای برنامه انجام می‌شود، به آن‌ها ترجمه همزمان یا ترجمه آنلاین نیز گفته می‌شود.

اجرای ترکیبی کد کامپایلری و مفسری

این نوع از اجرای کدها جزء دسته کامپایلری‌ها قرار می‌گیرد. اما برخی معتقدند این نوع اجرا یک حالت ترکیبی از کامپایلر و مفسر است و لازم است یک دسته‌بندی جدید برایشان در نظر بگیریم.

اگر بخواهیم دو مزیت و عیب کامپایلر و مفسر را بررسی کنیم، نتیجه به این صورت می‌شود که کامپایلر باعث افزایش سرعت اجرای کد می‌شود ولی به سیستم وابسته است. از طرفی مفسرها سرعت پایین‌تری دارند ولی از سیستم مستقل هستند. (دو تفاوت کامپایلر و مفسر)

برخی از زبان‌های برنامه‌نویسی تلاش کرده و می‌کنند که حالتی بین این دو را داشته باشند. به این صورت که ابتدا کد ما (کد اصلی برنامه) را به یک کد میانی (IL) تبدیل کنند. سپس این کد میانی را به واسطه مفسر خود، روی تمام سیستم‌ها اجرا کنند.

زبانی که با این ایده شناخته شد و در رسیدن به این هدف هم بسیار موفق بود، زبان برنامه‌نویسی جاوا (Java) است.

در این زبان کدهای ما (با فرمت .java) توسط کامپایلر برای ماشین مجازی جاوا ترجمه می‌شود. با این کار، یک فایل با فرمت .class در اختیار داریم که قابل اجرا توسط ماشین مجازی جاوا است.

ماشین مجازی جاوا (JVM) یک برنامه است که روی تمام سیستم‌ها نصب می‌شود. در حقیقت این ماشین مجازی، فایل‌های .class را به صورت مفسری روی ماشین اصلی که کامپیوتر ماست اجرا می‌کند.

ماشین مجازی زبان‌های برنامه‌نویسی چگونه کار می‌کنند؟
ماشین مجازی زبان‌های برنامه‌نویسی چگونه کار می‌کنند؟

با این ایده، فرآیند ترجمه کدهای برنامه نویسی شده به دو مرحله کامپایل (ترجمه آفلاین) و تفسیر (ترجمه آنلاین) تقسیم می‌شود. در این‌گونه زبان‌ها کافی است یک بار کد برنامه را نوشته و کامپایل کنیم. سپس هر ماشینی که ماشین مجازی زبان مورد نظر را داشته باشد، می‌تواند این برنامه را اجرا کند.

در حقیقت یک لایه میانی یا یک بستر اجرای کدهای برنامه‌نویسی شده بین کدهای سطح بالا و کدهای سطح ماشین ایجاد شده است.

به فایل‌های کامپایل شده در این زبان‌ها، فایل‌های بایت کد (Byte Code) می‌گویند. همچنین به این نوع تفسیر، بعضاً مفسر بایت کد نیز گفته می‌شود.