バイトコード

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

バイトコード( pコードとも呼ばれる) [要出典]は、ソフトウェアインタープリターによる効率的な実行のために設計された命令セットの形式です人間が読める[1]ソースコードとは異なり、バイトコードはコンパクトな数値コード、定数、および参照(通常は数値アドレス)であり、コンパイラの解析結果と、プログラムオブジェクトの型、スコープ、ネストの深さなどの セマンティック分析の実行結果をエンコードします。

バイトコードという名前は、1バイトの オペコードとそれに続くオプションのパラメータを持つ命令セットに由来します。バイトコードなどの中間表現は、解釈を容易にするためにプログラミング言語の実装によって出力される場合があります。または、同じコードを異なるデバイスでクロスプラットフォームで実行できるようにすることで、ハードウェアとオペレーティングシステムへの依存を減らすために使用される場合があります。バイトコードは、多くの場合、仮想マシンpコードマシン、つまりインタープリター)で直接実行されるか、パフォーマンスを向上させるためにマシンコードにさらにコンパイルされます。

バイトコード命令はソフトウェアによって処理されるため、任意に複雑になる可能性がありますが、それでも従来のハードウェア命令に似ていることがよくあります。仮想スタックマシンが最も一般的ですが、仮想レジスタマシンも構築されています。[2] [3]オブジェクトモジュールと同様に、さまざまな部分が別々のファイルに保存されることがよくありますが、実行中に動的にロードされます。

実行

バイトコードプログラムは、命令を1つずつ解析して直接実行することで実行できます。この種のバイトコードインタプリタは非常に移植性があります。動的トランスレータまたはジャストインタイム(JIT)コンパイラと呼ばれる一部のシステムは、実行時に必要に応じてバイトコードをマシンコードに変換します。これにより、仮想マシンはハードウェア固有になりますが、バイトコードの移植性は失われません。たとえば、JavaSmalltalkコードは通常、バイトコード形式で保存されます。これは通常、実行前にバイトコードをマシンコードに変換するためにJITコンパイルされます。これにより、バイトコードがネイティブマシンコードにコンパイルされるときにプログラムが実行されるまでに遅延が発生しますが、ソースコードを直接解釈する場合と比較して、実行速度が大幅に向上します。通常は約1桁(10倍)です。[4]

そのパフォーマンス上の利点のために、今日、多くの言語実装は2つのフェーズでプログラムを実行します。最初にソースコードをバイトコードにコンパイルし、次にバイトコードを仮想マシンに渡します。JavaRakuPythonPHP[a] TclmawkForthには、この種のバイトコードベースの仮想マシンがあります(ただし、Forthがこのようにバイトコードを介してコンパイルされることはめったになく、その仮想マシンはより汎用的です)。代わりに、 PerlRuby 1.8の実装は、ソースコードから派生し た抽象構文ツリー表現をたどることによって機能します。

最近では、V8 [1]Dart [7]の作成者が、高速で効率的なVM実装には中間バイトコードが必要であるという概念に異議を唱えています。これらの言語実装は両方とも、現在、バイトコードを介さずにソースコードからマシンコードに直接JITコンパイルを行っています。[8]

分解 ' lambda  x  print  x )))
; (ラムダ(X))の分解
; 2436F6DF:850500000F22 TEST EAX、[#x220F0000]; no-arg-parsingエントリポイント
; E5:8BD6 MOV EDX、ESI 
; E7:8B05A8F63624 MOV EAX、[#x2436F6A8]; #<PRINT用のFDEFINITIONオブジェクト> 
; ED:B904000000 MOV ECX、4 
; F2:FF7504 PUSH DWORD PTR [EBP + 4] 
; F5:FF6005 JMP DWORD PTR [EAX + 5] 
; F8:CC0A BREAK 10; エラートラップ
; FA:02 BYTE#X02
; FB:18バイト#X18; INVALID-ARG-COUNT-ERROR 
; FC:4Fバイト#X4F; ECX

コンパイルされたコードは、低レベルのバイトコードをデバッグするための組み込みツールを使用して分析および調査できます。ツールは、シェルから初期化できます。次に例を示します。

>>> import  dis  # "dis" -Pythonバイトコードのニーモニックへの逆アセンブラ。
>>> dis dis 'print( "Hello、World!")' 
  1 0 LOAD_NAME 0(print)
              2 LOAD_CONST 0( 'Hello、World!')
              4 CALL_FUNCTION 1 
              6 RETURN_VALUE

も参照してください

メモ

  1. ^ PHPには、PHP 8 [5] [6]でジャストインタイムコンパイルがあり、以前はデフォルトバージョンではオンにされていませんでしたが、 HHVMなどのオプションがありました。古いバージョンのPHPの場合: PHPオペコードは、プログラムが起動されるたびに生成され、常に解釈され、ジャストインタイムでコンパイルされるわけではありません。

参考文献

  1. ^ ab 動的マシンコード生成」Google
  2. ^ 「Lua5.0の実装」(注:これには、レジスタベースの仮想マシンが含まれます。)
  3. ^ 「DalvikVM」2013年5月18日にオリジナルからアーカイブされまし2012年10月29日取得(注:このVMはレジスタベースです。)
  4. ^ 「バイトコード対マシンコード」www.allaboutcomputing.net 2017年10月23日取得
  5. ^ O'Phinney、MatthewWeier。「新しいPHPJITコンパイラの探索」PERFORCEによるZend 2021-02-19を取得
  6. ^ 「PHP8:JIT--stitcher.io」スティッチャー.io 2021-02-19を取得
  7. ^ ロイッチ、フロリアン。「なぜバイトコードVMではないのですか?」Google2013年5月12日にオリジナルからアーカイブされまし
  8. ^ 「JavaScriptの神話:JavaScriptには標準のバイトコードが必要です」2ality.com
  9. ^ 「CLHS:関数DISASSEMBLE」www.lispworks.com
  10. ^ 「パフォーマンスの調整とヒント」lispcookbook.github.io
  11. ^ 「アイコンプログラミング言語の実装」(PDF)2016年3月5日にオリジナル(PDF)からアーカイブされました2011年9月9日取得
  12. ^ 「アイコンとユニコンの実装大要」(PDF)
  13. ^ Paul、Matthias R.(2001-12-30)。「KEYBOARD.SYS内部構造」ニュースグループ:  comp.os.msdos.programmer2017-09-09にオリジナルからアーカイブされました2016年9月17日取得[…]実際、フォーマットは基本的にMS-DOS 3.3-8.0、PC DOS 3.3-2000で、ロシア語、リトアニア語、中国語、日本語の問題、およびWindows NT、2000、XPで同じです[…] 。わずかな違いと非互換性がありますが、一般的な形式は何年にもわたって変更されていません。[…]一部のデータエントリには通常のテーブルが含まれています[…]ただし、ほとんどのエントリには、ある種の種類によって解釈される実行可能コードが含まれています条件分岐などを含む、*実行時*のpコードインタプリタ。これが、KEYBドライバーが、インタープリターを除いて同じレベルの機能を取得する3〜4 Kbで実行できるテーブル駆動のキーボードドライバーと比較して、非常に大きなメモリフットプリントを持っている理由です。[…]
  14. ^ メンデルソン、エドワード(2001-07-20)。「MS-DOSおよびWindowsDOSでユーロを表示する方法」フルスクリーンMS-DOS(Windows95またはWindows98フルスクリーンDOSを含む)でユーロ記号を表示します。2016年9月17日にオリジナルからアーカイブされまし2016年9月17日取得[…] Matthias [R.] Paul […]は、IBM PC DOSバージョンのキーボードドライバーは、 Microsoftドライバーによって認識されない内部手順を使用しているため、可能であれば、両方のKEYBのIBMバージョンを使用する必要があると警告しています。 MicrosoftとIBMのバージョンを混在させる代わりに.COMKEYBOARD.SYS […](注:ここでの「手順」とは、MicrosoftバージョンのKEYBドライバーでサポートされていないIBM KEYBOARD.SYSファイル内の追加のバイトコードです。)
  15. ^ 「米国特許6,973,644」
  16. ^ Microsoft CPcodeの仕様p。13. Multiplanは、当時のさまざまなハードウェア間でMultiplanを移植可能にするために、マシンコードではなく、インタープリターによって実行される一種のバイトコードにコンパイルされました。このバイトコードは、計算するマシン固有の浮動小数点形式と、 2進化10進数(BCD)である外部(標準)形式を区別していました。PACK命令とUNPACK命令は、2つの間で変換されます。
  17. ^ 「Rのインストールと管理」cran.r-project.org
  18. ^ 「SQLiteバイトコードエンジン」2017年4月14日にオリジナルからアーカイブされまし2016年8月29日取得