PDA

View Full Version : سوال: سوال در مورد نحوه عملکرد jit در هنگام اجرای برنامه در جاوا



tiklion
سه شنبه 09 اردیبهشت 1393, 08:13 صبح
با سلام
من می دونم که جاوا برای انکه بتونه کد هاش رو روی هر سخت افزاری اجرا کنه امده jvm راه انداخته که اول کد ها تبدیل به با کد میشه بعد داده میشه به jvm
و بعد شرکت جاوا امده برای هر سخت افزاری یک jvm مخصوص داده jvm میاد بای کد اجرا می کنه
حالا داخل jvm یک jit هست که هر بار که برنامه اجرا میشه بار اول اجرا میاد قسمت های از کد رو تبدیل به کد ماشین می کنه جدول بندی می کنه که تا در درخواست های بعدی برنامه از اون قسمت کد اون کد ماشین اجرا بشه و سریع باشه برنامه

سوالم اینه که این jit کدوم قسمت ها از کد بای کد رو برمیداره تبدیل به زبان ماشین میکنه بر چه اصولی این کارو می کنه؟؟


و اینکه گفته میشه C++‎ رو نمیشه روی هر نوع cpu اجرا کرد چون باید کامپایلر برای همه اونها ساخت که پر هزینه و زمان بر
خوب جاوا مگه برای هر cpu وسیستم عامل که نو ع خاص از jvm رو طراحی نکرده که بایت کد های جاوا رو به زبان ماشین تبدیل کنه؟ساخت jvm زمان بر و پر هزینه نیست ؟؟یعنی راحت تر از کامپایلر؟؟

cups_of_java
سه شنبه 09 اردیبهشت 1393, 11:03 صبح
بعد شرکت جاوا امده
جاوا شرکت نیست. به تکنولوژیه که توسط مجموعه ای از شرکت ها هدایت میشه. به طور خاص به اسم اوراکل هستش چون خریدتش




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




این jit کدوم قسمت ها از کد بای کد رو برمیداره تبدیل به زبان ماشین میکنه بر چه اصولی این کارو می کنه؟؟
کلاس های کامپایل شده در واقع بایت کد هایی هستن که ماشین مجازی جاوا اون ها رو می فهمه. اینا قابل اجرا به تنهایی روی سیستم عامل نیستن مگر اینکه خود ماشین مجازی بیاد و اونا رو خط به خط اجرا کنه. این کار رو به شکل مدرن و هوشمند و پیچیده ای انجام میده که بهش میگن جیت. اصول و تکنیکش بسیار فنی و پیچیدست... مثل بافر کردن و دیدن چند خط جلو تر از کد و یا اعمال بهینه سازی های مختلف در زمان اجرا... می تونی توی نت بگردی و Jit Compiler Specification for Java رو پیدا کنی و بخونی.




اینکه گفته میشه C++‎‎ رو نمیشه روی هر نوع cpu اجرا کرد چون باید کامپایلر برای همه اونها ساخت که پر هزینه و زمان بر
خوب جاوا مگه برای هر cpu وسیستم عامل که نو ع خاص از jvm رو طراحی نکرده که بایت کد های جاوا رو به زبان ماشین تبدیل کنه؟ساخت jvm زمان بر و پر هزینه نیست ؟؟یعنی راحت تر از کامپایلر؟؟
سی پلاس پلاس یه زبان کاملن کامپایلری بدون ماشین مجازی هستش. پس روی هر سیستم باید کامپایلرش رو ببری و کد رو دوباره کامپایل کنی.
جاوا ترکیبی از کامپایل و مفسری هستش که ماشین مجازی داره. بنابراین اگه یک بار کامپایل بشه منوط بر اینکه ماشین مجازی روی اون سیستم باشه،‌همون کد یک بار کامپایل شده می تونه قابل اجرا باشه.
توجه کن که ماشین مجازی نوشتنش هزینه داره اما یک بار هست برای همیشه!‌ و بعد استفاده میشه توسط توسعه دهنده نرم افزار (برنامه نویس)

موضوع اینه که زحمت توسعه و کد نویس کم میشه! و این مهمه!

storm_saeed
چهارشنبه 10 اردیبهشت 1393, 10:46 صبح
یه سوال
برای برنامه نویسی گرافیکی در سیستم عامل ها(مثلا از swing یا javafx بخوایم استفاده کنی ) اونجور که من خوندم jvm میاد برای اجرا کد هایی که تبدیل به بایت کد شده رو مثلا در لینوکسی که گنوم نصبه میاد به gtk تبدیل میکنه که بتونه در اون سیستم عامل اجرا بشه . موقعی که Gtk مثلا از نسخه 2 به 3 آپگرید شد یا اینکه از یه نسخه ای به نسخه ای دیگه آپگرید شد نیاز هست که دوباره قسمت هایی از JVM بازنویسی یا اضافه شه که بتونه اینارو اجرا کنه ؟

abtin021
چهارشنبه 10 اردیبهشت 1393, 11:10 صبح
در هر سیستم عاملی JVM وجود داره و کد های شما به نحوی به بایت کد تبدیل میشه به این قابلیت جاوا میگن portability

اطلاعات بیشتر در لینک های زیر

http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html


http://www.doc.ic.ac.uk/~nd/surprise_97/journal/vol2/msa1/portability.htm


http://stackoverflow.com/questions/13068510/what-is-the-meaning-of-java-is-portable

cups_of_java
چهارشنبه 10 اردیبهشت 1393, 14:42 عصر
یه سوال
برای برنامه نویسی گرافیکی در سیستم عامل ها(مثلا از swing یا javafx بخوایم استفاده کنی ) اونجور که من خوندم jvm میاد برای اجرا کد هایی که تبدیل به بایت کد شده رو مثلا در لینوکسی که گنوم نصبه میاد به gtk تبدیل میکنه که بتونه در اون سیستم عامل اجرا بشه . موقعی که Gtk مثلا از نسخه 2 به 3 آپگرید شد یا اینکه از یه نسخه ای به نسخه ای دیگه آپگرید شد نیاز هست که دوباره قسمت هایی از JVM بازنویسی یا اضافه شه که بتونه اینارو اجرا کنه ؟

بعید می دونم... اون ها لایه های بالایی دسکتاپ هستن که عوض میشن... نه لایه های پایه ای گرافیک در لینکس (مثل Xorg)
اصن شما وقتی همینطوری یه برنامه جاوای Swing می نویسی چه روی GNOME چه روی KDE اجرا میشه... فرقی نمیکنه.
شما خود Gnome و یا KDE رو مثل Swing ببین... این ها کتابخونه های گرافیکی مختلف هستن... اما اگه توی ماشین مجازی جاوایی که برای لینوکس نوشتن از کتابخانه های این دو تا استفاده شده باشه... طبیعتن باید به روز شه توسط نویسنده ماشین مجازی که اصولن شمای برنامه نویس اصن چیزی متوجه نمیشی...