[英]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.