声明在方法声明中做什么?,smalltalk,pharo"/>

首页 > 解决方案 > 什么是声明在方法声明中做什么?

问题描述

这是该类的asciiValue方法Character

asciiValue
   <primitive: 171>
   ^ self primitiveFailed

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

标签: smalltalkpharo

解决方案


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

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

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

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

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

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

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


推荐阅读