1
2
你可能想看看 VMMaker . 它的解释器类是执行compiledMethod的字节码的人,它实际上会将消息发送到您的对象。 例如,如果您查看对象的字节码>>respondsto:
解释器读取一个字节码,查找其字节码表中的字节码(在解释器类>>initialiseBytecodetable中初始化),并执行适当的方法。因此,<70>(pushReceiverBytecode)将自己推到解释器的内部堆栈上。然后(bytecodeDeprimClass)归结为“找到自我的类”。<10>(pushTemporaryVariableBytecode)将参数推送到堆栈上。有趣的部分发生在(sendliteralselectorbytecode),它调用
我是一个虚拟机新手;上面的内容可能不是看到算法实际运行的最佳场所,等等(甚至不是最好的解释),但我希望这是一个好的开始。
虚拟机用来实际发送消息的算法和您在问题中概述的一样。该算法的实际实现在
前者和你描述的差不多:
后者的工作原理如下:
|
2
1
再挖一点
如果我们检查它是如何解释字节码的,
所以这就是 不 我正在寻找的实际实现(因此这不是一个真正的答案),但我想它可以帮助理解精确算法的细微差别。 |
3
1
要理解Franks的回答,您需要一些背景信息: 编译器生成一个“发送字节码”,稍后由VM的字节码解释器执行(或jitted,但语义相同)。因此,您不会期望在任何类中找到实现,而是在VM中。 大多数其他虚拟机都是用C语言、汇编程序或其他语言编写的… 但是:scueak vm是用smalltalk编写的,并由“smalltalk-to-c-compiler的子集”(称为“slang”,因为它不包含完整的smalltalk语义)编译到c。 由于是用smalltalk编写的,所以虚拟机当然可以在squak中进行开发、调试和测试(通过在图像中的图像上运行俚语解释器)。这就是为什么您可以在Frank所描述的解释器中找到实现。 |
ludo · 我们如何使用法罗的每一种方法? 7 年前 |
patzi · 理解smalltalk中奇怪的逻辑运算符 7 年前 |
patzi · 如何在Smalltalk中操作位? 7 年前 |
patzi · 了解GNU Smalltalk闭包 7 年前 |
Hutch · Pragmas的工作方式似乎和我在海边预期的不同 7 年前 |
Diana · Pharo Smalltalk中的For循环For数组 7 年前 |
nickwalt · 初级程序员-是从ES5还是ES6开始[已关闭] 8 年前 |