4

ブルーブックの図 27.4 に2^5-1示されているように、コンパイルされたメソッドで引数の数をエンコードするのに 5 ビットしかないため、メソッドの引数の最大数は (つまり 31) に制限されます。しかし、二重拡張送信バイトコードには、引数の数をエンコードするための 8 ビットがあります ( hereの定義を参照)。これは、メッセージに最大 (つまり 127) 個の引数を送信できることを意味します ( or を使用すると、ステートメントはコンパイルされません)。これは矛盾ですか?バイトコードが引数の数をエンコードするために使用するビットが多すぎると思います。doubleExtendedSendBytecode 2^8-1perform:

4

2 に答える 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 に答える