<primitive: xyz> 语句在方法声明中有什么作用?

Zol*_*ing 5 smalltalk pharo

这是类的asciiValue方法Character

asciiValue
   <primitive: 171>
   ^ self primitiveFailed
Run Code Online (Sandbox Code Playgroud)

asciiValue 被发送到一个字符对象,例如 $A,并返回它的 ascii 代码。有人可以解释该asciiValue方法是如何工作的吗?这是<primitive: 171>从哪里来的,它的目的是什么?

Lea*_*lia 5

这是一个原始方法而不是常规 Smalltalk 方法的原因是Characters在 Pharo 中是直接对象。

当在内存中看到时,对象是具有标题和一些附加字段的数据结构,每个实例变量一个。这些插槽包含指向当前绑定到 ivars 的对象的指针。

SmallIntegers然而,在 的情况下,这种结构在传统上被简化,因为具有作为 a 的 ivar 的对象SmallInteger不指向小整数对象,它具有SmallInteger. 这就是为什么SmallIntegers被称为直接对象:你没有指向它们,你拥有它们。

当然,要实现立即值,您需要一种在内存中区分它们的方法。SmallIntegers是整数,但在内存中指针也是整数。建立区别的技巧是观察所有对象都分配在 4(32 位)或 8(64 位)的倍数的地址中。这意味着指针的两个低位总是等于 0。因此,您可以使用这些备用位来标记立即对象并将立即值存储在剩余的高位中。

在 Pharo 和其他方言的情况下,Characters其代码点适合一个字节,可以很容易地标记,因此它们变得直接。这就是Characters(和SmallIntegers)没有 ivars 的原因:它们是它们所代表的值,加上一些虚拟机的标签来区分。

因此,Smalltalk 映像无法访问 ASCII 的数值Character,而需要请求 VM 读取它。这就是 Pharo 需要一个原语来回答#asciiValue消息的原因。

有关 Smalltalk 中原语的更多信息,请查看Smalltalk:如何实现原语?.