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