

TinyVM 1.0 released; adds 16 lines of code, registers, a VM stack and more - davedx
https://github.com/GenTiradentes/tinyvm/tree/v1.0

======
maaku
This appears to be very heavily influenced by x86. Why would a VM built in
2011 use an ISA stuck in the 80's?

EDIT: I'm not trolling, I'm seriously wondering. There's plenty of literature
out there on the advantages of three-operand instructions, large register
spaces, and RISC-type instructions. Was there a reason that x86 was used as a
basis?

~~~
aninteger
I'm not the author but I guess there would be a few reasons:

1\. Familiarity with x86 assembly. It's probably the assembly language that
the majority of people who write assembly language know. 6502 probably being
2nd place

2\. Easier to port small x86 assembly programs

3\. Even if it's stuck in the 80's it's the most widely used assembly language
and there are dedicated online communities of people still writing x86 asm
today in 2011.

~~~
xyzzyz
_2\. Easier to port small x86 assembly programs_

I seriously doubt that people will do it. If people write assembly, they
mostly do it either because of speed, or because it's impossible to do in any
other way. None of the reason is relevant in context of VM assembly, which is
usually meant to be a compiler's target.

~~~
carbonica
Yeah - the vast majority of x86 assembly written today is written to take
advantage of specialized instructions that aren't available in this VM.

------
RodgerTheGreat
If you find TinyVM interesting, one of my own projects might be worth checking
out: <https://github.com/JohnEarnest/Mako/blob/master/MakoVM.java>

It's a stack-oriented VM, similarly designed to be as simple as possible, but
my goal was to create something like an idealized game console. Thus, I have
basic graphics support and gamepad input. The project includes a compiler for
a dialect of Forth and a big pile of example code.

~~~
chrisb
In a slightly similar vein, you might enjoy looking at my Dot Net Anywhere
project:
[https://github.com/chrisdunelm/DotNetAnywhere/tree/master/dn...](https://github.com/chrisdunelm/DotNetAnywhere/tree/master/dna)
(or <http://www.dotnetanywhere.org> for an easy to use zip download that will
load and compile directly on Windows)

It is an almost complete .NET2.0 CIL interpreter, so it can run your exe's
compiled from C#/VB/etc...

I'm not sure it has much practical application, but it was certainly fun to
write, and I learnt a huge amount about interpreters and how .NET works.

PS Lots of bugs, a memory leak, an incomplete base class library, etc... so
don't try to use this for anything serious!

------
spitfire
It's nice to see the huge if/then waterfall has been replaced with a switch
statement. That was quite the code smell there.

I'm still as impressed as when I first saw it. Small, simple and elegant. Neat
little project.

------
jws
Most files have a last commit message of: _Nothing left can be taken away._
That pretty much sums up the target for this VM.

Instruction dispatching and malloc handling were discussed here last month in
<http://news.ycombinator.com/item?id=2722383> (Instruction dispatch is now a
_switch_ † instead of chain of _if_ statements, _malloc()_ results are still
unchecked.)

␄

† The _switch_ was slower in my benchmarks last time, I don't have time to
check this time.

~~~
jsherer
How many of the previous discussion points / issues have been changed in this
release? Just the switch?

------
parbo
If you want to program a VM and have some fun at the same time, do the 2006
ICFP contest: <http://www.boundvariable.org/task.shtml>

You have to implement a VM and run the provided program. This will give you
access to the actual problem set.

------
DanielHimmelein
Some more resources about virtual machines and a little TinyVM overview:
<http://himmele.blogspot.com/2011/08/virtual-machines.html>

------
joeyespo
This is one of those projects I've always wanted to do myself, but never
actually spent the time to get it right. Looks good.

------
sitkack
TVM has 9 registers, modeled after x86 registers

~~~
maaku
But in hardware at least, the x86 registers have been found quite limiting on
software and performance. That's why AMD64 doubles the number of general
purpose registers. Does anyone know if there is research into the effects of
register counts on VMs?

~~~
carbonica
> But in hardware at least, the x86 registers have been found quite limiting
> on software and performance.

While the doubled register count makes a big difference - especially with the
new x86-64 calling convention - register renaming and hidden registers do a
lot on x86 to mitigate the lack of general purpose registers. You don't need
more than 8 registers to get the benefits of having more than 8.

~~~
maaku
Which basically amounts to the same thing. "x86" processors today are actually
RISC(-like) processors with large register spaces and three-operand
instructions, because that hardware can be made faster, even with the
necessary silicon x86->RISC translator so software sees an x86 processor.

But to my knowledge, compatibility with legacy compiled software is not a
practical issue for VM's. And even if it were, this isn't a compatible
implementation of x86 anyway. So what then is the reasoning for this choice?

~~~
carbonica
It's close to the same thing, but having more named registers does provide
more optimization opportunities. It shouldn't be completely ignored as a good
thing.

I mentioned function calls because that's a boundary when an optimizer -
either in-processor or in-compiler - is often forced to use memory and not
registers. The big-N-register "register window" of RISC processors kicks this
problem's ass. But with aggressive inlining already common, these boundaries
don't come up as often as you'd think. So the x86-64 calling convention does a
pretty damn good job too.

Edit: by the way, I guess I haven't really commenting on TinyVM one way or the
other when I responded to you. You're absolutely right and the compatibility
is not necessary at all. I think the register count limitation especially is
just silly. I pointed out in a different thread that they could double their
register count and they'd still fit in a single cache line... they even
already have a naming convention (r08-r15) they can hijack.

------
diminish
i ll make a de-pull request, to remove more.

~~~
swah
I enjoyed your comment, but will downvote you because I was downvoted when
doing similar jokes.

