什么是x86最快的虚拟机设计?

我将在x86中实现一个虚拟机,并且我想知道什么样的设计会产生最佳结果。 我应该专注于挤出果汁? 我将在x86汇编中实现整个虚拟机。

我没有太多的指示,我可以选择他们的形式。 这些指令直接在块中直接输入到smalltalk的语法中。 我给出了我正在考虑的指导设计:

^ ...       # return
^null     # return nothing
object    # address to object
... selector: ... # message pass (in this case arity:1 selector: #selector:)
var := ... # set
var # get

我在想的那种虚拟机:

mov eax, [esi]
add esi, 2
mov ecx, eax
and eax, 0xff
and ecx, 0xff00 # *256
shr ecx, 5          # *8
jmp [ecx*4 + operations]
align 8:
    operations:
dd retnull
dd ret
# so on...
    retnull:          # jumps here at retnul
# ... retnull action
    ret:
# ... ret action
#etc.

不要开始问为什么我需要另一个虚拟机实现。 解释性例程不是您只需要时就拿起的库存材料。 大多数您在其他地方提出的虚拟机都会考虑到可移植性和性能成本。 我的目标不是可移植性,我的目标是性能。

这个解释器完全需要的原因是因为smalltalk块不会以相同的方式得到解释:

A := B subclass: [
    def a:x [^ x*x]
    clmet b [...]
    def c [...]
    def d [...]
]

[ 2 < x ] whileTrue: [...]

(i isNeat) ifTrue: [...] ifFalse: [...]

List fromBlock: [
    "carrots"
    "apples"
    "oranges" toUpper
]

我需要从解释例程中获得真正的好处,那就是选择读取程序的上下文。当然,好的编译器应该在大多数情况下编译明显的例子:'ifTrue:ifFalse'或'whileTrue: '或列表示例。 解释者的需求并不会消失,因为你总是可能遇到一种情况,即你无法确定该区块是否得到了你期望的治疗。


我看到这里对可移植性存在一些困惑,所以我觉得有必要澄清一些问题。 这些是我的卑微观点,所以你当然可以自由反对他们。

如果你认真地写一个虚拟机,我假设你来到http://www.complang.tuwien.ac.at/forth/threading/,所以我不会详述所描述的技术。

已经提到,针对虚拟机具有一些优点,例如缩小代码大小,降低编译器复杂性(通常转化为更快的编译),可移植性(注意虚拟机的重点在于语言的可移植性,所以虚拟机无关紧要本身不便携)。

考虑到您的示例的动态特性,您的虚拟机将比其他更受欢迎的虚拟机类似于JIT编译器。 所以,尽管S.Lott在这种情况下错过了这一点,但他提到Forth是非常现场的。 如果我要为一种非常动态的语言设计虚拟机,我会将解释分成两个阶段;

  • 一个生产者阶段,根据需要咨询AST流并将其转换为更有意义的形式(例如,取一个块,决定是立即执行还是存储在某处以备后用)可能会引入新种类的令牌。 本质上你可以恢复在这里解析时可能丢失的上下文敏感信息。

  • 消费者阶段从1中获取生成的流,并像其他机器一样盲目地执行它。 如果你想让它变得像,你可以推存储的流并且用它来完成,而不是跳过指令指针。

  • 正如你所说的,只是模仿该死的处理器如何以另一种方式工作,并没有达到你所需要的任何动态性(或任何其他值得该死的特性,如安全性)。 否则,你会编写一个编译器。

    当然,您可以在第1阶段随意添加comlex优化。


    如果你想要的东西真的很快,请尝试使用LLVM。 它可以从高级程序描述中为大多数处理器生成本机代码。 您可以使用自己的汇编语言,也可以跳过汇编阶段生成llvm结构,具体取决于您最方便的选项。

    我不确定它是否是最适合您的问题,但是如果我要执行一些无法与程序其余部分一起编译的性能关键执行代码,那肯定会用到它。


    翻译的重点在于大多数时间都是可移植的。 我能想到的最快的方法就是直接在内存中生成x86代码,就像JIT编译器一样,但是当然,你再也没有解释器了。 你有一个编译器。

    不过,我不确定用汇编编写解释器会给你最好的性能(除非你是汇编大师,而且你的项目的范围非常有限)。 使用更高级的语言可以帮助您专注于更好的算法,例如符号查找和寄存器分配策略。

    链接地址: http://www.djcxy.com/p/72393.html

    上一篇: What is the fastest virtual machine design for x86?

    下一篇: How does the lea instruction interact with esp?