4 Stimmen

Welches ist das schnellste virtuelle Maschinendesign für x86?

Ich werde eine virtuelle Maschine in x86 implementieren und ich frage mich, welche Art von Design die besten Ergebnisse liefern würde. Worauf sollte ich mich konzentrieren, um das Optimum herauszuholen? Ich werde die gesamte virtuelle Maschine in x86-Assembler implementieren.

Ich habe nicht viele Anweisungen, und ich kann ihre Form wählen. Die Anweisungen werden direkt in die Syntax von Smalltalk in Blöcken projiziert. Ich gebe das Anweisungsdesign an, an das ich gedacht habe:

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

Die Art von VM, an die ich gedacht habe:

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.

Fragen Sie nicht, warum ich noch eine weitere Implementierung einer virtuellen Maschine brauche. Interpretationsroutinen sind keine Lagerware, die man einfach mitnimmt, wenn man sie braucht. Die meisten virtuellen Maschinen, die Sie anderswo vorschlagen, sind auf Portabilität ausgerichtet, was auf Kosten der Leistung geht. Mein Ziel ist nicht die Portabilität, mein Ziel ist die Leistung.

Der Grund, warum dieser Interpreter überhaupt benötigt wird, ist, dass Smalltalk-Blöcke am Ende nicht auf die gleiche Weise interpretiert werden:

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
]

Ich brauche den wirklichen Nutzen der Interpretationsroutinen, d.h. die Wahl des Kontextes, in dem das Programm zu lesen ist. Natürlich sollte ein guter Compiler die meiste Zeit nur die offensichtlichen Fälle kompilieren wie: 'ifTrue:ifFalse' oder 'whileTrue:', oder das Listenbeispiel. Die Notwendigkeit eines Interpreters verschwindet nicht einfach, weil man immer auf einen Fall stoßen kann, in dem man nicht sicher sein kann, dass der Block die erwartete Behandlung erfährt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X