What always amazes me about all this virtual machine talk: why don't these people look at where virtual machines have actually been used for a long time before implementing such things? I mean, Smalltalk has had a virtual machine since its existence and since the mid-80s a highly efficient garbage collector as well as a whole range of advanced features. Same with Common Lisp implementations - many use internally portable code based on virtual machines. There's also corresponding experience with closures and continuations. It's not as if these topics were so terribly new - on the contrary, they're pretty old hat.
But instead of looking at where there are not only working implementations, but also the full source code for study, people prefer to tinker with their own stuff and at best refer to the JVM or the .NET CLR - two of the most pathetic implementations of virtual machines that exist (among other things because their designers make exactly the same mistake and think they know better and don't need to look at the code and ideas of old hackers).
What's really ridiculous is this continuations and closure debate. Both are essential features of Scheme and addressed in all Scheme implementations, because nothing would work without them. And many of them have highly efficient implementations for virtual machines or real CPUs.
People, please look at what others have already done decades ago before you think you have the great new idea. Or don't be too surprised if you're not taken very seriously by those who know these old systems ...
At Squawks of the Parrot there's the original article.