تالار گفتمان مانشت
زبان جاوا ( Java ) ؟ - نسخه‌ی قابل چاپ

زبان جاوا ( Java ) ؟ - younes - 23 دى ۱۳۹۱ ۰۲:۳۴ ب.ظ

سلام دوستان ،
سوالم اینه که زبان java کمپایلری هست یا مفسری ؟؟؟ و دیگه اینکه انقیاد در جاوا از نوع early هست یا Late ؟؟؟
پیشاپیش تشکر از جوابهاتون Heart

زبان جاوا ( Java ) ؟ - blackhalo1989 - 23 دى ۱۳۹۱ ۰۲:۴۴ ب.ظ

نمیدونم این دقیقا جواب شما هست یا نه، ولی امیدوارم به دردتون بخوره:
کدهای نوشته شده به زبان جاوا با توسط javac.exe (در ویندوز) تبدیل میشه به بایت کد جاوا. بایت کد شبیه کد زبان ماشینه، به عبارت دیگه کد زبان ماشین برای ماشین مجازی جاواست. ماشین مجازی جاوا، یه ماشین پشته ایه که دقیقا مثل ماشین های واقعی دارای instruction set هست. بایت کد، ساختاری مشابه ساختار کد زبان ماشین برای یک ماشین پشته ای رو داره.
در مرحله بعدی برای اجرا، بایت کد جاوا داده میشه به ماشین مجازی جاوا (همون java.exe در ویندوز). ماشین مجازی اون رو تبدیل به کد زبان ماشین میکنه و اون رو اجرا میکنه(چون تنها چیزی که روی کامپیوتر میتونه اجرا بشه کد زبان ماشینه). تا جایی که من میدونم قبلا به صورت مفسری این کار رو میکرد ولی الان ترکیبی از مفسری و کامپایلری هست به این معنی که کدهایی که قراره زیاد استفاده بشن(مثل حلقه ها) رو به زبان ماشین ترجمه میکنه(برای سرعت اجرای بیشتر).

زبان جاوا ( Java ) ؟ - Lonely Palm - 23 دى ۱۳۹۱ ۰۳:۴۹ ب.ظ

جاوا از مکانیزم Late Binding استفاده می کنه
اگه نمی گفتین early یا late واقعا نمی دونستم معنی کلمه انقیاد چیه Smile

زبان جاوا ( Java ) ؟ - younes - 23 دى ۱۳۹۱ ۰۴:۰۵ ب.ظ

ممنونم دوستان عزیز blackhalo1989 و a.nikfarjam از اینکه جواب دادین . دلیل این که من این سوال رو مطرح کردم این بود که : توکتاب مقسمی دقیقا این جمله نوشته شده : جاوا یک زبان شبیه ++C ولی تفسیری است ، اماتو تستها ، تست سال ۸۶ میگه که زبانها رو ازنظر کمپایلری بودن یا مفسری بودن دسته بندی کنید و تو جواب جاوا شد از نوع کمپایلری . و تست سال ۸۵ هم میگه جاوا از نوع early binding است ، و همونطور که میدونید زبانهایی early binding هستند که کمپایلری باشن ، یعنی باز هم جاوا شد کمپایلری و این جمله آقای مقسمی منو یه ذره گیج کرد که بالاخره این جاوا کمپایلری هست یا مفسری . به هرحال با این تفاسیر ما از همین تریبون جاوا رو کمپایلری اعلام مینماییم Big Grin
اگه کسی از دوستان نظری داشتن بگن تا بقیه هم فیض حاصل کنیم.
با تشکر از شما دوستان عزیز و از همه دوستان Heart

(۲۳ دى ۱۳۹۱ ۰۳:۴۹ ب.ظ)a.nikfarjam نوشته شده توسط:  جاوا از مکانیزم Late Binding استفاده می کنه
اگه نمی گفتین early یا late واقعا نمی دونستم معنی کلمه انقیاد چیه Smile

ممنونم دوست من . اما دقیقا تست سال ۸۵ عکس جمله شماست . " یعنی جاوا از مکانیزم Early Binding استفاده میکنه " .
تست اینه :

کدام یک از زبانهای زیر جزو زبانهای Early Binding محسوب می شوند ؟ ( مهندسی کامپیوتر - دولتی ۸۵ )

۱) Lisp
۲) Java
۳) Smalltalk
۴) هیچکدام

طبق کتاب آقای مقسمی گزینه درست ۲ هست .

RE: زبان جاوا ( Java ) ؟ - Lonely Palm - 23 دى ۱۳۹۱ ۰۵:۰۴ ب.ظ

خوب دقیقا همونطوری که دوستمون blackhalo فرمودن، قبلا تمام بایت کدها توسط ماشین مجازی باید تفسیر میشد، ولی این دلیل نمیشه که بگیم قبلا هم زبان جاوا مفسری بوده کلا. بهرحال کدهای ما توسط javac به بایت کد کامپایل میشدن، پس همون موقع هم مرحله اول که تبدیل سورس کد به بایت کد بوده و توسط javac انجام می شده، کامپایلری بوده و بعد مرحله بارگذاری کلاس ها توی ماشین مجازی و اجرای برنامه توسط JRE، تفسیری.
بعد از اینکه دیدن این کار باعث کندی اجرای برنامه های جاوا شده، اومدن رو یه پروژه به اسم HotSpot کار کردن که یک ماشین مجازی جدید برای جاوا بود که از تکنیک کامپایل (JIT ( Just In Time برای بایت کدها بهره می بره. جالبه که بدونید از نسخه ی ۱/۳ جاوا ماشین مجازی پیش فرض جاوا شد همین HotSpot و کاملا به زبان ++C نوشته شده
نسخه ی JRE عرضه توسط شرکت Oracle دو ورژن متفاوت داره، نسخه ی کلاینت و نسخه ی سرور. نسخه ی کلاینت به کلی از شیوه ی تفسیر بایت کدها استفاده می کنه یعنی همون روش قدیمی. ولی نسخه ی سرور از تکنیک های JIT برای کامپایل بایت کدها استفاده می کنه. البته نه همه ی بابت کدها، بلکه از شمارنده استفاده می کنه که ببینه یه کد خاص چند بار مورد استفاده قرار می گیره، اگر از مقدار سطح آستانه ای که پیش فرض در نظر می گیره بالاتر بود اون رو کامپایل می کنه ( در تایید و تکمیل فرمایشات جناب blackhalo )
اما در مورد Binding توی جاوا
مجبوریم با مثال پیش بریم
کد:
class A
{
public void foo()
{
System.out.println("I am print method in Class A");
}
}
class B extends A
{
public void foo()
{
System.out.println("I am print method in Class B");
}
}
public class C
{
public static void main(String [] args)
{
A a=new A();
B b=new B();
a.foo();
b.foo();
A ref=null;
ref=b;
ref.foo();
یه کد خیلی ساده. خوب مسلما تو فراخوانی اولین و دومین متد، جاوا به نظر می رسه که داره از early binding استفاده می کنه
اما این تصمیم مسلما برمی گرده به اینکه، توی سلسله مراتب ارث بری جاوا چه رفتاری از خودش نشون میده، اونجا می تونیم تصمیم بگیریم
و می بینیم تو اجرای کد ()ref.foo جاوا پیغام کلاس فرزند رو چاپ می کنه نه کلاس والد رو. این مثال نقض، نشون میده یا آقای مقسمی اشتباه کردن تو پاسخشون یا طراح سوال کنکور!

زبان جاوا ( Java ) ؟ - blackhalo1989 - 23 دى ۱۳۹۱ ۰۵:۲۰ ب.ظ

الان تو کلاینت هم از HotSpot استفاده میشه. کافیه java -version بگیرید.

در تایید مثال آقای نیک فرجام، چیزی که گفتن رو بهش میگن run-time polymorphism. البته من دقیقا یادم نیست انقیاد چیه!

RE: زبان جاوا ( Java ) ؟ - equilibrium - 23 دى ۱۳۹۱ ۰۶:۱۲ ب.ظ

(۲۳ دى ۱۳۹۱ ۰۲:۳۴ ب.ظ)younes نوشته شده توسط:  سلام دوستان ،
سوالم اینه که زبان java کمپایلری هست یا مفسری ؟؟؟ و دیگه اینکه انقیاد در جاوا از نوع early هست یا Late ؟؟؟
پیشاپیش تشکر از جوابهاتون Heart

در زبانی که اغلب کنترل نوع ها به زمان اجرا موکول میشه، انقیادها دیررسن؛ و چیزی که این انقیادها رو در لحظه اجرا انجام میده مفسر اون زبان هست؛
زبان جاوا مثل c++ بیشتر کنترل نوع ها رو در کامپایل انجام میده و در لحظه اجرا type هر متغیر معلوم و غیر قابل تغییره (یعنی انقیاد به نوعش در کامپایل انجام شده)؛ منتها خروجی کامپایل یه برنامه جاوا همونطور که دوستان اشاره کردن کد قابل اجرای ماشین نیست، اما تا اجرا شدن فقط یک قدم فاصله داره که این قدمو VM انجام میده. بهمین علت جاوا رو کامپایلری در نظر میگیرن تا مفسری؛

زبان جاوا ( Java ) ؟ - younes - 24 دى ۱۳۹۱ ۰۱:۳۰ ق.ظ

از همه دوستان بابت پاسخ متشکرم . متوجه شدم . واقعا ممنونم.