バイトコードとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > デジタル大辞泉 > バイトコードの意味・解説 

バイトコード

【英】Bytecode

バイトコードとは、仮想マシン実行するために設計された、それ自体実行可能プログラムバイナリ表現表したコード、またはそのファイルのことである。通常ソースコードコンパイラがバイトコードへとコンパイルしてバイトコードを生成し仮想マシンがそのバイトコードを、実行環境におけるネイティブコード変換してプログラム実行される


バイトコード

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/03/17 16:34 UTC 版)

バイトコード: bytecode / byte code)は、バイト指向の、中間表現のコードすなわち中間コードの総称である。バイトコードという名前は命令の構成がバイト指向であること、すなわち命令長がバイト可変長であったり、命令中のフィールドの区切りがビット単位でなくバイト単位になっていたり、といったことから来ている。特にJavaの場合オペコードが1バイトである(Javaバイトコードの記事を参照)。しかし、Java仮想マシンの命令体系をバイトコードと呼ぶことがJavaで広く一般的になったことから、前述のようなバイト指向でなくとも仮想マシン向けの命令体系全般をバイトコードと呼んでいることも多い[1]。バイト単位でなくビット単位の場合は、ビットコードとも呼ばれる。ワード指向のためにワードコードという語を使っている例も見られる。

存在意義

ソースコードを直接解釈するインタプリタと同等の移植性を確保した上でのインタプリタのパフォーマンスの高さや、ソースコードの隠蔽が目的であれば、なんらかの中間表現で足りる。 それら中間表現の中でのバイトコードあるいはワードコードの意義は、得られるインタプリタの解釈実行パフォーマンスが最も高いことである。

Unixの普及以来、多くのコンピュータにはバイト単位のメモリアクセスに特化した命令が用意されている。 あるいは、コンピュータのメモリアクセスは、そのコンピュータ固有の大きさのワード単位でのものが最も効率的である。 さらに、実ハードウェアの機械語のパフォーマンスを上げるため、機械語と同様に後続アドレスを順次読み込むメモリアクセスパターンは、多くのコンピュータのメモリシステムで最適化されている。 この、コンピュータにとって最も効率的なメモリ単位とアクセスパターンに、表現体系を合わせたものがバイトコードあるいはワードコードである。 このパフォーマンス上の利点から、現在の多くのインタプリタ言語は実際にはバイトコードにコンパイルされた後、バイトコードインタプリタによって実行される。

純粋なJavaのプログラムはプラットフォーム独立であり、実行環境(Java Runtime Environment, JRE)さえインストールされていればどこでも実行可能であるだけでなく、実行時コンパイラを使ってプロセッサ固有の機械語に随時変換することによってパフォーマンスを確保できることから、エンドユーザー向けにはバイトコードにコンパイルしてJARファイルとしてアーカイブしたものが配布されていることが多い。ソースコードを秘匿するプロプライエタリソフトウェアにも都合がよい。

また、中間表現の中でも実ハードウェアの機械語に最も類似したものなので、機械語に変換する直前の中間表現としても使われることがある。 バイトコードを使用した初期のコンピュータにはSystem/38があり、ソフトウェアのインストール時に機械語に変換された。

スタックマシン vs レジスタマシン - その論点

バイト指向でない中間コードもバイトコードも、その多くは、実ハードウェアの機械語と似た命令フォーマットや命令セットの構成をとっている[注釈 1]。ただし、ハードウェアで実装されたプロセッサでは比較的、スタックマシンよりレジスタマシンの方が多いのに対し、ソフトウェアによる仮想機械抽象機械ではJava仮想マシンなどスタックマシンも多いという特徴がある。なお、Luaのバージョン5やDalvik仮想マシンなど、レジスタマシンも多い。

理論的観点

抽象機械」と呼ばれるような計算モデルとしての性格が強い機械の場合、理論的な扱いのためにスタックが使われているものもある。

命令の粒度

レジスタマシン型命令セットではオペランドの位置を命令内で明示する。これに対しスタックマシン型命令セットでは、暗黙のうちにスタックトップをオペランドとして使い、オペランドの位置を明示する領域が不要である。目的のオペランドがスタックトップにない場合にはオペランド移動のための命令を追加する。大まかに言えば、スタックマシン命令1個当たりの長さと機能は、レジスタマシン1命令内の個々のオペランドフィールド1個、またはコードフィールドと同等である。

このためバイトコード全体の長さには大差はなさそうだが、スタックマシンでは命令順を並び換えることでオペランド移動命令を略せる場合がある。レジスタマシンではオペランド指定は省略できないので、オペランド移動を省略した分だけスタックマシンの方が同等のプログラムを短く記述できる場合が多い。またデータキャッシュヒット率が高まるので、プログラムサイズ削減は実効速度改善にもなる。

しかしオペランド移動の省略を施しても、スタックマシンの方がレジスタマシンより命令数が多くなる。個々の命令が極めて単純な処理しか行わないバイトコードインタプリタでは、命令の種類を判定して分岐する処理が実行時間の大きな割合を占めるので、この点ではレジスタマシンの方が有利となる。

命令間でのオペランドの受け渡し

レジスタマシン型インタプリタでは番号で仮想レジスタを指定するが、多くの実機では実行時に物理レジスタを番号で参照することができないため、メモリ配列によって仮想レジスタが実装されている場合が多い。これに対しスタックマシン型インタプリタでは、ほとんどの命令のオペランドがスタックトップに決め打ちされ、参照すべき物理レジスタをコンパイル時に決定できるので、スタックトップ数個を物理レジスタで実装している。多くの実機ではレジスタ経由でのデータ受け渡しは1クロックでできるのに対し、メモリ経由でのデータ受け渡しは数クロックを要するので、直前の命令の結果を直後の命令が使う処理が連なった場合は、レジスタマシンは不利となる。

ソースコードからバイトコードへの変換

ALGOL以来、多くのプログラミング言語は文脈自由文法で記述でき、スタックマシンと類似したプッシュダウン・オートマトンで構文解析できる。このため、スタックマシン向けのコード生成器ならば、構文解析器と一体化させて省メモリ・高速なものにできる。

レジスタマシン向けの場合、有限のレジスタを使い回すレジスタ割り付けを行う必要がある。ただし、インタプリタの仮想レジスタはメモリ配列で実装されている場合が多い。このため、メモリ配列の大きさが許す限り、実機では非現実的な膨大な数の仮想レジスタを実装でき、その場合、レジスタの使い回しを省いてレジスタ割り付けを単純化することができる。レジスタ・ウィンドウも僅かなコストでレジスタ1本単位でスライドさせる柔軟なものが実装でき、スタックマシン向けと同様に構文解析器とコード生成器の一体化に役立つ。[1]

使用例

脚注

注釈

  1. ^ 実機ではデコーダやエンコーダといった論理回路に向いたビットパターンのほうが好まれるといった細かい傾向の違いなどはある。

出典

関連項目


バイトコード

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/20 10:04 UTC 版)

インタプリタ」の記事における「バイトコード」の解説

詳細は「バイトコード」を参照 ソースコード実行可能形にするには、まず、ソースコード構文木変換する必要がある構文木のまま、インタプリタ型の処理系実行する処理系もあるが、構文木をさらに、中間コード(バイトコードなど)などの中間表現変換してから実行する物もある。中間コードをバイトコードと呼んでいる処理系ではそのインタプリタをバイトコードインタプリタと呼ぶ。Java.NET Framework のように、中間コード仕様公開しファイル書き出すものもあるし、仕様公開せず処理系内部だけで使用するものもある。動的コンパイル使っているインタプリタは、内部実機機械語変換し実行するインタプリタコンパイラの間には様々な中間的実装存在しそれぞれにプログラム実行前に行われる解析度合い異なる。例えEmacs Lisp はバイトコードにコンパイルされ、LISPソースを高度に圧縮し最適化した表現にしているが、それは機械語コードではない(したがって特定のプラットフォーム依存しない)。この「コンパイル」されたコード解釈するのがバイトコードインタプリタである(それ自体は C で書かれている)。この場合コンパイルされたコード仮想機械機械語コードであり、仮想機械ハードウェア実装されておらず、バイトコードインタプリタとして実装されている。同様の手法Open Firmware システム使われている Forth コードでも使われている。ソース言語は「Fコード」(バイトコードの一種)にコンパイルされ、それを仮想機械解釈実行する。他にPコードマシンなどがある。 コントロール・テーブル(英語版)はコンパイラ通さなくとも生成でき、バイトコードインタプリタと同様の方法カスタマイズされたインタプリタでの適切なアルゴリズム制御構造記述できる。

※この「バイトコード」の解説は、「インタプリタ」の解説の一部です。
「バイトコード」を含む「インタプリタ」の記事については、「インタプリタ」の概要を参照ください。

ウィキペディア小見出し辞書の「バイトコード」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「バイトコード」の関連用語

バイトコードのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



バイトコードのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
デジタル大辞泉デジタル大辞泉
(C)Shogakukan Inc.
株式会社 小学館
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2025 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【バイトコード】の記事を利用しております。
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのバイトコード (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのインタプリタ (改訂履歴)、Emacs Lisp (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS