ماشین مجازی جاوا چیست؟
ماشین مجازی جاوا (Java Virtual Machine) که به صورت اختصار JVM مشخص میشود، یک محیط اجرایی است که برای اجرای برنامههای نوشته شده به زبان جاوا طراحی شده است. به عبارت سادهتر در آموزش برنامه نویسی، JVM یک نرمافزار است که کدهای جاوا را میخواند و آنها را به کدهای قابل فهم برای سیستم عامل تبدیل میکند.
در واقع JVM مجموعهای از برنامههای نرمافزاری و ساختماندادههایی است که برای مدلسازی ماشینی مجازی اجرای برنامههای سایر رایانهها و اسکریپتهای دیگر سامانههاُ به کار میرود. مدلی که جیویام برای اجرا میپذیرد، شکلی از زبان میانی را اجرا مینماید. به این زبان میانی جاوا بایت کد گفته میشود. این زبان میانی، به صورتی مفهومی، مجموعهای از دستورهاِ زبان برنامهنویس مبتنی به پشته و معماری قابلیت مبتنی بر امنیت است. هم اکنون، ۴٫۵ میلیارد دستگاه در جهان از جیویام استفاده مینمایند.
مفاهیم ماشین مجازی جاوا
یک ماشین مجازی جاوا، علاوه بر جاوا، زبانهای برنامهنویسی دیگری را هم پشتیبانی مینماید. برای مثال دستورها زبان برنامهنویسی ادا توانایی ترجمه به بایت کد و نیز اجرا در این ماشین مجازی را دارا هستند. علاوه بر شرکت سان (که شرکت توسعه دهندهٔ جاواست که البته این انحصار به شرکت اوراکل واگذار شدهاست)، سایر شرکتها نیز ماشینهای مجازی جاوایی را منتشر نمودهاند؛ که البته این کار تحت ویژگیهای منتشر شده توسط سان، صورت میپذیرد. همچنانکه تمام حقوق تجاری آن تحت نام جاوا و متعلق به سان است.
جاوا، متبادر کنندهٔ مفهومی خاص است: یکبار بنویس، همهجا اجرا کن. این مفهوم توسط جیویام، پیادهسازی شدهاست. جیویام، محیطی برای اجرای برنامههای جاوا میباشد. این ماشین مجازی نرمافزاری است که در لایهٔ بالایی سختافزار واقعی و سیتمعامل قرار میگیرد.
جیویام جزء حیاتی سکوی جاو است. جیویام، بر روی بسیاری از سختافزارها و سکوهای نرمافزاری قابل نصب است. جاوا با استفاده از بایت کد یکسان برای تمام سکوها، ویژگیای را معرفی مینماید با نام: یک بار ترجمه کن، هرجایی اجرا کن که مخالف با مفایر با یکبار بنویس، همهجا اجرا کن است. چراکه یکبار بنویس …، دربارهٔ زبانهای ترجمهشوندهٔ چند سکویی است.
جیویام، به همراه مجموعهای از کتابخانههای کلاسِ استاندارد توزیع میگردد. این کتابخانهها رابط برنامهنویسی نرمافزار را پیادهسازی مینماید. یک رابط برنامهنویسی نرمافزار، توسط یک سامانهٔ رایانهای، کتابخانه، یا برنامه برای تبادل داده بین آنها فراهم میگردد. این رابطهای برنامهای، به صورت متناسب و با هم، در محیط زمانِاجرای جاوا (JRE) به صورت یک بسته وجود دارد.
محیط اجرایی ماشین مجازی java:
برنامهایی که میخواهند بر روی جیویام، اجرا شوند، باید در قالبی استاندارد و کد دودویی (باینری) قابل حمل ترجمه شدهباشند که به شکل نقطهکلاس (class.) است. یک برنامه ممکن است شامل تعداد زیادی کلاس در قالب فایلهای مختلف باشد. برای توزیع سادهترِ برنامههای با اندازهٔ بزرگ، معمولاً این برنامهها را در فایلهایی با قالب .jar، (که کوتهنوشت Java archive) ذخیره میگردد.
محیط اجرایی جیویام، فایلهایی با قالب .class یا .jar اجرا مینماید. این کار با استفاده از شبیهسازی مجموعه دستورها جیویام و با از تفسیر نمودن آن صورت میپذیرد. همچنین اجرای برنامه میتواند از طریق ترجمه همزمانِ هاتاسپاتِ جاوا صورت پذیرد. ترجمه همزمانِ٬که در واقع تفسیر نیست، برای دستیابی به سرعتهای بالاتر در نسخههای امروزی جیویام استفاده میگردد. البته برای آن دسته از توسعهگران، که برای سامانههای خاص، نیاز به کد بومی دارند، ترجمهٔ زودهنگام نیز برای جیویام وجود دارد.
مانند بسیاری از ماشینهای مجازی، ماشین مجازی جاوا، دارای ساختاری مبتنی بر پشته که مبتنی بر ریزپردازنده/ریزکنترلگر اجرا کنندهٔ آن است .
وظیفهٔ جیویام به عنوان شیءای از محیط اجرای جاوا، اجرای برنامههای جاوا میباشد. بعد از اتمام اجرای برنامهٔ جاوا، این شیء به وسیلهٔ زباله روب، پالایش میشود. ترجمهٔ همزمان، به عنوان بخشی از ماشین مجازی جاوا به منظور افزایش سرعت اجراست. این روش ترجمه، با ترجمهٔ همزمان بخشهایی که عملکرد یکسانی را دارند و کاهش زمان لازم برای ترجمه، این افزایش سرعت را به ارمغان میآورد.
زبانهای جیویام
اگرچه جیویام در ابتدا تنها با هدف ترجمهٔ برنامههای جاوا پا به عرصه گذاشته بود، اما امروزه بسیاری از زبانهای دیگر نیز قادر به اجرای برنامههای خود بر روی آن هستند. جیویامِ کنونی هیچگونه پشتیبانی از زبانهایی که بررسی نوع در آنها به صورت پویاست نمیکند، چرا که بررسی نوع موجود از نوع ایستاست. با این وجود از جیویام میتوان به عنوان مفسری برای زبانهایی با بررسی نوع پویا، استفاده نمود.
پشتیبانی از تغییر پویا در کلاسها و متدها در جیویام به صورت محدود صورت میپذیرد که همان هم تحت محیط عیبیابی است. با این وجود کلاسها و متدها را میتوان به صورت پویا اضافه نمود. از هماکنون طرحی برای پشتیبانی توکار از زبادهای پویا در نگارش هفتم جاوا در دست است.
چرا ماشین مجازی جاوا اهمیت دارد؟
- پلتفرم مستقل بودن: یکی از مهمترین مزایای جاوا، پلتفرم مستقل بودن آن است. به این معنی که اگر یک برنامه جاوا را روی یک سیستم عامل خاص کامپایل کنید، میتوانید آن را بدون تغییر روی هر سیستم عاملی که JVM روی آن نصب شده، اجرا کنید. این قابلیت به لطف JVM امکانپذیر شده است.
- مدیریت حافظه خودکار: JVM به صورت خودکار حافظه را مدیریت میکند و از نشت حافظه جلوگیری میکند. این ویژگی باعث میشود که برنامهنویسان جاوا کمتر نگران مدیریت حافظه باشند.
- امنیت: JVM دارای مکانیزمهای امنیتی قوی است که از اجرای کدهای مخرب جلوگیری میکند.
- جمعآوری زباله: JVM به صورت خودکار حافظهای که دیگر مورد استفاده قرار نمیگیرد را آزاد میکند که به این فرآیند جمعآوری زباله گفته میشود.
چگونه JVM کار میکند؟
- کامپایل به بایتکد: وقتی یک برنامه جاوا را کامپایل میکنید، خروجی آن یک فایل با پسوند .class است که حاوی بایتکد جاوا است. بایتکد یک زبان ماشین سطح پایین است که برای JVM قابل فهم است.
- بارگذاری کلاس: وقتی یک برنامه جاوا را اجرا میکنید، JVM فایل کلاس را بارگذاری کرده و آن را در حافظه قرار میدهد.
- تفسیر یا کامپایل JIT: JVM میتواند بایتکد را تفسیر کند یا آن را به کد ماشین بومی کامپایل کند (JIT یا Just-In-Time). کامپایل JIT باعث میشود که برنامههای جاوا سریعتر اجرا شوند.
- اجرای برنامه: JVM بایتکد را اجرا کرده و خروجی برنامه را نمایش میدهد.
مزایای استفاده از JVM
- پلتفرم مستقل بودن: همانطور که قبلاً ذکر شد، این ویژگی باعث میشود که برنامههای جاوا قابل حمل باشند.
- امنیت: JVM دارای مکانیزمهای امنیتی قوی است که از اجرای کدهای مخرب جلوگیری میکند.
- مدیریت حافظه خودکار: برنامهنویسان جاوا نیازی به نگرانی در مورد مدیریت حافظه ندارند.
- جامعه بزرگ: جاوا یک زبان برنامهنویسی بسیار محبوب است و جامعه بزرگی از برنامهنویسان دارد که منابع و ابزارهای زیادی برای آن موجود است.
در چه مواردی از JVM استفاده میشود؟
ماشین مجازی جاوا (JVM) یک ابزار بسیار قدرتمند و پرکاربرد در دنیای برنامهنویسی است که کاربردهای گستردهای دارد. در ادامه به برخی از مهمترین مواردی که از JVM استفاده میشود اشاره میکنیم:
۱. توسعه برنامههای تحت وب:
- سرولتها و JSP: بسیاری از وبسرویسها و وباپلیکیشنها با استفاده از سرولتها و JSP که بر روی JVM اجرا میشوند، توسعه داده میشوند.
- فریمورکهای وب: فریمورکهای محبوبی مانند Spring، Hibernate و Struts بر روی JVM اجرا میشوند و توسعه وباپلیکیشنهای پیچیده را تسهیل میکنند.
- میکروسرویسها: معماری میکروسرویسها که در آن یک اپلیکیشن به سرویسهای کوچکتر تقسیم میشود، به طور گستردهای از جاوا و JVM استفاده میکند.
۲. توسعه برنامههای دسکتاپ:
- جاوا اف ایکس: با استفاده از جاوا اف ایکس (JavaFX) میتوان برنامههای دسکتاپ گرافیکی زیبا و پلتفرم مستقلی ایجاد کرد.
- آپلتهای جاوا: اگرچه استفاده از آپلتها کمتر شده است، اما در گذشته برای اجرای برنامههای کوچک در مرورگر از آنها استفاده میشد.
۳. توسعه برنامههای موبایل:
- اندروید: سیستم عامل اندروید از ماشین مجازی Dalvik و سپس از ART (Android Runtime) استفاده میکند که بر اساس JVM طراحی شدهاند.
- برنامههای کراس پلتفرم: برخی از فریمورکها مانند Apache Cordova به توسعهدهندگان اجازه میدهند تا با استفاده از جاوا و سایر زبانهای برنامهنویسی، برنامههای موبایلی برای پلتفرمهای مختلف ایجاد کنند.
۴. توسعه بازیها:
- LibGDX: این فریمورک به توسعهدهندگان اجازه میدهد تا بازیهای دوبعدی و سهبعدی را برای پلتفرمهای مختلف با استفاده از جاوا ایجاد کنند.
- Minecraft: بازی محبوب Minecraft در ابتدا با استفاده از جاوا توسعه داده شد.
۵. بیگ دیتا و پردازش موازی:
- Hadoop: فریمورک Hadoop برای پردازش حجم عظیمی از دادهها از جاوا استفاده میکند.
- Spark: فریمورک Spark نیز برای پردازش دادههای بزرگ به صورت موازی و توزیع شده از جاوا استفاده میکند.
۶. ابزارهای توسعه و تست:
- JUnit: یکی از محبوبترین فریمورکهای تست واحد در جاوا است که برای اطمینان از کیفیت کد استفاده میشود.
- Maven و Gradle: این ابزارها برای مدیریت وابستگیها و ساخت پروژههای جاوا استفاده میشوند.
۷. سیستمهای امبدد:
- کارتهای هوشمند: برخی از کارتهای هوشمند از جاوا برای اجرای اپلیکیشنهای کوچک استفاده میکنند.
- دستگاههای IoT: برخی از دستگاههای اینترنت اشیا از جاوا برای اجرای نرمافزار خود استفاده میکنند.
معماری داخلی JVM
در زیر به شرح معماری داخلی JVM می پردازیم. معماری JVM بخش هایی نظیر classloader، memory area، execution engine و غیره … را شامل می شود.
Classloader
Classloader زیرسامانه ی برنامه ی JVM بوده و class file هایی که حاوی bytecode جاوا می باشد را در ناحیه ای به نام runtime data area یا مکان ذخیره ی داده های زمان اجرا بارگذاری می کند.
Class (Method) Area / ناحیه ی ذخیره ی اطلاعات کلاس
این ناحیه ساختارهای اختصاصی کلاس نظیر مجموعه ثوابت زمان اجرا (runtime constant pool)، فیلد، داده و کد مربوط به متدها را در خود ذخیره می کند.
Heap
ناحیه ای در حافظه که آبجکت ها در زمان اجرا در آن ذخیره می شوند.
Stack (حفاظه ی پشته)
ناحیه ی stack در حافظه که frame ها را در خود ذخیره می کند (stack در معنای کلی به ناحیه ای از حافظه گفته می شود که داده ها به صورت static و در زمان کامپایل در آن ذخیره می شوند). متغیرهای محلی و نتایج جزئی را نگه داشته و در فراخوانی متد و بازگردانی خروجی از آن متد، نقش دارد. هر thread یک JVM stack دارد که همزمان با thread ایجاد می شود. همچنین با هربار فراخوانی متد، یک frame جدید ساخته می شود. زمانی که فراخوانی متد خاتمه یافت، frame مربوطه حذف می شود.
Program Counter Register (شمارنده ی برنامه)
این واحد حافظه ای با دسترسی سریع و آسان در پردازنده ی رایانه است که آدرس دستوری از برنامه ی JVM که در زمان حاضر در حال اجرا است را در خود نگه می دارد.
Native method stack (حافظه پشته حامل متدهای native)
این واحد تمامی متدهای native که در اپلیکیشن بکار می روند را دربر می گیرد.
Execution Engine (موتور اجرا کننده)
این واحد خود بخش های زیر را شامل می شود:
- یک virtual processor: یک CPU فیزیکی که برای دستگاه مجازی تخصیص می یابد.
- مفسر یا interpreter: کدهای کامپایل شده به زبان میانی یا bytecode را خوانده و سپس دستورات را اجرا کند.
- Just-In-Time (JIT) Compiler (قابلیت کامپایل و ترجمه در لحظه): این واحد جهت افزایش سرعت اجرا و بهبود کارایی بکار می رود. JIT بخش هایی از bytecode که قابلیت و کارایی یکسان دارند را به طور همزمان ترجمه کرده و بدین وسیله زمان مورد نیاز برای کامپایل کلی کد را کاهش می دهد. لازم به ذکر است که در اینجا منظور واژه ی compiler، مترجمی است که مجموعه دستورات jvm را به کد یا دستورات قابل فهم برای پردازنده/cpu دستگاه میزبان تبدیل می کند.
سوالات متداول درباره ماشین مجازی جاوا
+ تفاوت بین JVM، JRE و JDK چیست؟
- JVM (Java Virtual Machine): همانطور که گفته شد، JVM هسته اصلی محیط اجرای جاوا است.
- JRE (Java Runtime Environment): محیط زمان اجرا جاوا شامل JVM و کتابخانههای کلاس استاندارد جاوا است که برای اجرای برنامههای جاوا مورد نیاز است.
- JDK (Java Development Kit): کیت توسعه جاوا شامل JRE و ابزارهای توسعه مانند کامپایلر، دیباگر و … است که برای توسعه برنامههای جاوا مورد استفاده قرار میگیرد.
+ چه زبانهایی بر روی JVM اجرا میشوند؟
- جاوا: زبان اصلی که برای JVM طراحی شده است.
- Kotlin: کاتلین زبانی مدرن و سازگار با جاوا که به طور گسترده در توسعه اندروید استفاده میشود.
- Scala: زبانی قدرتمند و کاربردی برای برنامهنویسی همروند و توزیع شده.
- Groovy: زبانی پویا و انعطافپذیر که برای توسعه سریع برنامهها مناسب است.
- و بسیاری از زبانهای دیگر…
+ ارتباط ماشین مجازی جاوا به اندروید
اندروید نیز از یک ماشین مجازی به نام Dalvik (در نسخههای قدیمیتر) و ART (در نسخههای
جدیدتر) استفاده میکند. این ماشینهای مجازی بهینه شده برای محیط موبایل هستند و کدهای نوشته شده به زبان Kotlin یا Java را اجرا میکنند.
چرا اندروید از ماشین مجازی استفاده میکند؟
- پرتابل بودن: مشابه جاوا، برنامههای اندرویدی نیز میتوانند روی دستگاههای مختلف اندرویدی با مشخصات سخت افزاری متفاوت اجرا شوند.
- امنیت: ماشین مجازی یک لایه حفاظتی ایجاد میکند و از اجرای مستقیم کدهای برنامه روی سیستم عامل جلوگیری میکند. این امر باعث افزایش امنیت برنامهها میشود.
- مدیریت حافظه: ماشین مجازی به طور خودکار حافظه را مدیریت میکند و از بروز مشکلات ناشی از مدیریت دستی حافظه جلوگیری میکند.
- جمعآوری زباله: ماشین مجازی به طور خودکار اشیاء بلا استفاده را از حافظه پاک میکند و از بروز نشتی حافظه جلوگیری میکند.
تفاوتهای JVM و ماشینهای مجازی اندروید
- بهینهسازی برای موبایل: ماشینهای مجازی اندروید برای محیط موبایل بهینه شدهاند و ویژگیهایی مانند مصرف باتری کمتر و عملکرد بهتر را ارائه میدهند.
- زبانهای پشتیبانی شده: هر دو از زبان جاوا پشتیبانی میکنند، اما اندروید همچنین از زبان Kotlin به عنوان زبان رسمی توسعه اندروید پشتیبانی میکند.
- مدل اجرایی: Dalvik و ART از یک مدل اجرایی متفاوت نسبت به JVM استفاده میکنند.
نتیجه گیری از ماشین مجازی جاوا:
با استفاده از ماشین مجازی، توسعهدهندگان میتوانند برنامههایی بنویسند که روی دستگاههای مختلف قابل اجرا باشند و از مزایای امنیت، مدیریت حافظه و… بهرهمند شوند.