آشنایی با روند اجرای برنامه در جاوا
وقتی با ویرایشگر متنی یا ادیتورهایی مانند نت بینز، اکلیپس و … کدی رو می نویسیم و اجرا میکنیم، درگیر جزئیات اجرای برنامه نمیشویم و به سادگی خروجی کد را مشاهده می کنیم، ولی در این آموزش قصد داریم نگاه جزئیتری به روند اجرای برنامهها در جاوا داشته باشیم و ببینیم برای مشاهده خروجی کد چه مراحلی طی میشود.
ما معمولا در برابر برنامه های جاوا(منظور از برنامه های جاوا، برنامه های نوشته شده در نسخه استاندارد جاوا یا همان java se میباشد) دو رویکرد داریم، اولین رویکرد این میباشد که به عنوان برنامه نویس کد را مینویسیم و رویکرد دوم هم این که از برنامه ای که فرد دیگه ای آن را نوشته، استفاده می کنیم. در این آموزش حالتی در نظر گرفته میشود که قصد داریم کد را نوشته و سپس آن را اجرا کنیم. بعد از این که کد رو نوشتیم برای اینکه خروجی کار رو مشاهده کنیم باید دو مرحله را طی کنیم:
- کامپایل کد
- اجرای کد کامپایل شده
برای این منظور از ابزاری به نام JDK یا Java Delopment Kit استفاده میکنیم، که شامل مجموعه ای از نرم افزارها میباشد که هم امکان کامپایل و هم امکان اجرای کد را در اختیار ما قرار میدهد. برای درک بهتر نحوه کارکرد JDK قطعه کد زیر را در نظر بگیرید :
public class Program{ public static void main(String[] args){ System.out.println("Hello World!"); } }
در این قطعه کد با استفاده از متد println، عبارتی را در خروجی نمایش دادهایم. هدف ما نوشتن یک کد پیچیده نیست بلکه با استفاده از این قطعه کد قصد داریم مراحل اجرای برنامه در جاوا را بررسی کنیم. همان طور که در بالا هم اشاره کردیم JDK ابزارهای موردنظر برای کامپایل و اجرای برنامه را در اختیار ما قرار میدهد. در شکل زیر ساختاری از JDK نمایش داده شده است:
همان طور که در شکل بالا نشان داده شده است، یکی از ابزارهای موجود در JDK، ابزاری به نام javac میباشد که وظیفه کامپایل کد را بر عهده دارد. پس اولین مرحله اجرای کد، کامپایل کد است .قبل از ادامه بحث برای تفهیم بیشتر موضوع توضیحات بیشتری در رابطه با مفهوم کامپایلر و کامپایل شدن ارائه میدهیم.
کامپایلر
سیستم های کامپیوتری که برنامه های ما را اجرا میکنند تنها قادر به درک صفر و یک میباشند، برای مثال فرض کنید قرار است دو عدد با هم جمع شوند، تمام مراحل این عملیات درقالب مجموعه ای از صفر و یکها که قابل فهم برای پردازنده میباشد به سیستم کامپیوتری داده میشود. اولین زبانهای برنامه نویسی هم که به وجود آمدند، در قالب همین صفر و یک ها بودند که نمونه ای از این برنامه در شکل زیر قایل مشاهده میباشد:
همان طور که در شکل بالا مشخص میباشد، کدنویسی به این صورت کار چندان ساده ای نیست و همچنین فهم این کد برای برنامه نویس مشکل میباشد، پس با گذر زمان و تکامل زبان های برنامه نویسی اصطلاحا زبانهای برنامهنویسی سطح بالا (مانند جاوا و سی پلاس پلاس) به وجود آمدند. سطح بالا به این مفهوم است که درک و فهم این زبانها برای انسان و به ویژه برنامه نویس خیلی راحت تر و ساده تر میباشد. برای مثال برای جمع دو عدد ۳ و ۱ به سادگی از عبارت ۱+۳ استفاده میشود، و دیگر نیازی نیست که برنامه نویس درگیر کدنویسی به صورت صفر و یک شود ولی مشکل اصلی این بود که پردازنده این دستورات سطح بالا ( مانند عملگر + برای جمع کردن دو عدد ) رو متوجه نمیشد.
این مشکل ناشی از آن بود که پردازنده تنها دستورات صفر ویک رو متوجه میشود، پس نیاز به یک برنامه یا اصطلاحا مترجم بود که دستورات سطح بالا رو به دستوراتی که قابل فهم برای پردازنده باشد، تبدیل کند. حال این ترجمه به دو صورت کامپایل شدن و تفسیر شدن پیاده سازی شده است که ما با جزئیات این دو دسته کاری نداریم، تنها مسئله مهم درک مفهوم کامپایل شدن میباشد.
نکته:کامپایل شدن(compile) یعنی تبدیل دستورات سطح بالا(مثل دستور جمع کردن دو عدد)، به دستورات قابل فهم برای پردازنده
در زبان هایی مثل سی پلاس پلاس و جاوا نحوه کامپایل شدن اندکی دارای تفاوت میباشد، در زبان سی پلاس پلاس وقتی عملیات کامپایل انجام میشود، کدهای نوشته شده مستقیما به کدهایی که برای پردازنده قابل فهم است، تبدیل میشود. برای مثال در سیستم عامل ویندوز وقتی یک برنامه به زبان سی پلاس پلاس نوشته میشود، کامپایلر کدهای نوشته شده رو به کدهای قابل فهم برای پردازنده تبدیل میکنه و خروجی رو در قالب فایل exe. ایجاد میکند ولی اگه این فایل خروجی رو در سیستم عاملی مثل لینوکس اجرا کنیم با خطا مواجه میشویم چون پردازنده سیستم عامل لینوکس، کدهای کامپایل شده برای پردازنده سیستم عامل ویندوز رو متوجه نمیشود، پس باید دوباره کد رو بنویسیم و در سیستم عامل لینوکس کامپایل کنیم تا کد کامپایل شده مناسب برای پردازنده این سیستم عامل تولید شود.
پس اینجا با مشکلی مواجه هستیم که در هر سیستم عامل باید به صورت مجزا کد کامپایل شود و کد نوشته شده در یک سیستم عامل هنگام اجرا در سیستم عامل های دیگه با خطا مواجه میشود ولی در زبانی مانند جاوا عملیات کامپایل، کد نوشته شده را مستقیما به کدی که برای پردازنده قابل فهم باشد تبدیل نمیکند، بلکه آن را به کد میانی یا اصطلاحا بایت کد(Byte Code) تبدیل میکند. مزیت استفاده از این روش این میباشد که میتوان بایت کد رو به هر سیستم عاملی منتقل کرد، و در آن سیستم عامل خروجی مشاهده نمود یا به عبارت دیگر این کار باعث میود که وابستگی به نوع سیستم عامل وجود نداشته باشد و کد نوشته شده رو میتوان روی همه پلتفرم ها اجرا کرد.
مرحله اول اجرای کد : تبدیل کد به بایت کد(compile)
پس در اولین مرحله از اجرای کدی که نوشتیم، کامپایلر جاوا کد نوشته شده رو به بایت کد تبدیل میکند:
که همان طور که در شکل بالا نشان داده شده است، کامپایلر کد نوشته شده ما را به بایت کد تبدیل میکند.
مرحله دوم اجرای کد : تبدیل کد کامپایل شده به کد قابل فهم برای پردازنده
برای اینکه این بایت کد رو به کد قابل فهم برای پردازنده تبدیل کنیم، از ابزاری از JDK به اسم JRE استفاده میکنیم که این ابزار برنامه ای به نام JVM(ماشین مجازی جاوا) دارد که وظیفه تبدیل کدمیانی (بایت کد) به کد قابل فهم برای پردازنده را به عهده دارد. در واقع میتوان بایت کد را به هر سیستم عاملی منتقل نمود و برای اجرای کدمیانی سیستم عامل مقصد تنها باید نرم افزار JRE را بر روی خودش نصب داشته باشد(هر کدام از ابزارهای JDK و JRE رو به صورت جداگانه میتوان نصب کرد)
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.