gpt4 book ai didi

oop - Smalltalk-80 实现中方法的参数计数限制

转载 作者:行者123 更新时间:2023-12-02 17:15:27 25 4
gpt4 key购买 nike

方法的最大参数数量限制为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com