View Full Version : یک سوال در مورد بایت کد جاوا و علت تفسیر شدن آن
unix_svr4
سه شنبه 07 خرداد 1387, 20:44 عصر
سلام
قبلا با زبان جاوا برنامه نویسی می کردم. ولی به دلایلی مجبور شدم آنرا رها کنم و به سراغ خانواده net. برم.
از اطلاعاتی که در مورد net. و همچنین زبان #C بدست آوردم، فهمیدم که هنگامی که یک برنامه نوشته شده به زبان #C ( و هر زبانی که از استاندارد CLS پیروی کنه و بتونه کد IL تولید کنه) به جای تفسیر شدن (یعنی ترجمه و اجرای خط به خط فایل اسمبلی ( که در جاوا معادل بایت کد است)) کد برنامه به زبان بومی CPU که CLR تحت اون اجرا شده ترجمه میشه و سپس برنامه اجرا میشه.
می خواستم بدانم چرا در زبانی مانند جاوا که حالا هم اوپن سورس شده این امکان پیاده سازی نشده؟؟؟ مثلا ماشین مجازی را فراموش کنند و بجای آن چیزی مانند CLR دات نت را که از ماشین مجازی هم سریع تر هستش جایگزین کنند.
مزایای ترجمه خط به خط بایت کد به غیر از کندی برنامه چی میتونه باشه؟؟؟
از دوستانی که چیزی در این مورد می دونند خواهش می کنم من رو راهنمایی کنند.
موفق باشید.
mazdadoost
چهارشنبه 08 خرداد 1387, 00:19 صبح
دوست عزیز :
پیشنهاد می کنم بیشتر با CLR و JVM اشنا بشید بعدبفرماید در java چنین چیزی نیست.یا اگر منبعی برای این مطالب که فرمودین دادید بفرمایید من هم نگاه کنم.
بطور خلاصه:
1-هم jvm و هم clr کارشون ترجمه کد های intermediate language (IL) به کد Native هست.IL در جاوا همون بایت کد ها هستن.
2-فرق این دو پلت فرم در نوع امکاناتی هست که این دو IL برای محیط اجرا و برنامه نویسی در این پلت فرم ها فراهم میکنن.
این جاواب مختصری بود.چنانچه بعد از مطالعه باز هم سوالی داشتین خوشحال میشم کمک کنم.
saeed_Z_F
چهارشنبه 08 خرداد 1387, 13:09 عصر
سلام
تمام امکاناتی که گقتید در جاوا وجود داره Hot spot با قابلیت کامپایل just in time دقیقا همین کارو میکنه .
نکته دیگه اینکه در نسخه جدید (JDK update N) که قراره اواخر 2008 بیرون بیاد یه سری امکانات اضافه شده که سرعت اجرای برنامه های جاوا چند برابر حال حاضر میکنه .
unix_svr4
چهارشنبه 08 خرداد 1387, 13:48 عصر
دوست عزیز mazdadoost
این اولین باری است که می شنوم بایت کد های جاوا به کد Native تبدیل میشه!
شما اگر دستور java خالی رو در خط فرمان بنویسید و اجرا کنید می بینید که Java Interperter یعنی مفسر جاوا، یعنی اینکه بایت کدهای جاوا خط به خط توسط این مفسر برای CPU ترجمه میشن و CPU هم اونها رو اجرا می کنه. ولی در net. اینطور نیست، شما سورستان را بایک کامپایلر #C و یا هر کامپایلری که قابلیت تولید کد IL رو داره یکبار کامپایل می کنید. سپس وقتی که می خواهید برنامه تان را اجرا کنید، CLR یا همون ماجول زمان اجرا میاد فایلی که قبلا به IL تبدیل شده رو به کد Native تبدیل می کنه و سپس این کد Native رو اجرا می کنه. که بالطبع نسبت به ترجمه و اجرای خط به خط برنامه سرعت بیشتری خواهد داشت.
در مورد منبع هم باید بگم دوست عزیز بنده یعنی آقای غلامرضا صابری یک مقاله ترجمه کرده بودند در مورد net. و عملکرد آن، که من این مطالب رو از اون مقاله بدست آوردم.
ایشون اگر اجازه بدهند یک نسخه هم به این تاپیک ضمیمه خواهم کرد.
متشکرم.
mazdadoost
چهارشنبه 08 خرداد 1387, 14:23 عصر
دوست عزیز mazdadoost
این اولین باری است که می شنوم بایت کد های جاوا به کد Native تبدیل میشه!
شما اگر دستور java خالی رو در خط فرمان بنویسید و اجرا کنید می بینید که Java Interperter یعنی مفسر جاوا، یعنی اینکه بایت کدهای جاوا خط به خط توسط این مفسر برای CPU ترجمه میشن و CPU هم اونها رو اجرا می کنه. ولی در net. اینطور نیست، شما سورستان را بایک کامپایلر #C و یا هر کامپایلری که قابلیت تولید کد IL رو داره یکبار کامپایل می کنید. سپس وقتی که می خواهید برنامه تان را اجرا کنید، CLR یا همون ماجول زمان اجرا میاد فایلی که قبلا به IL تبدیل شده رو به کد Native تبدیل می کنه و سپس این کد Native رو اجرا می کنه. که بالطبع نسبت به ترجمه و اجرای خط به خط برنامه سرعت بیشتری خواهد داشت.
در مورد منبع هم باید بگم دوست عزیز بنده یعنی آقای غلامرضا صابری یک مقاله ترجمه کرده بودند در مورد net. و عملکرد آن، که من این مطالب رو از اون مقاله بدست آوردم.
ایشون اگر اجازه بدهند یک نسخه هم به این تاپیک ضمیمه خواهم کرد.
متشکرم.
دوست عزیز :
قبل از هر چیز مایلم درک شما درباره این مفاهیم رو بدونم :
1-اینتر پرتر - اینترپر تر جاوا.
2-کامپایلر -کامپایلر جاوا.
3-Native Code-CPU Code.
4-IL-JVM -JRE
5-دستور جاوای خالی.
6-JIT در جاوا و HotSpot-JIT در دات نت.
7-CLR.
8-Ngen Ultility در دات نت.
و پیشنهاد میکنم نگاهی به این منابع بندازید :
1-http://www.microsoft.com/india/msdn/chat/transcripts/14.aspx
2-http://www.itwriting.com/dotnet1.php
3-http://ugweb.cs.ualberta.ca/resources/java/faq/compile.html
4-http://207.22.26.166/bytecols/2000-12-13.html
خواهید دید که این فرق های jvm و clr چی هست و مزایا و معایب این تفاوت ها چیه!و فلسفه وجود این تفاوت ها چیه.بنده ان لینک ها رو دادم تا عرض خودم رو مستند کرده باشم.
البته اینکه اولین بار چنین چیزی میشنوید باعث میشه چنین مسئله ای نباشه؟و همونطور که عرض کردم منابعی که ذکر کردم احتمالا مسئلا رو به شکل کاملا ابتدایی روشن خواهد کرد.و البته باز هم توصیه میکنم قبل از اینکه باز هم در این زمینه اظهار نظری بفرمایید کمی دقت بفر ماید.
fkohantorabi
چهارشنبه 08 خرداد 1387, 19:09 عصر
دوست عزیز mazdadoost
این اولین باری است که می شنوم بایت کد های جاوا به کد Native تبدیل میشه!
متشکرم.
نه میشه و به غیر از اون هم خیلی optimization های دیگه قبل اینکه بایت کد اجرا بشه انجام میشه. حتی جالبه بدونی که دستور جاوا بایت کد رو تقریبا بر می گردونه به سورس کد (احتمالا برای تشخیص hotspot ها) و بعدا تبدیل می کنه به کد اجرایی. در ضمن تا انجایی که من میدونم جاوا اولین زبان برنامه نویسی که از خاصیات multicore استفاده میکنه و در شرایت خاص می تواند از کد c (و احتمالا .net) هم سری تر اجرا بشه.
فرزاد-
rezaTavak
پنج شنبه 09 خرداد 1387, 07:31 صبح
Jast In Time=JIT یک فلسفه مدیریتی است که می گوید هر چیزی در جایی که کاربرد دارد به اندازه وجود داشته باشد این باعث شد که انبارهای شرکتها به اندازه پر شوند نه زیادتر!
این فلسفه توسط یک ژاپنی در شرکت تویوتا اجرا شد:
http://en.wikipedia.org/wiki/Just_In_Time_(business)
چون ژاپن زمین گران است و ...
همین در برنامه نویسی اجرا شد یعنی موقع اجرا یک ترجمه محلی داشته باشیم:
http://en.wikipedia.org/wiki/Just-in-time_compilation
mazdadoost
پنج شنبه 09 خرداد 1387, 16:28 عصر
دوست عزیز :
دو لینک مفید دیگر :
1-http://www.research.ibm.com/journal/sj/391/suganuma.html
2-http://disordered.org/Java-JIT.html
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.