1

CLR や JVM などのスタック ベースの仮想マシンには、さまざまな命令セットがあります。仮想マシンを作成する際に命令セットを考案する背後にある理論はありますか? たとえば、0 ~ 5 の定数をスタックにロードするための JVM 命令セットがあります。

iconst_0
iconst_1
iconst_2
iconst_3
iconst_4
iconst_5

一方、CLRには、次のように0から8までの番号をスタックにロードする命令セットがあります

ldc.i4.0
ldc.i4.1
ldc.i4.2
ldc.i4.3
ldc.i4.4
ldc.i4.5
ldc.i4.6
ldc.i4.7
ldc.i4.8

なぜ上記のオペコードが必要なのですかldc.i4.9ldc.i4 <int32 (num)>そして、このようなものは他にもあります。

異なる VM のオペコード間のこの違いの背後にある理由は何ですか? これらのオペコードを考案するための特定の理論はありますか、それとも VM 自体の特性によって完全に駆動されるのか、高水準言語構造に依存するのでしょうか?

4

1 に答える 1

0

典型的な答えは、それらは「バイトコード」であるため、256 個しかないため、範囲全体を使用したくないというものです。初期設計時には考慮されていなかった新しいバイトコードのための余地を残しておく必要があります。

したがって、一般的に行われるのは、一般的なパターンとは何かを統計的に分析し、それらを短縮しようとすることです。(つまり、常に一般的な ldc を使用する必要がある代わりに、iconst0 などを短く/高密度のバージョンとして使用します)。

設計された時点で、CLR と JVM の関係者は非常に小さな数しか必要としなかったと推測できます。

于 2012-07-03T04:24:30.560 に答える