اون کامند ویندوزی، ترجمش میشه این. خیلی هم اگر نگاه کنی فرقی نداره. ممکنه من توی تایپ اشتباه نوشته باشم.
جسارت نباشهها، آدرس فایلها رو درست وارد میکنی؟
آره حدودا چهار ساعتی توی ترمینال باهاش ور رفتم ، شما می دونید دقیقا چه کاری انجام می ده اون کد؟میشه بیشتر توضیح بدین ؟ (آخه توش سمیکالنه ولی شما نقله قول گذاشتین نمی دونم اینا واسه چی تغییر کردن !!)
بله، این کد ویندوزی برای اجرا کردن یک برنامهٔ جاواست.
برنامههای جاوا وقتی که ترجمه میشن، یک زبون میانی رو میسازن، این در حالیه که زبونهایی مثل سی و سیپلاسپلاس، کد محلی (نیتیو، کد قابل فهم برای مجموعهٔ سیستمعامل و ماشین) رو میسازن. برای همین وقتی یک برنامهٔ سی رو کامپایل میکنید برای گنو/لینوکس، روی لینوکس (کرنل) اجرا میشه ولی همون کد روی همون معماری ماشین با سیستمعامل دیگه اجرا نمیشه. یا مثلن کدی که برای معماری arm کامپایل میشه، روی x86 با همون سیستمعامل اجرا نمیشه.
اینا رو گفتم که بگم زبون میانی جاوا چیه. کامپایلر جاوا میاد و بایتکد رو تولید میکنه، این بایتکد برای اجرا نیاز به یک ماشین مجازی داره تا اجرا بشه. این ماشین مجازی خودش از کد نیتیو ماشین (مثلن x86 روی گنو/لینوکس) ساخته شده و وظیفش اجرای اون کد میانی روی روی ماشین واقعیه.
دستوری java این ماشین مجازی رو فراخونی میکنه.
از یک منظر دیگه، وقتی برنامهای با جاوا کامپایل میشه، فایلهایی با پسوند class رو تولید میکنه که تعدادشون زیاده و البته آدرس پوشهای که توش قرار داره هم خیلی مهمه که در حقیقت میشه آدرس بسته (package) اون کلاس. برای همین معمولن بعد از کامپایل، این class ها رو بستهبندی و گاهی فشرده میکنن که نتیجش مثلن میشه jar که اگر با دستوری مثل:
jar xvf file.jar
اون فایل رو باز کنی، متوجه تمام این توضیحات میشی.
در نهایت هر برنامه ممکنه از کتابخونههایی برای طراحی استفاده کرده باشه که وقت اجرا به اون کتابخونهها نیاز داره. برای همین مفهومی بنام classpath وجود داره که به ماشین مجازی میگه که کتابخونههای مورد نیاز برنامه از کجا بارگذاری بشه.
و در نهایت آدرس متد اصلی برنامه (معروفه به public static void main) باید به ماشین مجازی فرستاده بشه. ممکنه این کار به صورت دستی صورت بگیره، یا با یک سری تعریف، توی jar فایل موجود باشه.
بعد از اون دیگه هرچی جلوی دستور اجرا نوشته بشه، مربوط به برنامه نویسی اون کد خاص میشه. مثلن آدرس اجرای اون فایل jad که توی این مثال بکار برده شد.
اما سوالی که پرسیدین، چرا توی ویندوز «;» گذاشته میشه، توی گنو/لینوکس «:»
خب در مورد classpath گفتم. ممکنه نیاز باشه از چند آدرس مختلف کلاسها بارگذاری بشه، که اینطور مواقع باید با یک مکانیسمی به ماشین مجازی این اطلاع داده بشه. تا اونجا که یادمه ویندوز آدرسهای مختلف رو با «;» از هم جدا میکنه و اگر توی یه برنامه توی دیالوگ باز کردن فایل، چندین فایل انتخاب بشه، میبینید که با «;» از هم جدا کرده (این قسمتش به جاوا ربطی نداره). توی گنو/لینوکس از «:» استفاده میشه. پس هرجا اینها بکار برده شده، نشون دهندهٔ بکار رفتن چند آدرسه.
در نهایت اگر میخوای دقیقتر متوجه بشی، این رو ببین:
https://en.wikipedia.org/wiki/Classpath_(Java)