ブルーブックの図 27.4 に2^5-1
示されているように、コンパイルされたメソッドで引数の数をエンコードするのに 5 ビットしかないため、メソッドの引数の最大数は (つまり 31) に制限されます。しかし、二重拡張送信バイトコードには、引数の数をエンコードするための 8 ビットがあります ( hereの定義を参照)。これは、メッセージに最大 (つまり 127) 個の引数を送信できることを意味します ( or を使用すると、ステートメントはコンパイルされません)。これは矛盾ですか?バイトコードが引数の数をエンコードするために使用するビットが多すぎると思います。doubleExtendedSendBytecode
2^8-1
perform:
質問する
174 次
2 に答える
4
はい、これは矛盾していますが、まだ十分ではありませんでした。
また、メソッド内の引数の数も、メソッド内の一時変数の最大数に制限されており、ほとんどの Smalltalk では2^8-1
.
それには別の部分があります:
Squeak では、引数の数は実際には 15 個 ( 2^4-1
) に制限されており、メソッド ヘッダーにはニブル (4 ビット) のスペースしかありません。Squeak のCompiledMethod
状態のコメントとして:
(index 18) 6 bits: number of temporary variables (#numTemps)
(index 24) 4 bits: number of arguments to the method (#numArgs)
には、引数の数も#numTemps
含まれます。
簡単に言うと、はdoubleExtendedSendBytecode
で実際に表現できるよりも多くの引数をエンコードできますCompiledMethod
。
これが Squeak でdoubleExtendedDoAnything
バイトコードに置き換えられた理由の 1 つです。このバイトコードは単に送信するだけではなく、引数の数を制限します2^5-1
(これはがCompiledMethod
エンコードできる数よりも多いですがCompiledMethod
、予見可能な範囲で変更される可能性は低くありません)。 future を使用して 15 を超える引数をエンコードします)。
于 2013-07-31T15:42:17.907 に答える