gpt4 book ai didi

oop - Smalltalk:原语是如何实现的?

转载 作者:行者123 更新时间:2023-12-03 23:31:08 24 4
gpt4 key购买 nike

我知道一切都是对象,而您在 Smalltalk 中向对象发送消息以完成几乎所有事情。现在我们如何实现一个对象(内存表示和基本操作)来表示原始数据类型?比如整数的+是如何实现的?

我查看了 Smalltalk 的源代码,并在 Smallint.st 中找到了它。有人能解释一下这段代码吗?

 + arg [
"Sum the receiver and arg and answer another Number"

<category: 'built ins'>
<primitive: VMpr_SmallInteger_plus>
^self generality == arg generality
ifFalse: [self retrySumCoercing: arg]
ifTrue: [(LargeInteger fromInteger: self) + (LargeInteger fromInteger: arg)]
]

这里是上面代码的链接:https://github.com/gnu-smalltalk/smalltalk/blob/62dab58e5231909c7286f1e61e26c9f503b2b3df/kernel/SmallInt.st

最佳答案

从概念上讲,原始方法是由虚拟机 (VM) 而非常规 Smalltalk 代码实现的行为(例程)片段。

当 Smalltalk 编译器找到语句 <primitive: ...> 时它将其解释为一种特殊类型的方法,其参数(在您的情况下为 VMpr_SmallInteger_plus)表示 VM 中目标例程的整数索引。

在这个意义上,原语是一个全局例程,不绑定(bind)到 MethodDictionary任何特定类别的。原始逻辑适用于某些类的接收器和参数,这就是为什么它必须检查接收器和参数(如果有的话)是否符合其要求。如果不是,原语 fails 并且在这种情况下,控制流向紧跟 <primitive: ...> 的 Smalltalk 代码。陈述。否则原语 succeeds 和下面的 Smalltalk 代码不会被执行。还要注意,除了在 <primitive:...> 之上的临时声明之外,编译器不允许任何 Smalltalk 代码。句子。

在您的示例中,如果参数 arg不是预期的类(大概是 SmallInteger ),例程放弃尝试将其求和到接收器并将操作的分辨率委托(delegate)给 Smalltalk 代码。

如果参数恰好是 SmallInteger ,原语将计算结果(使用 VM 中保存的例程)并用它来回答。

我还没有看到这个原语的代码,但是如果总和的结果不适合 SmallInteger,也可能会发生原语失败的情况。 ,在这种情况下,接收者和参数都将被强制转换为 LargeInteger s 并且添加将发生在 #+相应类的方法(LargePositiveIntegerLargeNegativeInteger)。

Smalltalk 代码的另一个分支允许在 SmallInteger 之间实现多态和。和任何其他类型的对象。例如,如果您评估 3 + 4.0,Smalltalk 代码的这一部分就会发生。因为在这种情况下,参数是 Float .如果您评估 3 + (4 / 3),也会发生类似的情况。等。

关于oop - Smalltalk:原语是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321776/

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