جاوا بایت کد
جاوا بایت کد (به انگلیسی: 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 < 1000; i++) { 0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16 : iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 38 25: iinc 2, 1 28: goto 11 31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V 38: iinc 1, 1 41: goto 2 44: 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 assembler
4.Krakatau home page
5.Free Pascal 3.0 release notes
6.Free Pascal JVM Target
7.see JSR ۲۹۲