gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:36:21 25 4
gpt4 key购买 nike

在 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com