<原语:xyz>语句在方法声明中做什么?



这是Character类的asciiValue方法:

asciiValue
<primitive: 171>
^ self primitiveFailed

asciiValue被发送到字符对象,例如$a,并返回其ascii代码。有人能解释一下asciiValue方法是如何工作的吗?<primitive: 171>从哪里来,它的用途是什么?

这是一个基元而不是常规Smalltalk方法的原因是Pharo中的Characters立即对象。

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

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

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

在Pharo和其他方言的情况下,其代码点位于一个字节内的Characters可以很容易地被标记,以便它们变得立即。这就是为什么Characters(和SmallIntegers(没有ivar的原因:它们是它们所代表的值,加上虚拟机的一些标签来区分。

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

有关Smalltalk中原语的更多信息,请参阅Smalltalk:原语是如何实现的?。

最新更新