web-dev-qa-db-ja.com

バイトコードで浮動小数点数を表す

インタープリター言語は通常、バイトコードで浮動小数点数をどのように表現しますか?たとえば、次の行を持つJavaプログラムがあるとします。

double a = 3.0;

3.0プログラムのバイトコードのように見えますか? 2つの可能性があります。

1)メモリ内の数値のビットレベル表現をバイトコードに書き込み、必要なときにメモリに読み戻すだけです。ここではおそらく移植性に問題があります(マシンごとにdoubleのサイズは異なる可能性があるため、移植可能な方法で数値をバイトコードに格納するにはどうすればよいですか?)。

2)プログラムの実行時間になるとデコードできるバイトコードに、数値の正規表現を書き込みます。リテラル文字列3.0はここでその目的を果たす可能性がありますが、実行時に浮動小数点数を解析する実行時間を無駄にしています。

だから私の質問は、どの戦略が最も一般的/効率的/最良ですか?バイトコード(Python、Luaなど)にコンパイルされるさまざまなインタープリター言語の例を自由に引用するか、必要に応じていくつかの関連記事のいくつかのリソースの方向に私を向けることができます(私はかなりグーグルしてきましたビットですが、十分に文書化されている仮想マシンはほとんどありません)。

3
Ricky Stewart

ほとんどの言語は#1のようなことをします。つまり、特定のバイナリエンコーディングを指定しますが、エンコーディングはほとんど常に IEEE-754 であるため、大多数のアーキテクチャが実装する浮動小数点標準。 「倍精度」IEEE-754浮動小数点数は64ビットと定義されています。

例:

  • Javaクラスファイル形式 は、定数テーブルに格納されている浮動小数点値のエンコーディングを、命令の即値オペランドとして指定します。

    high_bytesおよびlow_bytesのアイテムCONSTANT_Double_info構造体は一緒にdouble値を表しますIEEE754浮動小数点double形式(§2.3.2)。各アイテムのバイトは、ビッグエンディアン(上位バイトが最初)の順序で格納されます。

  • Lua VM もIEEE-754フロートを想定しています。

    NumberはLua数値データ型であり、通常はIEEE 75464ビットdoubleです。

6
Jon Purdy