reflection - 在 Squeak 中,我在哪里可以找到消息处理算法的代码?

标签 reflection smalltalk squeak

在 Squeak 中向对象发送消息时,运行时调用算法类似于

  • curr <- 接收者的类
  • 当 curr 不为零时重复
  • 在该类的方法中搜索选择器;如果存在,调用它并返回
  • curr <- curr 的父类(super class)
  • 调用 doesNotUnderstand:self

  • 现在,respondsTo: 使用了非常相似的算法。方法,确实可以通过检查respondsTo:看到的代码。 我试图找到的是用于调用的上述算法的代码位置 .

    我知道 perform:做了类似的事情,但我相信它不用于常规方法调用,而仅用作类似反射的方法调用机制(例如,当程序员直到运行时才知道方法名称时)。

    如果上面的代码也隐藏为原始指令,我在哪里可以找到原始调用?如果不是,我在哪里可以找到代码本身?

    最佳答案

    您可能想查看 VMMaker .它的 Interpreter 类是执行 CompiledMethod 字节码的人,并将实际将消息发送到您的对象。

    例如,如果您查看 Object>>respondsTo: 的字节码,您将看到

    17 <70> self
    18 <C7> send: class
    19 <10> pushTemp: 0
    20 <E0> send: canUnderstand:
    21 <7C> returnTop
    

    解释器读入字节码,在其 BytecodeTable(在解释器类>>initialiseBytecodeTable 中初始化)中查找该字节码并执行适当的方法。所以 <70> (#pushReceiverByteCode) 将 self 插入解释器的内部堆栈。然后 (#bytecodePrimClass) 归结为“找到自己的类(class)”。 <10> (#pushTemporaryVariableBytecode) 将#respondsTo: 的参数压入堆栈。有趣的部分发生在 (#sendLiteralSelectorBytecode),它调用 self normalSend . #normalSend 依次计算出接收者的类别(在本例中为 self class),然后调用 self commonSend ,它会找到我们想要运行的实际方法,然后运行它。

    我是虚拟机新手;以上可能不是查看算法运行等的绝对最佳位置(甚至不是最好的解释),但我希望这是一个很好的起点。

    VM 用于实际发送消息的算法与您在问题中概述的一样。该算法的实际实现在 Interpreter>>commonSend 中定义。 .查找算法在 Interpreter>>lookupMethodInClass: 中和执行算法在 Interpreter>>internalExecuteNewMethod .

    前者的工作原理与您描述的一样:
  • 列表项
  • 尝试在这个类中找到方法。
  • 如果未找到,请查看父类(super class)。
  • 如果递归失败,请尝试 find #doesNotUnderstand:
  • 如果 #doesNotUnderstand: 不存在于类层次结构中的任何位置,则抛出错误。

  • 后者的工作方式如下:
  • 如果是原语,则运行原语。
  • 如果不是,请激活新方法(创建新的激活记录)。
  • (检查中断。)
  • 关于reflection - 在 Squeak 中,我在哪里可以找到消息处理算法的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333290/

    相关文章:

    user-interface - 为什么Squeak界面的外观和行为如此陈旧?

    smalltalk - Smalltalk 图像中的对象数量是否有上限?

    c# - 使用 Reflection.SetValue 时如何提供转换?

    smalltalk - 为什么分配许多变量似乎会改变我的变量?

    java - 如何对 map /字典进行 ASN.1 编码?

    observer-pattern - 公告与经典 Smalltalk-80 依赖/更改/更新机制有何关系?

    c# - .NET Standard 1.x 的 Type.GetInterfaces() 解决方法

    c# - 是否可以使用反射连接匿名委托(delegate)?

    c# - 只加载一次程序集

    smalltalk - Squeak/Pharo Trait 和 Newpeak Mixin 有什么区别?