آشنایی با 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. و همچنین نامی یکسان با نام کلاس مربوطه ذخیره سازیم؛ به عبارت دیگر، نام HelloWorld.java را برای این فایل در نظر می‌گیریم. حال برای آنکه بتوانیم برنامۀ خود را اجرا کنیم، نیاز است تا وارد محیط کامندلاین شویم که ساده‌ترین روش دسترسی به آن در سیستم‌عامل‌های مختلف را در ادامه بیان می‌کنیم:

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

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

$ java -version

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

$ D:

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

$ dir

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

$ javac HelloWorld.java

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

‏؛¾   6 
  	   
     <init> ()V Code LineNumberTable main ([Ljava/lang/String;)V 
SourceFile HelloWorld.java      In the Name of God    
HelloWorld java/lang/Object java/lang/System out Ljava/io/PrintStream; java/io/PrintStream println (Ljava/lang/String;)V !            	        *· ±    
        	    	   %     	² ¶ ±    
   
        
    

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

In the Name of God

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


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
gsaadati55 قاسم سعادتی
gsaadati55 قاسم سعادتی
۱۳۹۷/۰۵/۰۲
با سلام ابتدا تشکر می کنم
ونظرخودم رو در مورد این مبحث بیان می کنم : لطفا به کادر قرمز رنگ توجه کنید چرا که اشتباه تایپی تجربه شما را در مورد این مبحث بسیار خطا پذیر خواهد کرد . همچنان که من با تایپ غلط با اخطارهای زیادی مواجه شدم و با سماجت زیاد خودم مجبور به تریس کردن برنامه شدم . دوم اینکه حتما کامنت های دوستان عزیزمون رو در ذیل مشاهده کنید و خصوصا دوستانی که راجع به تنظیمات Path و JAVA_HOME صحبت کردن چون بسیار برایم راه گشا بوده و توانستم بالاخره اجرای عملی این مبحث رو با موفقیت انجام بدم . با تشکر مجدد.
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
amin
amin
۱۳۹۶/۰۴/۰۵
آقایون بجای args بنویسید param
حرف اول string باید بزرگ باشه
amin
amin
۱۳۹۶/۰۴/۰۴
میشه یکی ساختن فایل های patch و java-home رو دقیق یاد بده
کاربر میهمان
shivaمن یک کاربر مهمان هستم
۱۳۹۶/۰۲/۲۶
مشکل منم با ری استارت حل شد، مرسی از دوستی که این راه حل رو گفت
کاربر میهمان
imanمن یک کاربر مهمان هستم
۱۳۹۶/۰۱/۲۳
عالیه
Sina Honarvar
Sina Honarvar
۱۳۹۵/۱۲/۲۹
اولین تجربه‌ام در java درست انجام شد ، تشکر
کاربر میهمان
پریسامن یک کاربر مهمان هستم
۱۳۹۵/۱۲/۰۵
من تازه شروع کردم به خوندن و مرحله اول به درستی اجرا شد...ممنون از بیان شیوا تون
کاربر میهمان
جعفرمن یک کاربر مهمان هستم
۱۳۹۵/۱۲/۰۱
درود بر همه دوستان
بعد از یک ریستارت عالی مشکلم حل شد و فایل HelloWorld.calss در کنار فایل جاوا ایجاد شد.