簡體   English   中英

Smalltalk-80實現中方法的參數計數限制

[英]Argument count limit of methods in Smalltalk-80 implementation

方法的最大參數數量限制為2^5-1 (即31),因為在編譯方法中只有5位來編碼參數的數量,如藍皮書的圖27.4所示 但是雙擴展發送字節碼有8位來編碼參數的數量(參見這里doubleExtendedSendBytecode的定義),這意味着我可以向消息發送多達2^8-1 (即127)個參數(使用perform:或聲明不會被編譯)。 這是矛盾嗎? 我認為字節碼使用太多位來編碼參數的數量。

是的,這是一個矛盾,但它還不夠重要。

此外,方法中的參數數量也限制為方法中臨時變量的最大數量,在大多數Smalltalks中恰好是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字節碼替換的原因之一,該字節碼可以做的不僅僅是發送,而是將參數的數量限制為2^5-1 (這仍然CompiledMethod可以編碼的多,但它不是CompiledMethod不太可能在可預見的將來改變以編碼超過15個參數)。

使用的實際參數數量通常很小。 Moose 4.6 Image中CompiledMethods的參數個數我在這里:

|bag|
bag := IdentityBag new.
CompiledMethod allInstances do:[ :element | bag add: element numArgs ].
bag sortedCounts

52006 -> 0
25202 -> 1
6309  -> 2
2133  -> 3
840   -> 4
391   -> 5
191   -> 6
104   -> 7
61    -> 8
12    -> 9
11    -> 10
5     -> 11
4     -> 12
3     -> 13
2     -> 15
1     -> 14

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM