インタープリター言語は通常、バイトコードで浮動小数点数をどのように表現しますか?たとえば、次の行を持つJavaプログラムがあるとします。
double a = 3.0;
3.0
プログラムのバイトコードのように見えますか? 2つの可能性があります。
1)メモリ内の数値のビットレベル表現をバイトコードに書き込み、必要なときにメモリに読み戻すだけです。ここではおそらく移植性に問題があります(マシンごとにdouble
のサイズは異なる可能性があるため、移植可能な方法で数値をバイトコードに格納するにはどうすればよいですか?)。
2)プログラムの実行時間になるとデコードできるバイトコードに、数値の正規表現を書き込みます。リテラル文字列3.0
はここでその目的を果たす可能性がありますが、実行時に浮動小数点数を解析する実行時間を無駄にしています。
だから私の質問は、どの戦略が最も一般的/効率的/最良ですか?バイトコード(Python、Luaなど)にコンパイルされるさまざまなインタープリター言語の例を自由に引用するか、必要に応じていくつかの関連記事のいくつかのリソースの方向に私を向けることができます(私はかなりグーグルしてきましたビットですが、十分に文書化されている仮想マシンはほとんどありません)。
ほとんどの言語は#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です。