【问题标题】:Smalltalk: How primitives are implemented?Smalltalk:原语是如何实现的?
【发布时间】:2016-09-04 21:47:33
【问题描述】:

我知道一切都是对象,而您在 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

【问题讨论】:

  • Smalltalk 原始方法和原始类必须在语言之外(或者我应该说下面)实现。看到&lt;primitive: VMpr_SmallInteger_plus&gt;?这是一个线索。搜索VMpr_SmallInteger_plus 的任何实现的non-Smalltalk 代码。 (如果您提供指向您正在浏览的代码的链接,我可能会比这更有帮助。)
  • 那么这里的primitive 是什么意思?这是关键字吗?
  • 如@zwol所说,由于源码在github上,可以用github.com/gnu-smalltalk/smalltalk/…搜索

标签: oop smalltalk


【解决方案1】:

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

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

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

在您的示例中,如果参数 arg 不是预期的类(可能是 SmallInteger),则例程放弃尝试将其求和到接收器并将操作的解析委托给 Smalltalk 代码。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多