我将在 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: ',或列表示例。对口译员的需求不仅会消失,因为您总是可能遇到无法确定该块得到您期望的治疗的情况。