۱۳۹۴/۹/۹، ۱۳:۳۴:۵۹ عصر
آشنایی با ماشین مجازی جاوا
در این آموزش قصد داریم تا به تفصیل مفوم JVM یا همان ماشین مجازی جاوا را مورد بررسی قرار دهیم. در واقع از بدو ایجاد زبان برنامه نویسی جاوا شعار طراحان این زبان محبوب این بوده است که Write One, Run Anywhere! به این معنی که "یک بار برنامه جاوای خود را بنویسید سپس روی هر پلتفرمی که خواستید آن را اجرا کنید!" که چنین قابلیتی جز با به کاری گیری مفهومی تحت عنوان "ماشین مجازی جاوا" امکان پذیر نخواهد بود. به طور کلی ماشین مجازی جاوا را می توان در قالب تصویر زیر نشان داد:
همانطور که در تصویر بالا مشخص است، برنامه جاوایی که ما می نویسیم یا همان Source Code برنامه ابتدا توسط جاوا Compile می شود. منظور از اصطلاح Compile تبدیل کدهای جاوا به زبان قابل فهم برای سیستم است که همان صفر و یک می باشند. در واقع ما یک بار بیشتر برنامه خود را Compile نخواهیم کرد و این برنامه Compiled شده برای هر یک از پلتفرم های موجود از قبیل ویندوز، مکینتاش، لینوکس و ... یکسان خواهد بود (لازم به ذکر است که اصطلاح Compiled یک صفت در انگلیسی محسوب می شود نه گذشته فعل Compile)
از این پس این وظیفه ماشین های مجازی است که برنامه Compiled شده را به شکلی که برای پلتفرم مد نظر قابل فهم است تبدیل نماید. به عبارت دیگر ماشین های مجازی تمام تلاش خود را به کار خواهند بست تا از روی کد یکسانی نتایج نسبتاً یکسانی را در پلتفرم های مختلف ایجاد کنند. اکنون پس از آشنایی با نحوه عملکرد ماشین مجازی، قصد داریم تا بیشتر درباره ماهیت خود این ماشین مجازی نکاتی را بیان کنیم:
همانطور که در تصویر فوق مشخص است ماشین مجازی جاوا را می توانیم به عنوان یک لایه مجازی مابین برنامه جاوای نوشته شده و سیستم عاملی که قرار است آن برنامه روی آن اجرا شود تلقی کرد. از سوی دیگر این ماشین مجازی هیچ کاری با سورس برنامه ما نخواهد داشت چرا که برنامه ما ابتدا Compile خواهد شد که در این پروسه همان طور که قبلاً گفته شد، به زبان قابل فهم برای سیستم تبدیل می شود که اصطلاحاً Bytecode نامیده می شود. سپس این زبان قابل فهم برای سیستم مورد استفاده ماشین مجازی قرار می گیرد تا برای سیستم عامل های مختلف بهینه شود.
یکی از مزایای به کارگیری از Bytecode این است که از این طریق می توان دیگر زبان های برنامه نویسی را نیز داخل جاوا به کار برد. به عبارت دیگر، چنانچه زبان برنامه نویسی یی وجود داشته باشد که بتواند خود را به Bytecode قابل فهم برای جاوا Compile کند، ماشین مجازی جاوا خواهد توانست آن بخش از کدی را که در زبان دیگری نوشته شده است را نیز در کنار کدهای جاوا اجرا سازد.
آشنایی با مفهوم Garbage Collection
منظور از واژه Garbage در زبان انگلیسی "زباله" است و واژه Collection نیز به معنی "جمع آوری" می باشد. زمانی که در زبان برنامه نویسی جاوا از این اصطلاح استفاده می کنیم منظور این است که ما به عنوان یک برنامه نویس جاوا نیازی نیست تا خود را درگیر مسائل مربوط به Memory یا "حافظه" کنیم چرا که این وظیفه ای است که بر عهده خود ماشین مجازی جاوا گذاشته شده است. برای روشن شدن نحوه عملکرد Garbage Collection مثالی می زنیم:
فرض کنیم زمانی که برنامه خود را اجرا می کنیم جایی در برنامه دستور می دهیم که یک Object ساخته شود. حال این Object یا شیئ جدید نیازمند مقداری حافظه است و این در حالی است که سیستم ما با کمبود حافظه رو به رو است. در حقیقت Garbage Collection در پشت پرده فعال است و به محض این که بفهمد ما قصد داریم یک شیئ جدید ایجاد کنیم اما حافظه ای برای این شیئ جدید موجود نیست به صورت خودکار بخش های مختلف برنامه را مورد بررسی قرار خواهد داد تا ببیند که آیا شیئی یا چیزی در برنامه وجود دارد که قبلاً ایجاد شده است ولیکن دیگر مورد استفاده قرار نمی گیرد یا خیر! و به محض مواجهه با چنین موقعیتی حافظه اختصاص داده شده به آن شیئ دیگر را گرفته و به شیئ جدیدی که قصد داریم ایجاد کنیم اختصاص می دهد. به طور کلی مفهوم Garbage Collection را می توان یکی از قابلیت بسیار مهم دیگر ماشین مجازی جاوا تلقی نمود.
نکته
ماشین مجازی جاوا علاوه بر قابلیت های بسیاری که در اختیار برنامه نویسان می دهد محدودیت هایی را هم ایجاد می کند که البته این محدودیت ها جزو محدودیت های راه گشایی هستند که منجر به ارتقاء امنیت نرم افزارهای نوشته شده با زبان برنامه نویسی جاوا می شوند. به عبارت دیگر ماشین مجازی جاوا این اجازه را به هیچ وجه به ما نمی دهد تا بخشی از حافظه را که در اختیار دیگر بخش های برنامه است را به زور تصاحب کنیم تا بواسطه آن بتوانیم مثلاً یک شیئ جدید ایجاد کنیم. از سوی دیگر از آنجا که هر برنامه اصطلاحاً داخل یک Sandbox ایجاد می شود، بنابراین برنامه ما به صورت تصادفی به دیگر بخش های سیستم عامل دسترسی نخواهد داشت.
در این آموزش قصد داریم تا به تفصیل مفوم JVM یا همان ماشین مجازی جاوا را مورد بررسی قرار دهیم. در واقع از بدو ایجاد زبان برنامه نویسی جاوا شعار طراحان این زبان محبوب این بوده است که Write One, Run Anywhere! به این معنی که "یک بار برنامه جاوای خود را بنویسید سپس روی هر پلتفرمی که خواستید آن را اجرا کنید!" که چنین قابلیتی جز با به کاری گیری مفهومی تحت عنوان "ماشین مجازی جاوا" امکان پذیر نخواهد بود. به طور کلی ماشین مجازی جاوا را می توان در قالب تصویر زیر نشان داد:
همانطور که در تصویر بالا مشخص است، برنامه جاوایی که ما می نویسیم یا همان Source Code برنامه ابتدا توسط جاوا Compile می شود. منظور از اصطلاح Compile تبدیل کدهای جاوا به زبان قابل فهم برای سیستم است که همان صفر و یک می باشند. در واقع ما یک بار بیشتر برنامه خود را Compile نخواهیم کرد و این برنامه Compiled شده برای هر یک از پلتفرم های موجود از قبیل ویندوز، مکینتاش، لینوکس و ... یکسان خواهد بود (لازم به ذکر است که اصطلاح Compiled یک صفت در انگلیسی محسوب می شود نه گذشته فعل Compile)
از این پس این وظیفه ماشین های مجازی است که برنامه Compiled شده را به شکلی که برای پلتفرم مد نظر قابل فهم است تبدیل نماید. به عبارت دیگر ماشین های مجازی تمام تلاش خود را به کار خواهند بست تا از روی کد یکسانی نتایج نسبتاً یکسانی را در پلتفرم های مختلف ایجاد کنند. اکنون پس از آشنایی با نحوه عملکرد ماشین مجازی، قصد داریم تا بیشتر درباره ماهیت خود این ماشین مجازی نکاتی را بیان کنیم:
همانطور که در تصویر فوق مشخص است ماشین مجازی جاوا را می توانیم به عنوان یک لایه مجازی مابین برنامه جاوای نوشته شده و سیستم عاملی که قرار است آن برنامه روی آن اجرا شود تلقی کرد. از سوی دیگر این ماشین مجازی هیچ کاری با سورس برنامه ما نخواهد داشت چرا که برنامه ما ابتدا Compile خواهد شد که در این پروسه همان طور که قبلاً گفته شد، به زبان قابل فهم برای سیستم تبدیل می شود که اصطلاحاً Bytecode نامیده می شود. سپس این زبان قابل فهم برای سیستم مورد استفاده ماشین مجازی قرار می گیرد تا برای سیستم عامل های مختلف بهینه شود.
یکی از مزایای به کارگیری از Bytecode این است که از این طریق می توان دیگر زبان های برنامه نویسی را نیز داخل جاوا به کار برد. به عبارت دیگر، چنانچه زبان برنامه نویسی یی وجود داشته باشد که بتواند خود را به Bytecode قابل فهم برای جاوا Compile کند، ماشین مجازی جاوا خواهد توانست آن بخش از کدی را که در زبان دیگری نوشته شده است را نیز در کنار کدهای جاوا اجرا سازد.
آشنایی با مفهوم Garbage Collection
منظور از واژه Garbage در زبان انگلیسی "زباله" است و واژه Collection نیز به معنی "جمع آوری" می باشد. زمانی که در زبان برنامه نویسی جاوا از این اصطلاح استفاده می کنیم منظور این است که ما به عنوان یک برنامه نویس جاوا نیازی نیست تا خود را درگیر مسائل مربوط به Memory یا "حافظه" کنیم چرا که این وظیفه ای است که بر عهده خود ماشین مجازی جاوا گذاشته شده است. برای روشن شدن نحوه عملکرد Garbage Collection مثالی می زنیم:
فرض کنیم زمانی که برنامه خود را اجرا می کنیم جایی در برنامه دستور می دهیم که یک Object ساخته شود. حال این Object یا شیئ جدید نیازمند مقداری حافظه است و این در حالی است که سیستم ما با کمبود حافظه رو به رو است. در حقیقت Garbage Collection در پشت پرده فعال است و به محض این که بفهمد ما قصد داریم یک شیئ جدید ایجاد کنیم اما حافظه ای برای این شیئ جدید موجود نیست به صورت خودکار بخش های مختلف برنامه را مورد بررسی قرار خواهد داد تا ببیند که آیا شیئی یا چیزی در برنامه وجود دارد که قبلاً ایجاد شده است ولیکن دیگر مورد استفاده قرار نمی گیرد یا خیر! و به محض مواجهه با چنین موقعیتی حافظه اختصاص داده شده به آن شیئ دیگر را گرفته و به شیئ جدیدی که قصد داریم ایجاد کنیم اختصاص می دهد. به طور کلی مفهوم Garbage Collection را می توان یکی از قابلیت بسیار مهم دیگر ماشین مجازی جاوا تلقی نمود.
نکته
ماشین مجازی جاوا علاوه بر قابلیت های بسیاری که در اختیار برنامه نویسان می دهد محدودیت هایی را هم ایجاد می کند که البته این محدودیت ها جزو محدودیت های راه گشایی هستند که منجر به ارتقاء امنیت نرم افزارهای نوشته شده با زبان برنامه نویسی جاوا می شوند. به عبارت دیگر ماشین مجازی جاوا این اجازه را به هیچ وجه به ما نمی دهد تا بخشی از حافظه را که در اختیار دیگر بخش های برنامه است را به زور تصاحب کنیم تا بواسطه آن بتوانیم مثلاً یک شیئ جدید ایجاد کنیم. از سوی دیگر از آنجا که هر برنامه اصطلاحاً داخل یک Sandbox ایجاد می شود، بنابراین برنامه ما به صورت تصادفی به دیگر بخش های سیستم عامل دسترسی نخواهد داشت.