# فناوری جاوا > برنامه‌نویسی جاوا > سوال: فرق بین jdk ، jre و jvm چیست

## trustmiracle

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

ممنون میشم یک توضیح واضح بنویسید.

----------


## cups_of_java

JVM ماشین مجازی جاوا هست. یک مفسر داخلش هست که می تونه بایت کد جاوا رو اجرا کنه براتون.
JRE محیط اجرایی جاوا هست که شامل JVM و یک سری برنامه های دیگه میشه.
JDK همون برنامه هایی هست که برای نوشتن برنامه های جاوا نیاز دارید. مثل کامپایلر

----------


## trustmiracle

پس یک یعنی وقتی یک برنامه رو نوشتیم و شروع کردیم به کامپایل و اجرا 
اول : اول jdk اون رو تبدیل به بایت کد می کنه
دوم : jre فایل های مورد نیاز (کتابخانه های جاوا) رو فراهم می کنه 
و در آخر jvm بوسیله مفسرش برنامه رو اجرا می کنه

فکر کنم تو فهم دومی اشتباه کردم.(این یکسری برنامه های دیگه چی هست)

----------


## cups_of_java

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

----------


## قله بلند

سلام
وقتی jdk نصب می شود، پوشه jre نیز به همراهش نصب می شود. در پوشه bin نیز به همراه، java و ,javac فایل های اجرایی با نام های appletviewer,extcheck,,jar,,jarsigner,,javadoc,,ja  vah,,javap,,javaw,,jdb,keytool نیز نصب می شوند. آیا وجود اینها برای کامپایل ضروری هستند یا برای مقاصد دیگری در این پوشه قرار می گیرند.

----------


## trustmiracle

این دو تا دیاگرام ضمیمه را ببینید:
http://www.eol.ucar.edu/software/jav...ocs/index.html
http://midatl.radford.edu/docs/java-...ocs/index.html



جفتش برای jdk 5 هست. ولی چرا این همه اختلاف دارند؟ مثلا تو دومی اصلا مفسر دیده نمی شه و توی اولی مفسر داخل jdk هست (یعنی اگر فقط jre رو سیستم مقصد نصب باشه برنامه اجرا نمیشه؟) 

jdk برای کامپایل کردن به jre هم نیاز داره یا jre فقط برای اجرا و jdk فقط برای کامپایل استفاده میشه؟

----------


## persianshadow

ببینید شما به عنوان برنامه نویس به JDK احتیاج دارید.که به صورت واضح کیت توسعه جاوا هست.

این کیت ابزار فوق العاده زیادی به همراه خودش داره.

از ابزار debug گرفته, تا مفسر جاوا و صدها ابزار دیگه.

خب شما وقتی برنامه رو نوشتی و تموم شد کاربر شما که تنها نیاز به JRE داره که نزدیک به 12 مگابایت 

اندازه داره و به شکل واضحی کوچکتر از JDK هست و تمام کلاس های مورد نیاز شما برای اجرای برنامه

رو به همراهش داره.پس وقتی کاربر JRE رو داشته باشه تمام برنامه های شما رو اجرا می کنه.

الان در ویندوز 7 به صورت پیش فرض JRE نصب شده و جای خوشحالی هست که دیگه کاربران نیاز 

به نصبش هم ندارن.

اما JVM بحثی جدای از این حرفاست و همونطور که همه می دونیم ماشین مجازی جاوا محسوب

می شه و اصولآ ما باهاش کاری نداریم البته APIی هم برای تنظیم کردن JVM وجود داره. در اصل

شما وقتی برنامه رو میدید به کاربر,کاربری که JRE نصب کرده . برنامه شما بوسیله یک JVM 

اجرا می شه و اگه چند برنامه جاوا روی همون سیستم باز بشن برای هر کدوم یک JVM جدید

ایجاد می شه یعنی محیط های اجرای اونها از هم جدا هستن و تداخلی به وجود نمیاد.

----------


## trustmiracle

خوب مشکل من الان این هست که ما مگه نمی گیم برای اجرای برنامه در کامپیوتر مقصد فقط به jre نیاز داریم (که البته jvm رو هم در داخل خودش داره) ولی برنامه اصلی که باید برنامه ما یا همون بایت کد ها رو اجرا کنه java هست دیگه
اما تو این دیاگرام که خود سایت sun گذاشته این فایل (برنامه java) در خارج از jre و داخل jdk هست

----------


## persianshadow

ببینید اینجوریه که شما شروع می کنید برنامه جاوا نوشتن که خب فایل های شما پسوند .java داره

شما این فایل ها رو با JDK کامپایل می کنید و فایلهای بایت کد تحویل می گیرید یعنی در اصل برنامه آماده

شما که قابل اجرا شدن در هر محیطی که جاوا [JRE] نصب باشه رو داره.خب پس JRE شما تنها نیاز به 

کلاس های پایه ای جاوا داره و همچنین JVM .در دیاگرامی هم که شما نشون دادید بخش زرد رنگ 

که جز JDK هست تنها ابزار توسعه محسوب میشن و برای برنامه نویس مورد استفاده قرار می گیره

نه کاربر نهایی.

----------


## trustmiracle

خوب منم همون بخش زدر رنگ منظورم هست.
وقتی می خوایم برنامه نوشته شده رو کامپایل کنیم از برنامه javac در بخش زرد رنگ استفاده می کنیم. و وقتی می خوایم اجرا کنیم از برنامه java استفاده می کنیم دیگه.
حالا من می گم از اونجایی که برای اجرا تنها jre لازم هستش نباید این java در بخش jre قرار می گرفت؟ یا این java در بخش زرد رنگ با اون برنامه جاوا که برای اجرای بایت کدهاست فرق داره؟

----------


## mazdadoost

> خوب منم همون بخش زدر رنگ منظورم هست.
> وقتی می خوایم برنامه نوشته شده رو کامپایل کنیم از برنامه javac در بخش زرد رنگ استفاده می کنیم. و وقتی می خوایم اجرا کنیم از برنامه java استفاده می کنیم دیگه.
> حالا من می گم از اونجایی که برای اجرا تنها jre لازم هستش نباید این java در بخش jre قرار می گرفت؟ یا این java در بخش زرد رنگ با اون برنامه جاوا که برای اجرای بایت کدهاست فرق داره؟


ببینید :

----------


## trustmiracle

چون برای خودم سوال بود این رو می گذارم اگر کسی خواست بخونه. اینطور که اینجا نوشته هر دو این فایل ها یکسان هستند.

http://stackoverflow.com/questions/1...531375#1531375

ممنون از همه دوستانی که جواب دادند.

----------


## cups_of_java

گیر شما به این عکس شاید درست باشه اما اینقدر حساس نشید. این عکس هم که از آسمون نزول نکرده. هدف این عکس جدا کردن اجزای مهم در معماری JDK و JRE بوده و کلیات رو نشون داده. 
بله هم JDK دستور java داره هم JRE دستور java داره و اینکه این دستور دریچه ای هست برای ارتباط با JVM و JRE 
به طور سنتی مرسوم بوده که در محیط اجرا یک پکیچ برای اجرا نصب میشده که اسمش JRE شده و در محیط توسعه یک پکیچ برای برنامه نویسان و ... که اسمش JDK بوده. اگه دقت کنید میبینید که JDK داخل خودش JRE داره! یک زمانی در نسخه 1.2 به بعد یه چیزی که آدمو ناراحت می کرد این بود که شما وقتی JDK نصب میکردی ازت میپرسید که می خوای JRE هم نصب شه (اگه نصب میشد امکان اجرای فایلهای جار و ... رو از طریق سیستم عامل و امکان دسترسی به Appletها رو در مرورگر فراهم میکرد!) ولی لزومی نداشت نصبش کنی. چون توی JDK شما JRE هم داری!

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

----------


## paydar200

ممنون دوستان منم استفاده کردم.

----------

