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

标签 oop smalltalk

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

相关文章:

GNU Smalltalk - 格式化输出并禁用 GC 消息

smalltalk - 如何在 Dolphin Smalltalk 中创建 SUnit 测试?

php - OOP PHP 中的抽象类

javascript - 可以在公共(public)方法中访问私有(private)类属性吗?

smalltalk - 你如何使用吱吱声?

smalltalk - Squeak/Pharo/Newspeak Smalltalk 虚拟机有什么区别?

c# 重复事件(比如日历)

java - 如何防止对象的多个实例在 Java 中具有相同的属性

javascript - 在 Node.js 中扩展类的直接方法