جاوا بایت کد

جاوا بایت کد (به انگلیسی: Java bytecode) مجموعه دستورالعمل‌های ماشین مجازی جاوا یا به اختصار JVM است.

ارتباط با جاوا

یک برنامه‌نویس جاوا نیازی به دانستن یا درک جاوا بایت کد ندارد. با این حال، همان‌طور که در مجله IBM developerWorks پیشنهاد شده‌است، «درک بایت کد و آنچه که توسط کامپایلر جاوا تولید می‌شود، به برنامه نویس جاوا کمک می‌کند همانطور که دانش اسمبلی(Assembly) به برنامه نویس C یا C ++ کمک می‌کند.»

مجموعه دستورالعمل معماری

جی وی ام(JVM) هم یک ماشین پشته ای (به انگلیسی: stack machine) و هم یک ماشین ثبات (به انگلیسی: register machine) است. هر فریم برای یک فراخوانی تابع دارای یک "پشته عملوند" و یک آرایه از "متغیرهای محلی" است.  پشته عملوند برای عملوندهای محاسبات و برای دریافت مقدار بازگشتی یک تابع فراخوانی شده استفاده می‌شود، در حالی که متغیرهای محلی برای اهداف مشابهی همانند ثبات‌ها استفاده می‌شوند و همچنین برای انتقال دادن آرگومان‌های تابع استفاده می‌شوند. حداکثر اندازه پشته عملوند و آرایه متغیر محلی، محاسبه شده توسط کامپایلر، بخشی از ویژگی های(attributes) هر تابع است.  هر کدام از آنها می‌تواند به‌طور مستقل از ۰ تا ۶۵۵۳۵ مقدار داشته باشد، که هر مقدار ۳۲ بیت است. ​long​ و ​double​که ۶۴ بیت هستند، دو متغیر محلی متوالی  (که نیازی به اینکه به صورت ۶۴ بیت در یک ردیف در آرایه متغیرهای محلی قرار گرفته باشد نیست) یا یک مقدار در پشته عملوند را می‌گیرند (اما به عنوان دو واحد در عمق پشته به‌شمار می‌رود)

مثال

کد جاوا زیر را در نظر بگیرید: 
outer:for (int i = 2 ; i < 1000; i++) {
    for (int j = 2 ; j < 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

اجرا

امروزه ماشین‌های متعددی وجود دارند که هم رایگان و هم تجاری هستند.
اگر اجرای جاوا بایت کد در یک ماشین مجازی جاوا نامطلوب باشد، یک توسعه دهنده می‌تواند کد منبع جاوا یا بایت کد را به‌طور مستقیم به کد ماشین بومی با ابزارهایی مانند کامپایلر GNU برای جاوا (GCJ) کامپایل کند. بعضی از پردازنده‌ها می‌توانند بایت کد جاوا را به‌طور بومی اجرا کنند. چنین پردازنده هاییپردازنده‌های جاوا نامیده می‌شوند.

پشتیبانی از زبان‌های پویا

ماشین مجازی جاوا از زبان‌های پویا تایپ شونده (به انگلیسی: dynamically typed languages) پشتیبانی می‌کند. بیشتر دستورالعمل‌های موجود در جی وی ام ثابت تایپ شونده (به انگلیسی: statically typed) هستند - به این معنی که فراخوانی توابع امضا(signature) خود را در زمان کامپایل تایپ-چک می‌کنند، بدون مکانیزمی برای تعویق این تصمیم به زمان اجرا، یا برای انتخاب ارسال تابع با یک روش جایگزین.
JSR 292 (از زبان‌های پویا تایپ شونده در بسترهای جاوا پشتیبانی می‌کند) دستورالعمل جدیدinvokedynamic  را در سطح جی وی ام اضافه کرد، تا فراخوانی تابع به داینامیک تایپ-چک (به انگلیسی: type checking) تکیه کند (به جای استاتیک تایپ-چک موجود با دستورالعملinvokevirtual). داوینچی ماشین (به انگلیسی: Da Vinci Machine) یک نمونه اولیه ماشین مجازی است که میزبان توسعه دهنده‌های جی وی ام با هدف پشتیبانی از زبانهای پویا است. همهٔ جی وی ام‌هایی که از ۷ JSE پشتیبانی می‌کنند شامل آپ کد invokedynamic هستند.