Why is the JVM stack-based and the Dalvik VM register-based?

There are a few attributes of a stack-based VM that fit in well with Java’s design goals:

  1. A stack-based design makes very few
    assumptions about the target
    hardware (registers, CPU features),
    so it’s easy to implement a VM on a
    wide variety of hardware.

  2. Since the operands for instructions
    are largely implicit, the object
    code will tend to be smaller. This
    is important if you’re going to be
    downloading the code over a slow
    network link.

Going with a register-based scheme probably means that Dalvik’s code generator doesn’t have to work as hard to produce performant code. Running on an extremely register-rich or register-poor architecture would probably handicap Dalvik, but that’s not the usual target – ARM is a very middle-of-the-road architecture.


I had also forgotten that the initial version of Dalvik didn’t include a JIT at all. If you’re going to interpret the instructions directly, then a register-based scheme is probably a winner for interpretation performance.

Leave a Comment