جاوا بایت کد کیست؟ توضیح بده.
جاوا بایت کد (به انگلیسی: Java bytecode) مجموعه دستورالعمل‌های ماشین مجازی جاوا یا به اختصار JVM است.ارتباط با جاوا.یک برنامه‌نویس جاوا نیازی به دانستن یا درک جاوا بایت کد ندارد. با این حال، همان‌طور که در مجله IBM developerWorks پیشنهاد شده‌است، «درک بایت کد و آنچه که توسط کامپایلر جاوا تولید می‌شود، به برنامه نویس جاوا کمک می‌کند همانطور که دانش اسمبلی(Assembly) به برنامه نویس C یا C ++ کمک می‌کند.»مجموعه دستورالعمل معماری.جی وی ام(JVM) هم یک ماشین پشته ای (به انگلیسی: stack machine) و هم یک ماشین ثبات (به انگلیسی: register machine) است. هر فریم برای یک فراخوانی تابع دارای یک "پشته عملوند" و یک آرایه از "متغیرهای محلی" است. پشته عملوند برای عملوندهای محاسبات و برای دریافت مقدار بازگشتی یک تابع فراخوانی شده استفاده می‌شود، در حالی که متغیرهای محلی برای اهداف مشابهی همانند ثبات‌ها استفاده می‌شوند و همچنین برای انتقال دادن آرگومان‌های تابع استفاده می‌شوند. حداکثر اندازه پشته عملوند و آرایه متغیر محلی، محاسبه شده توسط کامپایلر، بخشی از ویژگی های(attributes) هر تابع است. هر کدام از آنها می‌تواند به‌طور مستقل از ۰ تا ۶۵۵۳۵ مقدار داشته باشد، که هر مقدار ۳۲ بیت است. و که ۶۴ بیت هستند، دو متغیر محلی متوالی (که نیازی به اینکه به صورت ۶۴ بیت در یک ردیف در آرایه متغیرهای محلی قرار گرفته باشد نیست) یا یک مقدار در پشته عملوند را می‌گیرند (اما به عنوان دو واحد در عمق پشته به‌شمار می‌رود) مجموعه دستورالعمل.هر بایت کد از یک بایت که نشانگر آپ کد (به انگلیسی: opcode) است، همراه با صفر یا تعداد بایت بیشتر برای عملوندها تشکیل شده‌است. از ۲۵۶ بایت-long آپ کد ممکن، ، ۲۰۲ در حال استفاده هستند (~ ۷۹٪)، ۵۱ برای استفاده در آینده رزرو شده‌اند(~ ۲۰٪)، و ۳ دستورالعمل (~ ۱٪) به‌طور دائمی برای استفاده پیاده‌سازی‌های جی وی ام رزرو شده‌است. دو تا از اینها (codice_1 و codice_2) به ترتیب مسئول ایجاد تله(trap) برای پیاده‌سازی خاص نرم‌افزار و سخت‌افزار هستند. سومی توسط دیباگرها برای پیاده‌سازی نقطه توقف(break point) استفاده می‌شود.دستورالعمل‌ها به تعدادی گروه گسترده تقسیم می‌شوند:همچنین چندین دستورالعمل برای تعدادی از کارهای تخصصی تر مانند پرتاپ استثنا (به انگلیسی: exception throwing)، هماهنگ سازی (به انگلیسی: synchronization) و غیره وجود دارد.بسیاری از دستورالعمل‌ها دارای پیشوند و / یا پسوندهای مربوط به انواع عملوندهایی که روی آن عمل می‌کنند هستند. که به شرح زیر است:برای مثال، codice_17 دو عدد صحیح(integer) را جمع می‌کند، در حالی که codice_18 دو عدد double را جمع می‌کند. دستورالعمل‌های codice_19 ، codice_20 و codice_21 می‌توانند یک پسوند از فرم codice_22 داشته باشند، که "n" یک عدد از ۰–۳ برای codice_20 و codice_21 می‌باشد. حداکثر مقدار "n" برای codice_19 بسته به نوع متفاوت است.دستورالعمل codice_19 یک مقدار از نوع مشخص شده را بر روی پشته قرار می‌دهد. به عنوان مثال، codice_27 یک عدد صحیح (مقدار ۳۲ بیتی) با مقدار ۵ را روی پشته قرار می‌دهد، در حالی که codice_28 یک double با مقدار 1 (64bit floating point value) را بر روی پشته قرار می‌دهد. همچنین دستورالعمل codice_29وجود دارد، که یک مرجع(reference) را روی پشته قرار می‌دهد. "n" برای دستورالعمل codice_20 و codice_21 ، شاخص(index) را در آرایه متغیر محلی برای بارگیری یا ذخیره کردن مشخص می‌کند. دستورالعمل codice_3 شی (به انگلیسی: object) را در متغیر محلی ۰ را بر روی پشته قرار می‌دهد (این معمولاً شیcodice_33 است). codice_34 عدد صحیح بالای پشته را در متغیر محلی ۱ ذخیره می‌کند. برای متغیرهای محلی فراتر از ۳، پسوند وجود ندارد و باید از عملوند استفاده شود.مثال.کد جاوا زیر را در نظر بگیرید: outer:for (int i = 2 ; i &lt; 1000; i++) { for (int j = 2 ; j &lt; i; j++) { if (i % j == 0) continue outer; System.out.println (i); یک کامپایلر جاوا ممکن است کد جاوای بالا را به بایت کد به صورت زیر ترجمه کند، فرض بر این است که کد بالا در یک تابع قرار داده شده‌است: 0: iconst_21: istore_12: iload_13: sipush 10006: if_icmpge 449: iconst_210: istore_211: iload_212: iload_113: if_icmpge 3116 : iload_117: iload_218: irem19: ifne 2522: goto 3825: iinc 2, 128: goto 1131: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream;34: iload_135: invokevirtual #85; // Method java/io/PrintStream.println:(I)V38: iinc 1, 141: goto 244: returnنسل.رایج‌ترین زبان که با تولید جاوا بایت کد ماشین مجازی جاوا JVM را هدف قرار داده‌است، جاوا است. در ابتدا تنها یک کامپایلر وجود داشت، کامپایلر javac از Sun Microsystems، که کد منبع جاوا را به جاوا بایت کد کامپایل می‌کند؛ اما به دلیل اینکه تمام خصوصیات بایت کدی جاوا در حال حاضر در دسترس است، دسته‌های دیگر کامپایلرهایی را تولید کرده‌اند که جاوا بایت کد تولید می‌کنند. نمونه‌هایی از کامپایلرهای دیگر عبارتند از:بعضی از پروژه‌ها، اسمبلرهای جاوا را قادر می‌سازند که به ضورت دستی جاوا بایت کد بنویسند. کد اسمبلی ممکن است توسط ماشین تولید شود، مثلاً توسط یک کامپایلر که یک ماشین مجازی جاوا را هدف قرار می‌دهد. اسمبلرهای مشهور جاوا عبارتند از:دیگران برای زبان‌های برنامه‌نویسی مختلف کامپایلرهایی را که ماشین مجازی جاوا را هدف قرار می‌دهند، توسعه داده‌اند مانند:اجرا.امروزه ماشین‌های متعددی وجود دارند که هم رایگان و هم تجاری هستند.اگر اجرای جاوا بایت کد در یک ماشین مجازی جاوا نامطلوب باشد، یک توسعه دهنده می‌تواند کد منبع جاوا یا بایت کد را به‌طور مستقیم به کد ماشین بومی با ابزارهایی مانند کامپایلر GNU برای جاوا (GCJ) کامپایل کند. بعضی از پردازنده‌ها می‌توانند بایت کد جاوا را به‌طور بومی اجرا کنند. چنین پردازنده هایی"پردازنده‌های جاوا" نامیده می‌شوند.پشتیبانی از زبان‌های پویا.ماشین مجازی جاوا از زبان‌های پویا تایپ شونده (به انگلیسی: ) پشتیبانی می‌کند. بیشتر دستورالعمل‌های موجود در جی وی ام ثابت تایپ شونده (به انگلیسی: ) هستند - به این معنی که فراخوانی توابع امضا(signature) خود را در زمان کامپایل تایپ-چک می‌کنند، بدون مکانیزمی برای تعویق این تصمیم به زمان اجرا، یا برای انتخاب ارسال تابع با یک روش جایگزین.JSR 292 "(از زبان‌های پویا تایپ شونده در بسترهای جاوا پشتیبانی می‌کند)" دستورالعمل جدیدcodice_35 را در سطح جی وی ام اضافه کرد، تا فراخوانی تابع به داینامیک تایپ-چک (به انگلیسی: ) تکیه کند (به جای استاتیک تایپ-چک موجود با دستورالعملcodice_36). داوینچی ماشین (به انگلیسی: ) یک نمونه اولیه ماشین مجازی است که میزبان توسعه دهنده‌های جی وی ام با هدف پشتیبانی از زبانهای پویا است. همهٔ جی وی ام‌هایی که از ۷ JSE پشتیبانی می‌کنند شامل آپ کد codice_35 هستند.منابع.1.فهم بایت کد شما را به برنامه‌نویس بهتری تبدیل می‌کند2."The Java Virtual Machine Specification"3.Jamica: The Java virtual JVM macro assembler4.Krakatau home page5.Free Pascal 3.0 release notes6.Free Pascal JVM Target7.see JSR ۲۹۲