آشنایی با Bytecode در زبان برنامه‌نویسی جاوا


در این آموزش دو هدف کلی را مد نظر قرار می‌دهیم بدین ترتیب که در ابتدا نحوۀ اجرای یک برنامۀ سادۀ جاوا از طریق کامندلاین را بررسی می‌کنیم و در ادامه با مفهوم Bytecode آشنا می‌شویم که در آموزش گذشته و در مبحث مرتبط با ماشین مجازی جاوا نیز بدان اشاره کردیم. در واقع، در این آموزش قصد داریم ببینیم که پشت پرده چه اتفاقاتی برای سورس‌کد برنامه‌های نوشته‌شده به زبان جاوا می‌افتد و ظاهر فایلی حاوی یکسری بایت‌کد به چه شکل است که برای شروع کار داخل یکی از درایوهای سیستم خود فولدری تحت عنوان My Program ایجاد می‌کنیم.

در ادامه کدی مانند زیر را در یک ادیتور متنی همچون Notepad نوشته و آن را با پسوند java. ذخیره می‌کنیم:

public class HelloWorld {
}

همان‌طور که می‌بینیم، ابتدا کلیدواژۀ public را نوشته سپس کلیدواژۀ class را آورده‌ایم و بدین ترتیب قصد داریم تا کلاسی تحت عنوان HelloWorld در زبان برنامه‌نویسی جاوا تعریف کنیم (توجه داشته باشیم که هر دوی این کلیدواژه‌ها با حروف کوچک نوشته شده‌اند.)

هشدار
ادیتور Notepad مانند آی‌دی‌ای Eclipse قادر بر شناسایی خطاهای برنامه‌نویسی نمی‌باشد و از همین روی می‌باید تمام دقت خود را به‌ کار بگیریم تا مشکلی در سورس‌کد نداشته باشیم چرا که در این صورت اجرای برنامه در مراحل بعدی با مشکل مواجه می‌شود.

همان‌طور که اشاره کردیم، نام HelloWorld را برای کلاس خود انتخاب کرده‌ایم که به منظور خوانایی بیشتر آن را به صورت PascalCase نوشته‌ایم (در این روش حرف اول کلمات به صورت حروف بزرگ لاتین نوشته می‌شوند.) در ادامه کدهای مرتبط با کلاس HelloWorld را داخل علائم { } قرار می‌دهیم بدین صورت که پس از نام کلاس یک علامت } قرار داده و در ادامه یک علامت { دیگر قرار می‌دهیم. به علاوه، توجه داشته باشیم که نقطۀ شروع تمامی برنامه‌های نوشته‌شده به زبان جاوا متدی تحت عنوان ()main است که می‌باید داخل کلاس اصلی قرار گیرد و از همین روی متد مذکور را به صورت زیر در برنامۀ خود تعریف می‌کنیم:

public class HelloWorld {
    public static void main(String[] args) {
    }    
}

همان‌طور که در کد فوق می‌بینید، متد ()main را نیز به همراه علائم { } تعریف کرده‌ایم. حال در ادامه قصد داریم تا دستوری برای برنامۀ خود تعریف کنیم تا با اجرای آن استرینگ «In the Name of God» در خروجی نمایش داده شود که برای این منظور، از دستور ;()System.out.println استفاده می‌کنیم و بدین ترتیب کدی مانند زیر خواهیم داشت:

public class HelloWorld {
        public static void main(String[] args){
        System.out.println("In the Name of God");
    }    
}

در این مرحله برنامۀ ما تکمیل شده است و در ادامه آن را ذخیره می‌کنیم و توجه داشته باشیم که فایل مربوط به برنامۀ جاوای خود را حتماً با پسوند java. و همچنین نامی یکسان با نام کلاس مربوطه ذخیره سازیم. حال برای آن که بتوانیم برنامۀ خود را اجرا کنیم، نیاز است تا وارد محیط کامندلاین شویم که ساده‌ترین روش دسترسی به آن در سیستم‌عامل‌های مختلف را در ادامه بیان می‌کنیم:

- در ویندوز، می‌توان با فشردن هم‌زمان کلیدهای Windows + R سپس تایپ عبارت cmd و در ادامه فشردن دکمۀ OK به محیط کامند پرامپت دسترسی پیدا کرد.
- در مک‌اواس نیز با دنبال کردن مسیر Applications→Utilities→Terminal و باز کردن پنجرهٔ ترمینال به این محیط دست می‌یابیم. 
- در لینوکس از طریق پنجرهٔ ترمینال به این محیط دسترسی داریم.

برای مثال، تصویر زیر محیط کامندلاین را در سیستم‌عامل ویندوز نشان می‌دهد:

در این مرحله ابتدا لازم است تا اطمینان حاصل کنیم که JDK روی سیستم ما نصب است که برای این منظور دستور زیررا در کامندلاین وارد می‌کنیم:

$ java -version

با اجرای دستور فوق، نسخۀ جاوای نصب‌شده روی سیستم نمایش داده می‌شود و در صورتی که جاوا روی سیستم نصب نبود، طبق آموزش‌های گذشته می‌‌توان JDK را روی سیستم خود نصب کرد. حال در ادامه به منظور اجرای برنامۀ HelloWorld.java نیاز است تا به درایوی برویم که فولدر My Program در آن قرار دارد (در این مثال، فولدر My Program در درایو D روی سیستم ایجاد شده است و از همین روی دستور :D را به صورت زیر و به منظور وارد شدن به درایو مربوطه در کامندلاین وارد می‌کنیم و سپس دکمۀ Enter را می‌زنیم):

$ D:

بنابراین بسته به درایوی که فولدر My Program را در آن ایجاد کرده‌اید، می‌توانید نام درایو مد نظر را نوشته و در ادامه یک علامت : قرار داده و اینتر کنید تا بدین ترتیب وارد درایو مربوطه شوید.

پس از اجرای دستور فوق، می‌بینیم که وارد درایو D شدیم. حال نیاز است تا وارد فولدر My Program شویم که برای این منظور دستور cd My Program را نوشته سپس اینتر می‌کنیم و پس از اجرای این دستور می‌بینیم که آدرس نوشته‌شده در خط فرمان به آدرس مربوط به فولدر My Program تغییر پیدا می‌کند. در ادامه برای آن که بتوانیم محتویات این فولدر را ببینیم، دستور dir را در کامندلاین وارد می‌کنیم:

$ dir

در نتیجۀ اجرای دستور فوق، می‌بینیم که در این فولدر صرفاً یک فایل به همان نامی وجود دارد که پیش از این ذخیره کرده‌ایم. در این مرحله می‌باید برنامۀ جاوا را ابتدا کامپایل کنیم. به عبارت دیگر، آن را به بایت‌کد یا همان زبان قابل‌فهم برای ماشین مجازی جاوا تبدیل کنیم که برای این منظور دستور زیر را در کامندلاین اجرا می‌کنیم:

$ javac HelloWorld.java

javac در واقع مخفف عبارت Java Compiler است.  در این مرحله اگر مشکل خاصی پیش نیاید، پس از گذشت زمان خیلی کمی برنامۀ جاوای مذکور را کامپایل می‌شود (برای آن که مطئمن شویم که این برنامه کامپایل شده است به فولدر مربوط به پروژه مراجعه می‌کنیم.)

در واقع، پس از کامپایل شدن پروژۀ مد نظر، در این فولدر می‌باید علاوه بر فایلی تحت عنوان HelloWorld.java یک فایل جدید تحت عنوان HelloWorld.class نیز ایجاد شده باشد که این فایل حاوی یکسری بایت‌کد می‌باشد و برای آن که محتوای داخل فایل HelloWorld.class را ببینیم، می‌توانیم این فایل را توسط برنامۀ نوت‌پد باز کنیم که در نهایت محتوایی مشابه تصویر زیر را داخل آن خواهیم دید:

در واقع، برنامه پس از کامپایل به بایت‌کد تبدیل شده و محتوایی به صورت تصویر فوق دارد که به منزلۀ کدی قابل‌فهم برای ماشین مجازی جاوا می‌باشد. در این مرحله و پس از کامپایل برنامه، می‌توانیم برنامۀ خود را اجرا کنیم که برای این منظور دستور java HelloWorld را در کامندلاین نوشته و اینتر می‌کنیم (در این مرحله نیازی نیست تا پسوندهای java یا class را برای نام برنامۀ خود در نظر بگیریم چرا که ماشین مجازی خود قادر به تشخیص فایل مورد نیاز خواهد بود.) نتیجۀ حاصل از اجرای دستور فوق را در تصویر زیر می‌بینیم:

پس از اجرای دستور فوق، می‌بینیم که برنامۀ HelloWorld به درستی اجرا شده و تنها استرینگ تعریف‌شده در برنامه به صورت «In the Name of God» در خروجی چاپ می‌گردد.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
zohrehkamareii
zohrehkamareii
۱۳۹۷/۱۲/۲۰
سلام
چرا من نمیتونم کلاس فایلمو درست کنم؟
دستور javac رو خطا میده
hamid_mehr_76
hamid_mehr_76
۱۳۹۷/۱۱/۱۱
سلام
ممنون از آموزشتون
من با یه مشکل برخورد کردم
در قسمت اخر اموزش بعد از اینکه java helloworld رو مینویسم برام in the name of god نمیاره
این ارور که عکسش رو گذاشتم میاره
عکس http://s9.picofile.com/file/8350783584/Untitled.png
gsaadati55 قاسم سعادتی
gsaadati55 قاسم سعادتی
۱۳۹۷/۰۵/۰۲
با سلام ابتدا تشکر می کنم
ونظرخودم رو در مورد این مبحث بیان می کنم : لطفا به کادر قرمز رنگ توجه کنید چرا که اشتباه تایپی تجربه شما را در مورد این مبحث بسیار خطا پذیر خواهد کرد . همچنان که من با تایپ غلط با اخطارهای زیادی مواجه شدم و با سماجت زیاد خودم مجبور به تریس کردن برنامه شدم . دوم اینکه حتما کامنت های دوستان عزیزمون رو در ذیل مشاهده کنید و خصوصا دوستانی که راجع به تنظیمات Path و JAVA_HOME صحبت کردن چون بسیار برایم راه گشا بوده و توانستم بالاخره اجرای عملی این مبحث رو با موفقیت انجام بدم . با تشکر مجدد.
sepehr.mirshek
sepehr.mirshek
۱۳۹۷/۰۴/۲۱
سلام
خسته نباشید من که اول فایل رو ذخیره کردم بعد از کلیک کردن روی اون باید انتخاب می کردم که با چه برنامه ای فایل باز بشه ولی من روی فایل کلیک راست کردم و توی قسمت پروپرتیز گزینه ای رو زدم که این فایل های رو با نوت پد بخونه.ممکنه ارور که موقع کامپایل کردن می ده به خاطر این باشه؟
و اینکه وقتی من اسم فایل رو HelloWorld.java می زنم فایل به نام Helloworld سیو می شه چرا؟ و چی کار می تونم بکنم
ممنون می شم راهنمایی بفرمایید
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
۱۳۹۷/۰۳/۲۷
با سلام استاد مگه namig convention رسمی توی جاوا lower camle case نیست ؟ آیا صرفا بخاطر مقاصد آموزشی از پاسکال کیس استفاده کردید ؟
همچنین جایی از مطالب نیاز به ویرایش داره:
[می نویسیم (توجه داشته باشیم که نامی انتخابی برای این فایل می بایست] اصلاح شود به : {... که نام انتخابی برای ...}
arashsamadi651
arashsamadi651
۱۳۹۷/۰۲/۱۴
سلام خسته نباشید
من وقتی میخام این برنامه رو تو cmd کامپایل کنم این اررو رو میده reacher end of file while parsing
اینم عکس http://s8.picofile.com/file/8325385726/cmd.jpg
اینم عکس برنامه http://s8.picofile.com/file/8325385784/notepad.jpg

ممنون میشم کمکم کنید.
javac.life.jav
javac.life.jav
۱۳۹۷/۰۲/۰۱
واقعا کارتون قشنگه امیدوارم خدا بهتون عوضشو بده
Mehran
Mehran
۱۳۹۶/۰۴/۱۴
با سلام .
ممنونم از سایت خوب و عالیتون من ه‍مه کارایی که گفتین انجام دادم ولی وقتی کد javac helloworld.java رو زدم با این خطا روبرو شدم
\'javac\' is not recognized as an internal or external command , operable program or batch file
Andarva
Andarva
۱۳۹۶/۰۴/۰۷
چیکار باید بکنم؟
Andarva
Andarva
۱۳۹۶/۰۴/۰۷
من متد رو درnotepad وارد میکنم ولی وارد cmd میشم مراحل رو طی میکنم ولی در اخر ولیjavac helloworld .java نوشتم واینتر رو زدم
(symbol:method printin(string
location:veriable out of printstream
1error