方法的最大参数数量限制为 2^5-1
(即 31),因为只有 5 位用于对编译方法中的参数数量进行编码,如 Figure 27.4 of the blue book 所示。但是双扩展发送字节码有 8 位来编码参数的数量(请参阅 doubleExtendedSendBytecode
here 的定义),这意味着我可以向消息发送多达 2^8-1
(即 127)个参数(使用 perform:
,否则语句将不会编译)。这是矛盾吗?我认为字节码使用了太多位来编码参数的数量。
最佳答案
是的,这是一个矛盾,但还不够重要。
此外,方法中的参数数量也受限于方法中临时变量的最大数量,在大多数 Smalltalks 中恰好是 2^8-1
.
还有另一部分:
在 Squeak 中,参数的数量实际上限制为 15 ( 2^4-1
),并且方法头中也只有半字节(4 位)空间。
正如吱吱的评论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 个参数)。
关于oop - Smalltalk-80 实现中方法的参数计数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17963655/