公式には、「バイトコード」のようなものは (少なくとも Java では) 存在しません。それは単に「コード」です。(Java 仮想マシン仕様のどこにも「バイトコード」はありません。)
しかし、非公式には、Java .class ファイル内の Java メソッド定義の「コード」属性に含まれる仮想マシンの「命令」に適用される用語です。また、この用語は、C++ などの他のいくつかの言語の仮想マシン命令にも適用されます (おそらく「厳密」ではなくなります)。
仮想マシン命令の概念は、一般に、 UCSD Pascalの「p コード」と関連する初期の Pascal 言語の実装に端を発していると考えられています。基本的に、これらは「仮想マシン」によって直接解釈できるコンパイラ「中間言語」の形式であり、ネイティブ マシン コードに変換するには追加のコンパイル手順が必要です。通常、仮想マシンの命令セットは (可能な限り) 「マシンに依存しない」ように設計されており、特定のオペレーティング システムやハードウェアの命令セットに固有のものではありません。
バイトコード命令は、一般に「スタック アーキテクチャ」での単純なアクションです。スタック アーキテクチャは、コンパイルが容易で、"命令" を非常に単純にすることができ、解釈が容易であり、通常のコンパイラ シナリオでの後続の最適化およびコード生成ステップの便利な "ソース" であるため、便利です。(注目すべき例外は Android Dalvik仮想マシンで、命令セットはスタック アーキテクチャではなく、レジスタ ベースのアーキテクチャです。)
Java では、Java プログラムが最初に「解釈」され、バイトコードが JVM のインタープリターによって「実行」されることが最も一般的です。次に、個々のメソッドが「ホット」(頻繁に使用されている) と判断された場合、個々のメソッドは「ジャストインタイム コンパイラ」(JITC) を使用して「ターゲット」ハードウェアの命令セットにコンパイルされます。他の言語の実装は、完全に解釈されたままになるか、すぐに機械命令に変換される場合があります。