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.9
?ldc.i4 <int32 (num)>
そして、このようなものは他にもあります。
異なる VM のオペコード間のこの違いの背後にある理由は何ですか? これらのオペコードを考案するための特定の理論はありますか、それとも VM 自体の特性によって完全に駆動されるのか、高水準言語構造に依存するのでしょうか?