چهارشنبه , مهر ۴ ۱۳۹۷
خانه / تحقیقات و مقالات / معماری جاوا

معماری جاوا

معماری جاوا

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

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

۲٫ماشین مجازی جاوا

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

۳٫چرا جاوا مستقل از پلتفرم است؟(platform independent)

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

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

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

۴٫محیط زمان اجرا جاوا و جزئیات معماری جاوا

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

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

محیط زمان اجرای جاوا اعمال ذیل را به ترتیب انجام میدهد :

۱٫بارگذاری کلاس که توسط بارگذار کلاس(class loader) لنجام میشود.

۲٫اعتبار سنجی بایت کدها که توسط اعتبارسنج بایت کد (bytecode verifier) انجام میشود.

۳٫تفسیر بایت کدها که توسط ماشین مجازی صورت میگیرد.

شکل زیر نمونه ای از جزئیات معماری جاوا میباشد.

۴٫۱) بارگذار کلاس (class loader)

بارگذار کلاس تمام کلاس هایی که برای اجرای برنامه نیاز است را بارگذاری می کند. بارگذار کلاس برنامه را ایمن می سازد این گونه که فضانام هایی (namespace) که از طریق شبکه قابل دسترس هستند را از فضانام هایی که به صورت محلی موجود هستند جدا میسازد. زمانی که بایت کدها با موفقیت بارگزاری شدند نوبت به اعتبار سنجی آنها توسط اعتبارسنج بایت کد می باشد.

۴٫۲) اعتبارسنج بایت کد (byte code verifier)

اعتبارسنج بایت کد بررسی میکند که آیا بایت کدها از نظر امنیتی ایرادی دارند یا خیر. اعتبار سنج مسائل ذیل را بررسی میکند :

کد از مشخصات ماشین مجازی پیروی کند.

هیچ گونه دستیابی غیر مجاز به حافظه اصلی وجود نداشته باشد.

کد باعث stack overflow نشود.

تبدیل نوع غیرمجاز وجود نداشته باشد.

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

۴٫۳) Just In Time Compiler (JIT)

این کامپننت به اجرای هرچه سریع تر برنامه کمک میکند. اما چگونه !؟

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

زمانی که JIT یک بایت کد را تفسیر و تبدیل به کد ماشین مقصد میکند این کدها را در حافظه پنهان (Cache) ذخیره میکند و بعدا در صورت نیاز آنها را مجددا استفاده میکند بدون این که بخواهد بایت کد را مجددا تفسیر نماید. عملکرد JIT زمانی به خوبی قابل مشاهده است که یک برنامه بارها و بارها اجرا شود و هر بار با استفاده از حافظه پنهان کدها اجرا شوند.

۵٫ چرا جاوا امن است ؟

همان طور که قبلا اشاره شد بایت کدها قبل از اجرا توسط محیط زمان اجرا به دقت بازرسی میشوند که در اصل بیشتر توسط بارگذار کلاس و اعتبارسنج بایت کد بررسی میشوندو این یعنی سطح بالایی از امن بودن.

۶٫ زباله روبی Garbage Collection

زباله روبی فرآیندی است به این هدف که جاوا بتواند مدیریت حافظه بهتری داشته باشد. همانطور که می دانید در برنامه نویسی شی گرا ، اشیا با ارسال پیام به یکدیگر با هم در ارتباط اند. هر زمان که شی ای ایجاد میشود تا زمانی که ارجاعی به آن شئ وجود دارد مقداری حافظه برای آن در نظر گرفته میشود.زمانی که هیچ ارجاعی به این شئ وجود نداشته باشد جاوا متوجه میشود و فرآیند زباله روبی را انجام میدهد که نتیجه آن پاک شدن حافظه اشغال شده توسط شئ و برکرداندن آن حافظه به سیستم می باشد.

زباله روبی در جاوا فرآیندی خودکار است و هیج راهی برای اجرای آن به صورت دستی وجود ندارد و متد هایی مانند “System.gc()” و “Runtime.gc()” فقط درخواست انجام فرآیند را میدهند و هیچ تضمینی برای اجرای فرآیند ندارند.

درباره‌ رضا رمضانی

رضا رمضانی

جوابی بنویسید

ایمیل شما نشر نخواهد شدخانه های ضروری نشانه گذاری شده است. *

*